2021년 6월 22일 화요일

Qiskit tutorial - 2. Visualization

이 글은 Qiskit 공식 홈페이지에서 제공하는 튜토리얼을 직접 해보고 요약하는 글입니다. 원문은 [1]이며, Anaconda 의 Jupyter notebook 을 사용하는 원문과 달리 순수 python 으로 실행 가능하도록 소스코드를 수정하여 원문과 차이가 있습니다. 제가 작성한 소스코드는 [2]에 공개합니다.

2.1. 히스토그램 그리기

먼저 다음과 같이 기본 import 를 선언한다.

코드2.1. 기본 import 

실제 장치 또는 qasm_simulator 에서 실행되는 양자회로의 데이터를 시각화하기 위해 간단한 함수 plot_histogram(data) 이 지원된다. 이 함수를 사용하기 위해 2-큐비트 벨(Bell) 상태를 작성한다.

코드2.2. Bell state 생성

그림2.1. Bell state 생성 코드 실행 결과

그리고 plot_histogram 함수를 실행하면 다음과 같이 나온다.

코드2.3. plot_histogram 실행

그림2.2. plot_histogram 실행 결과

2.1.1. 히스토그램 그래프 옵션

plot_histogram() 은 출력 그래프를 조정하는 몇 가지 옵션을 가지고 있다. 첫 번째 옵션은 legend kwarg(keyword argument, 이후 키인자)이다. 이 옵션은 실행에 대한 레이블을 제공하는 데 사용된다. 이는 각 실행의 결과에 레이블을 다는 데 사용되는 문자열의 목록을 취하며, 보통 하나의 히스토그램에 여러 개의 실행 결과를 그릴 때 유용하게 사용된다. sort 키인자는 히스토그램의 막대들이 그려지는 순서를 조정할 때 사용된다. asc 로 오름차순을 명시하거나, dsc로 내림차순을 명시할 수 있다. number_to_keep 키인자는 보여줄 항목의 수를 나타내는 정수를 취하고, 이 숫자 외의 나머지 항목들은 나머지(rest)로 명시되는 하나의 막대로 그룹지어진다. color 키인자는 각 실행에 대한 막대들의 색들을 명시하기 위해서 색을 명시하는 문자열이나 문자열의 목록을 취한다. bar_labels 키인자는 레이블이 막대의 위에 위치할지의 여부를 조정할 수 있다. 

코드2.4. 범례와 데이터 레이블 추가

그림2.3. 범례 추가 결과(코드 36번 라인)

그림2.4. 범례, 정렬, 크기, 색상 추가 결과(코드 48번 라인)

2.1.2. plot_histogram() 에서 출력된 시각화 사용하기

plot_histogram() 함수를 사용할 때 표현된 시각화는 matplotlib.Figure 객체로 반환된다. 주피터 노트북은 이 반환 형식을 이해하고, 노트북에서 볼 수 있도록 출력을 하지만, 주피터 외부에서 실행할 때는 자동으로 출력되지 않는다. 설정한 matplotlib 처리가 쌍방향적이라 가정하면, 새로운 창에 이미지를 나타내기 위해서는 plot_histogram() 에서 반환되는 객체에 .show() 를 호출할 수 있다. 다른 방법으로는 .savefig('out.png') 를 호출하여 그림을 out.png 파일로 저장할 수 있다. savefig() 메소드는 출력 위치를 입력으로 받고, 사용자가 원하는 위치와 파일 이름을 지정할 수 있다.

2.2. 상태 그리기

많은 경우에 양자 컴퓨터의 상태를 확인하길 원할 것이다. 디버깅을 위한 확인이 될 수 있다. 예를들어 시뮬레이션을 하거나 단층 촬영(state tomography)의 상태를 가지고 있고, 그 양자 상태를 시각화하는 것이라고 가정해보자. 이 경우에는 많은 양의 연산이 필요하다. 따라서 작은 양자 시스템의 상태만을 보기를 권한다. 양자 상태를 다른 형태로 시각화하는 여러 함수가 존재한다.

  • plot_state_city(quantum_state)
  • plot_state_qsphere(quantum_state)
  • plot_state_paulivec(quantum_state) 
  • plot_state_hinton(quantum_state)
  • plot_bloch_multivector(quantum_state)

양자 상태는 상태 행렬 ρ (에르미트 행렬) 이나 상태 벡터 |ψ〉 (복소 벡터) 중에 하나이다. 상태 행렬은 다음으로 상태벡터와 관련이 된다.

ρ = |ψ〉〈ψ|

그리고 일반적인 혼합 상태(mixed state)도 상태 벡터의 양의 합으로 나타낼 수 있다.

함수가 시각화할 수 있는 것들은 다음과 같다.

  • plot_state_city: 상태 행렬의 실수와 허수 부분이 도시의 건물과 같은 형태로 그려지는 양자 상태를 나타내는 표준적인 시각화

  • plot_state_qsphere: 상태 벡터의 진폭과 위상이 구체에 그려지는 양자 상태로 키스킷에 특화된 시각화. 진폭은 화살표의 굵기이며, 위상은 색으로 나타난다. 혼합된 상태에 대해서는 각 컴포넌트에 대해서 다른 qsphere 를 보여준다.

  • plot_state_paulivec: 아래 수식의 기저를 파울리(Pauli) 연산자로 사용하는 상태 행렬을 나타낸다.


  • plot_state_hinton: city 형태로 나타내는 것은 동일하지만, 요소의 크기는 행렬 요소의 값을 나타낸다.

  • plot_bloch_multivector: 양자 상태를 하나의 큐비트 공간에 투영하고, 블로흐 구체에 시각화한다.
코드2.5. 양자 상태 도식

그림2.5. plot_state_city() 실행 결과(코드 53번 라인)

그림2.6. plot_state_hinton() 실행 결과(코드 56번 라인)

그림2.7. plot_state_qsphere() 실행 결과(코드 59번 라인)

그림2.8. plot_state_paulivec() 실행 결과(코드 62번 라인)

그림2.9. plot_bloch_multivector() 실행 결과(코드 65번 라인)

2.2.1. 상태 그리기 함수를 이용할 때 옵션

양자 상태를 시각화하는 여러 함수는 그래프가 그려지는 방법을 조정하는 여러 옵션을 제공한다. 사용할 수 있는 옵션은 사용중인 함수에 따라 다르다.

2.2.1.1. plot_state_city() 옵션

  • title(str): 그림 제목을 나타내는 문자열
  • figsize(tuple): 인치로 나타낸 그림 크기 (넓이, 높이)
  • color(list): 구성 요소의 실수와 허수 부분에 대한 색을 나타내는 길이=2 의 목록

2.2.1.2. plot_state_hinton() 옵션

  • title(str): 그림 제목을 나타내는 문자열
  • figsize(tuple): 인치로 나타낸 그림 크기(넓이, 높이)

2.2.1.3. plot_state_paulivec() 옵션

  • title(str): 그림 제목을 나타내는 문자열
  • figsize(tuple): 인치로 나타낸 그림 크기(넓이, 높이)
  • color(list 또는 str): 기대 값의 막대의 색

2.2.1.4. plot_state_qsphere() 옵션

  • figsize(tuple): 인치로 나타낸 그림 크기(넓이, 높이)

2.2.1.5. plot_bloch_multivector() 옵션

  • title(str): 그림 제목을 나타내는 문자열
  • figsize(tuple): 인치로 나타낸 그림 크기(넓이, 높이)

코드2.6. 양자 상태 도식 함수의 옵션

그림2.10. plot_state_city() 의 옵션 실행 결과(코드 70번 라인)

그림2.11. plot_state_hinton() 의 옵션 실행 결과(코드 73번 라인)

그림2.12. plot_state_paulivec() 의 옵션 실행 결과(코드 76번 라인)

그림.2.13. plot_bloch_multivector() 의 옵션 실행 결과(코드 79번 라인)

2.2.2. 양자 상태를 그리는 함수의 출력 사용하기

양자 상태를 그리는 함수는 도식하는 시각화의 결과로 matplotlib.Figure 를 반환한다. 주피터 노트북은 반환 형식을 이해하고, 노트북에 자동으로 그린다(렌더링). 하지만 주피터 외부에서 구동할 때는 이 기능이 자동으로 실행되지 않는다. 그러나 matplotlib.Figure 클래스는 시각화를 출력하고 저장하는 함수들을 가지고 있다. 설정한 matplotlib 처리 장치가 양방향적이라면 새로운 창에 이미지를 나타내기 위해서 .show() 를 이용하여 호출할 수 있다. 다른 방법으로는 .savefig('out.png')를 호출하여 그림을 out.png 로 현재 작업중인 디렉토리에 저장할 수 있다. savefig() 메소드는 출력 위치를 입력으로 받고, 사용자가 원하는 위치와 파일 이름을 조정할 수 있다.

2.3. 블로흐(Bloch) 벡터 그리기

양자 시스템을 그리는 표준적인 방법은 블로흐 벡터를 사용하는 것이다. 이는 하나의 큐비트에 대해서만 동작하고, 블로흐 벡터를 입력으로 받는다.

블로흐 벡터는 [x = Tr[Xρ], y = Tr[Yρ], z = Tr[Zρ]] 로 정의되고, 여기서 X, Y, Z 는 하나의 큐비트에 대한 파울리 연산자이고, ρ 는 상태 행렬이다.

2.3.1. plot_bloch_vector() 의 옵션들

  • title(str): 그림 제목을 나타내는 문자열
  • figsize(tuple): 인치로 나타낸 그림 크기(넓이, 높이)


코드2.7. 블로흐 벡터 도식

그림2.14. 옵션이 없는 블로흐 벡터 도식 결과(코드 84번 라인)

그림2.15. 옵션이 추가된 블로흐 벡터 도식 결과(코드 88번 라인)


[1] 원문:
https://qiskit.org/documentation/tutorials/circuits/2_plotting_data_in_qiskit.html
[2] 내 코드:
https://github.com/sungmin-net/python-qiskit-tutorials/blob/main/tutorial02-Circuits-QiskitVisualization.py

댓글 없음:

댓글 쓰기