K idZdgZddlmZddlmZmZmZmZm Z m Z m Z m Z m Z mZddlmZdZdZdZd Zd Zd Zd Zd ZdZdZGddZy)a qasm.py - Functions to parse a set of qasm commands into a SymPy Circuit. Examples taken from Chuang's page: https://web.archive.org/web/20220120121541/https://www.media.mit.edu/quanta/qasm2circ/ The code returns a circuit and an associated list of labels. >>> from sympy.physics.quantum.qasm import Qasm >>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1') >>> q.get_circuit() CNOT(1,0)*H(1) >>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1') >>> q.get_circuit() CNOT(1,0)*CNOT(0,1)*CNOT(1,0) Qasm)prod) HCNOTXZCGateCGateSSWAPSTCPHASE)Mzc.t|jSN)r splitlines)liness `/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/physics/quantum/qasm.py read_qasmrs !!# $$c@tt|jSr)ropen readlines)filenames rread_qasm_filers h))+ ,,rc||z dz S)zReorder qubit indices from largest to smallest. >>> from sympy.physics.quantum.qasm import flip_index >>> flip_index(0, 2) 1 >>> flip_index(1, 2) 0 )ins r flip_indexr!"s Q3q5Lrc6d|vr|S|jddS)zRemove everything following comment # characters in line. >>> from sympy.physics.quantum.qasm import trim >>> trim('nothing happens here') 'nothing happens here' >>> trim('something #happens here') 'something ' #r)split)lines rtrimr&-s# $ ::c?1 rcNt|}t|j||S)zGet qubit labels from the rest of the line,and return indices >>> from sympy.physics.quantum.qasm import get_index >>> get_index('q0', ['q0', 'q1']) 1 >>> get_index('q1', ['q0', 'q1']) 0 )lenr!index)targetlabelsnqs r get_indexr-:s# VB fll6*B //rc@|Dcgc]}t||c}Scc}wr)r-)targetsr+ts r get_indicesr1Fs*1 2QIa 22 2sc#ZK|D]"}t|}|jr|$ywr)r&isspace)argsr%s rnonblankr5Is4Dz <<>    s)+c|j}dj|dd}t|d|jdDcgc]}|jc}fScc}w)N rr,)r$join fixcommandstrip)r%wordsrestss r fullsplitr?QsQ JJLE 88E!"I D eAh TZZ_!E!'')!E EE!EsA cjdg}|j}|D]}|j|d}|dk(ry|S)zwFix Qasm command names. Remove all of forbidden characters from command c, and replace 'def' with 'qdef'. -defqdef)lowerreplace)cforbidden_characterschars rr:r:VsE  5  A$  IIdB  Ez HrcN|jdd}|jdd}|S)zReplace explicit quotes in a string. >>> from sympy.physics.quantum.qasm import stripquotes >>> stripquotes("'S'") == 'S' True >>> stripquotes('"S"') == 'S' True >>> stripquotes('S') == 'S' True "rB')rF)r>s r stripquotesrMds) #rA #rA HrceZdZdZdZdZdZdZdZddZ d Z d Z d Z d Z d ZdZdZdZdZdZdZdZdZdZdZdZdZy)raVClass to form objects from Qasm lines >>> from sympy.physics.quantum.qasm import Qasm >>> q = Qasm('qubit q0', 'qubit q1', 'h q0', 'cnot q0,q1') >>> q.get_circuit() CNOT(1,0)*H(1) >>> q = Qasm('qubit q0', 'qubit q1', 'cnot q0,q1', 'cnot q1,q0', 'cnot q0,q1') >>> q.get_circuit() CNOT(1,0)*CNOT(0,1)*CNOT(1,0) chi|_g|_g|_i|_|j|||_yr)defscircuitr+initsaddkwargs)selfr4rTs r__init__z Qasm.__init__~s2    $ rct|D]}t|\}}|jj|r|jj|}|j |}t |dk(r%|j j||d|j j||dd|dt||rt||}||td|zy)Nrrz!Function %s not defined. Skipping) r5r?rPgetindicesr(rQappendhasattrgetattrprint)rUrr%commandr=functionrZs rrSzQasm.addsUO ED%dOMGTyy}}W%99==1,,t,w<1$LL''(<=LL''"wr{(KLw'"41$9GCD Erc>tt|jSr)rreversedrQrUs r get_circuitzQasm.get_circuitsHT\\*++rc>tt|jSr)listrbr+rcs r get_labelszQasm.get_labelssHT[[)**rcddlm}|j|j}}||t |||j y)Nr) CircuitPlot)r+rR)!sympy.physics.quantum.circuitplotrirdrgr(rR)rUrirQr+s rplotz Qasm.plots4A**,doo.?GS[tzzJrNc^|jj||r||j|<yyr)r+r[rR)rUarginits rqubitz Qasm.qubits% 3 4C4rc.t||jSr)r1r+rUr4s rrZz Qasm.indicess4--rc.t||jSr)r-r+rUrms rr)z Qasm.indexsdkk**rcyrrrqs rnopzQasm.nops rcj|jjt|j|yr)rQr[rr)rss rxzQasm.x! Adjjo./rcj|jjt|j|yr)rQr[rr)rss rzzQasm.zrxrcj|jjt|j|yr)rQr[rr)rss rhzQasm.hrxrcj|jjt|j|yr)rQr[r r)rss rr>zQasm.srxrcj|jjt|j|yr)rQr[r r)rss rr0zQasm.trxrcj|jjt|j|yr)rQr[rr)rss rmeasurez Qasm.measures! Btzz#/0rch|jjt|j||gyr)rQr[rrZrUa1a2s rcnotz Qasm.cnot& D$,,Bx"89:rch|jjt|j||gyr)rQr[r rZrs rswapz Qasm.swaprrch|jjt|j||gyr)rQr[rrZrs rcphasez Qasm.cphases& FDLL"b$:;r0rrrrrrrrrDrrrrrss| E ,+K (.+ 000001;;=5..<rsf&  VVV0%-   03 F    m<m