Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Circuit abstraction #2

Open
kangz12345 opened this issue Apr 30, 2021 · 3 comments
Open

Circuit abstraction #2

kangz12345 opened this issue Apr 30, 2021 · 3 comments
Labels
help wanted Extra attention is needed question Further information is requested

Comments

@kangz12345
Copy link
Collaborator

Multi-qubit gate를 고려한 quantum circuit abstraction을 확정해야 할 것 같은데, @WestGround 현재 어떤 방식으로 작업중이신가요?
단순히 CX 게이트 외에도 Toffoli, swap, barrier, 그리고 custom(user-defined) gate도 지원할 수 있게 해야할 것 같은데 이걸 먼저 정하고 마저 진행하는게 좋지 않을까요?

@kangz12345 kangz12345 added help wanted Extra attention is needed question Further information is requested labels Apr 30, 2021
@ijshj10
Copy link
Owner

ijshj10 commented May 2, 2021

오히려 open qasm 자체를 representation으로 쓰는건 어떨까요? 이쪽이 더 자연스럽게 표현되는것 같아서요.

@kangz12345
Copy link
Collaborator Author

오 저도 비슷한 생각을 했는데 큐빗별로 리스트를 관리하지 않고 open qasm처럼 그냥 각 게이트가 점유하는 큐빗정보를 포함하며 리스트는 하나만 존재하는 게 좋지 않을까 싶습니다. 객체화를 하는게 더 편할 수도 있겠다는 생각을 했어요..!
물론 실제 구현을 위해서는 화면에 회로를 그리고, 드래그 액션과 상호작용할 수 있도록 하는 방법을 좀 더 고민해야할 것 같아요.
생각을 좀 더 구체화해서 나중에 다시 정리해보겠습니다.

@kangz12345
Copy link
Collaborator Author

아래와 같이 생각을 구체화해보았는데, 제대로 동작할지, 구현에 어려움이 있을지 의견 부탁드립니다.

1. 자료구조

  • Gate 객체의 1차원 배열: e.g. [Gate('h', (q[0])), Gate('cx', (q[0], q[2]))].
  • 각각의 Gate 객체가 연결된 큐빗 정보를 담고 있음.
  • Custom gate 및 custom qubit (IBM quantum composer의 OpenQASM을 수정하여 여러 이름의 qubit을 만들 수 있음)에도 적용 가능
  • OpenQASM과 거의 1:1 대응이 되므로 서로 변환이 편리.
  • GatePrototype 등의 개념을 만들어서 기본 게이트들은 미리 정의해두고, custom gate에 대해서도 프로토타을 만들어 사용할 수 있게. 이는 마치 factory처럼 해당 특성(게이트 이름, 필요한 큐빗 정보 등)을 가진 Gate 객체를 쉽게 만들어 낼 수 있게 해줌.

2. Rendering

  • 큐빗 렌더링은 완료된 후라고 가정.
  • map 등을 이용해 Gate 배열의 원소들에 대해 차례대로 <g><rect/></g> 태그를 생성.
  • 문제는 x 좌표를 구하는 것인데, 큐빗마다 nextX 등의 정보를 트래킹하면서 다음에 추가될 곳의 x 좌표를 저장하는 배열 혹은 딕셔너리 등을 이용.
  • 추가할 게이트가 이용하는 큐빗들을 토대로, 해당 게이트가 '덮을' 큐빗 interval을 구함(만약 큐빗 0, 2만 쓴다고 해도 큐빗 1을 덮기때문에 [0, 2]의 interval을 점유해야 함).
  • 구한 interval에 속한 모든 큐빗들의 nextX 값중 최대값을 찾아 해당 위치를 x 좌표로 하여 <g><rect/></g> 태그를 생성하고 interval에 속한 모든 큐빗들의 nextX 값을 업데이트.

3. Drag&drop interaction

  • 클릭할 때 어떤 게이트가 선택되었는지는 event의 target 등을 이용해 얻을 수 있을 듯.
  • 클릭된 게이트는 현재 구현된 것과 같이 배열에서 제외.
  • Redering할 때 현재 드래그중인 마우스커서의 좌표가 현재 그리려고 하는 게이트가 점유하는 공간에 포함될 경우, 해당 게이트를 그리기 전에 먼저 현재 드래그중인 게이트를 dashed 스타일로 그림.
  • 이때 그리기만 하면 안되고, 그 순간의 index 등 실제 Gate 배열 안에서 어느 위치였는지 기억해야함.
  • 그런 다음 나머지 게이트들을 마저 그림.
  • Drop한 경우 Gate 배열 안에 기억해뒀던 위치로 insert.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants