├── LICENSE ├── README.md ├── circuit_weaver ├── GruntFile.js ├── PuppeteerRunTests.js ├── PuppeteerScreenshotCircuit.js ├── README_CN.md ├── doc │ ├── MANUAL_amp-display.png │ ├── MANUAL_bloch-display.png │ ├── MANUAL_chance-display.png │ ├── MANUAL_circuit-editing-area.png │ ├── MANUAL_controlled-display.png │ ├── MANUAL_controlled-epr-display.png │ ├── MANUAL_density-display.png │ ├── MANUAL_measurement-types.png │ ├── MANUAL_menu.png │ ├── MANUAL_state-channel-duality.png │ ├── MANUAL_various-displays.png │ ├── README_Demo.gif │ ├── README_Grover.gif │ ├── README_Teleportation.gif │ └── favicon.ico ├── html │ ├── error.partial.html │ ├── export.partial.html │ ├── forge.partial.html │ ├── menu.partial.html │ └── quirk.template.html ├── karma.test.conf.js ├── karma.test_perf.conf.js ├── out │ └── CircuitWeaver.html ├── package.json ├── src │ ├── Config.js │ ├── browser │ │ ├── Clipboard.js │ │ ├── EventUtil.js │ │ ├── HistoryPusher.js │ │ ├── MouseWatcher.js │ │ ├── Polyfills.js │ │ ├── SaveFile.js │ │ └── TouchScrollBlocker.js │ ├── circuit │ │ ├── CircuitComputeUtil.js │ │ ├── CircuitDefinition.js │ │ ├── CircuitEvalContext.js │ │ ├── CircuitShaders.js │ │ ├── CircuitStats.js │ │ ├── Controls.js │ │ ├── CustomGateSet.js │ │ ├── Gate.js │ │ ├── GateCheckArgs.js │ │ ├── GateColumn.js │ │ ├── GateShaders.js │ │ ├── KetShaderUtil.js │ │ ├── KetTextureUtil.js │ │ └── Serializer.js │ ├── draw │ │ ├── CachablePainting.js │ │ ├── GateDrawParams.js │ │ ├── GatePainting.js │ │ ├── MathPainter.js │ │ ├── Painter.js │ │ └── WidgetPainter.js │ ├── fallback.js │ ├── gates │ │ ├── AllGates.js │ │ ├── AmplitudeDisplay.js │ │ ├── ArithmeticGates.js │ │ ├── BitCountGates.js │ │ ├── BlochSphereDisplay.js │ │ ├── ComparisonGates.js │ │ ├── Controls.js │ │ ├── CountingGates.js │ │ ├── CycleBitsGates.js │ │ ├── Debug_ErrorInjectionGate.js │ │ ├── DensityMatrixDisplay.js │ │ ├── Detector.js │ │ ├── ExponentiatingGates.js │ │ ├── FourierTransformGates.js │ │ ├── HalfTurnGates.js │ │ ├── Impossible_UniversalNotGate.js │ │ ├── IncrementGates.js │ │ ├── InputGates.js │ │ ├── InterleaveBitsGates.js │ │ ├── Joke_ImaginaryGate.js │ │ ├── Joke_MysteryGate.js │ │ ├── Joke_NeGate.js │ │ ├── Joke_ZeroGate.js │ │ ├── MeasurementGate.js │ │ ├── ModularAdditionGates.js │ │ ├── ModularIncrementGates.js │ │ ├── ModularMultiplicationGates.js │ │ ├── ModularMultiplyAccumulateGates.js │ │ ├── MultiplicationGates.js │ │ ├── MultiplyAccumulateGates.js │ │ ├── ParametrizedRotationGates.js │ │ ├── PhaseGradientGates.js │ │ ├── PivotFlipGates.js │ │ ├── PostSelectionGates.js │ │ ├── PoweringGates.js │ │ ├── ProbabilityDisplay.js │ │ ├── QuarterTurnGates.js │ │ ├── ReverseBitsGate.js │ │ ├── SampleDisplay.js │ │ ├── SpacerGate.js │ │ ├── SwapGateHalf.js │ │ ├── VariousXGates.js │ │ ├── VariousYGates.js │ │ ├── VariousZGates.js │ │ └── XorGates.js │ ├── issues.js │ ├── main.js │ ├── math │ │ ├── Axis.js │ │ ├── Complex.js │ │ ├── FormulaParser.js │ │ ├── Matrix.js │ │ ├── Point.js │ │ └── Rect.js │ ├── ui │ │ ├── DisplayedCircuit.js │ │ ├── DisplayedInspector.js │ │ ├── DisplayedToolbox.js │ │ ├── Hand.js │ │ ├── clear.js │ │ ├── exports.js │ │ ├── forge.js │ │ ├── menu.js │ │ ├── sim.js │ │ ├── title.js │ │ ├── undo.js │ │ └── url.js │ └── webgl │ │ ├── ShaderCoders.js │ │ ├── ShaderCoders_Base.js │ │ ├── ShaderCoders_intoBytes.js │ │ ├── ShaderCoders_intoFloats.js │ │ ├── Shaders.js │ │ ├── WglArg.js │ │ ├── WglConfiguredShader.js │ │ ├── WglContext.js │ │ ├── WglMortalValueSlot.js │ │ ├── WglShader.js │ │ ├── WglTexture.js │ │ ├── WglTexturePool.js │ │ ├── WglTextureTrader.js │ │ └── WglUtil.js ├── test │ ├── CircuitOperationTestUtil.js │ ├── KarmaTestRunner.test.js │ ├── TestUtil.js │ ├── circuit │ │ ├── CircuitComputeUtil.test.js │ │ ├── CircuitDefinition.test.js │ │ ├── CircuitShaders.test.js │ │ ├── CircuitStats.test.js │ │ ├── Controls.test.js │ │ ├── Gate.test.js │ │ ├── GateColumn.test.js │ │ ├── GateShaders.test.js │ │ ├── KetShaderUtil.test.js │ │ └── Serializer.test.js │ ├── gates │ │ ├── AllGates.test.js │ │ ├── AmplitudeDisplay.test.js │ │ ├── ArithmeticGates.test.js │ │ ├── BitCountGates.test.js │ │ ├── ComparisonGates.test.js │ │ ├── Controls.test.js │ │ ├── CycleBitsGates.test.js │ │ ├── DensityMatrixDisplay.test.js │ │ ├── Detector.test.js │ │ ├── ExponentiatingGates.test.js │ │ ├── FourierTransformGates.test.js │ │ ├── Impossible_UniversalNotGate.test.js │ │ ├── IncrementGates.test.js │ │ ├── InputGates.test.js │ │ ├── InterleaveBitsGates.test.js │ │ ├── ModularAdditionGates.test.js │ │ ├── ModularIncrementGates.test.js │ │ ├── ModularMultiplicationGates.test.js │ │ ├── ModularMultiplyAccumulateGates.test.js │ │ ├── MultiplicationGates.test.js │ │ ├── MultiplyAccumulateGates.test.js │ │ ├── ParametrizedRotationGates.test.js │ │ ├── PhaseGradientGates.test.js │ │ ├── PivotFlipGates.test.js │ │ ├── ProbabilityDisplay.test.js │ │ ├── SampleDisplay.test.js │ │ └── XorGates.test.js │ ├── math │ │ ├── Axis.test.js │ │ ├── Complex.test.js │ │ ├── Matrix.test.js │ │ ├── Point.test.js │ │ └── Rect.test.js │ ├── ui │ │ ├── DisplayedCircuit.test.js │ │ ├── MathPainter.test.js │ │ ├── Painter.test.js │ │ ├── WidgetPainter.test.js │ │ └── forge.test.js │ └── webgl │ │ ├── ShaderCoders.test.js │ │ ├── ShaderCoders_Base.test.js │ │ ├── ShaderCoders_intoBytes.test.js │ │ ├── ShaderCoders_intoFloats.test.js │ │ ├── Shaders.test.js │ │ ├── WglArg.test.js │ │ ├── WglShader.test.js │ │ ├── WglTexture.test.js │ │ └── WglTexturePool.test.js └── test_perf │ ├── CircuitStats.perf.js │ ├── DisplayedInspector.perf.js │ ├── KarmaTestRunner.perf.js │ ├── TestPerfUtil.js │ └── test_page.template.html ├── quantum_ai ├── QUnet.py ├── QVC.py ├── TransferLearning.py ├── hybrid.py └── qae.py ├── quantum_algorithm ├── AmplitudeAmplification.py ├── DJ_1.py ├── DJ_2.py ├── DJ_3.py ├── Grover_1.py ├── Grover_2.py ├── HHLDemo.py ├── HadamardTest.py ├── QFTDemo.py ├── QMath.py ├── QPEDemo.py ├── SWAPTest.py ├── ShorDemo.py └── Superposition.py ├── quantum_ml ├── fermion │ ├── fermion_init.py │ ├── fermion_math.py │ └── var.py ├── kmeans.py ├── pauli │ ├── getMaxIndex.py │ ├── pauli_init.py │ ├── pauli_math.py │ └── remapQubitIndex.py └── qaoa.py ├── quantum_qiskit_finance ├── 00_amplitude_estimation.py ├── 01_portfolio_optimization.py ├── 02_portfolio_diversification.py ├── 03_european_call_option_pricing.py ├── 04_european_put_option_pricing.py ├── 05_bull_spread_pricing.py ├── 06_basket_option_pricing.py ├── 07_asian_barrier_spread_pricing.py ├── 08_fixed_income_pricing.py ├── 09_credit_risk_analysis.py └── 10_qgan_option_pricing.py ├── quantum_qpanda ├── basic_program │ ├── 0_classes.py │ ├── 10_RYGate.py │ ├── 11_RZGate.py │ ├── 12_CNOTGate.py │ ├── 13_CRGate.py │ ├── 14_SWAPGate.py │ ├── 15_ToffoliGate.py │ ├── 1_interface.py │ ├── 2_ measure.py │ ├── 3_ pmeasure.py │ ├── 4_circuit.py │ ├── 5_HGate.py │ ├── 6_XGate.py │ ├── 7_YGate.py │ ├── 8_ZGate.py │ └── 9_RXGate.py ├── components │ ├── 0_PauliOperator.py │ ├── 1_FermionOperator.py │ └── 2_Optimizer.py ├── prog_info │ ├── 0_NodeIter.py │ ├── 0_NodeIter_reverse.py │ ├── 10_Qubit_Rb.py │ ├── 11_Gate_Xeb.py │ ├── 1_Gate_Counter.py │ ├── 2_Clock_Cycle.py │ ├── 3_Get_Matrix.py │ ├── 4_Match_Topology.py │ ├── 5_Adjacent_Qgate_Type.py │ ├── 6_Is_Swappable.py │ ├── 7_Supported_Qgate_Type.py │ ├── 8_Print_Qcircuit.py │ ├── 9_Quantum_Volume.py │ └── test_cir_draw.png ├── tools │ ├── 0_Circuit_Optimizer.py │ ├── 1_Fill_Qprog_By_I.py │ ├── 2_Matrix_Decompose.py │ └── test_cir_draw.png └── vqc │ ├── 0_Var.py │ ├── 1_VQC_VGQ.py │ └── 2_Optimizer.py ├── 量子计算【编程篇】 ├── 第1章 编程基础.pdf ├── 第2章 编程进阶.pdf ├── 第3章 常用工具接口.pdf ├── 第4章 组件-算符、优化算法.pdf └── 第5章 VQC-变量、可变量子门.pdf └── 量子计算【量子金融】 ├── 第10章 固定收益定价.pdf ├── 第11章 信用风险分析.pdf ├── 第12章 QGAN期权定价.pdf ├── 第1章 量子金融概要.pdf ├── 第2章 量子振幅估计.pdf ├── 第3章 投资组合优化.pdf ├── 第4章 分散投资.pdf ├── 第5章 欧式看涨期权定价.pdf ├── 第6章 欧式看跌期权定价.pdf ├── 第7章 牛市套利.pdf ├── 第8章 一篮子期权 (Basket Options).pdf └── 第9章 亚式障碍期权(Asian barriers options).pdf /README.md: -------------------------------------------------------------------------------- 1 |
9 |10 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /quantum_algorithm/AmplitudeAmplification.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | from numpy import pi 3 | 4 | if __name__ == "__main__": 5 | 6 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 7 | qvec = machine.qAlloc_many(1) 8 | prog = pq.create_empty_qprog() 9 | 10 | # 构建量子程序 11 | prog.insert(pq.RY(qvec[0], pi/3)) 12 | # prog.insert(pq.Z(qvec[0])) 13 | prog.insert(pq.RY(qvec[0], pi*2/3)) 14 | 15 | # 对量子程序进行概率测量 16 | result = pq.prob_run_dict(prog, qvec, -1) 17 | pq.destroy_quantum_machine(machine) 18 | 19 | # 打印测量结果 20 | for key in result: 21 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/DJ_1.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << H(qubits[0]) << X(qubits[0]) << H(qubits[0])\ 10 | << measure_all(qubits, cbits) 11 | 12 | # 量子程序运行1000次,并返回测量结果 13 | result = run_with_configuration(prog, cbits, 1000) 14 | print(result) 15 | finalize() -------------------------------------------------------------------------------- /quantum_algorithm/DJ_2.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << H(qubits[0]) \ 10 | << X(qubits[1]) << H(qubits[1]) \ 11 | << CNOT(qubits[1], qubits[0]) \ 12 | << H(qubits[0])\ 13 | << H(qubits[1]) \ 14 | << measure_all(qubits, cbits) 15 | 16 | # 量子程序运行1000次,并返回测量结果 17 | result = run_with_configuration(prog, cbits, 1000) 18 | print(result) 19 | finalize() -------------------------------------------------------------------------------- /quantum_algorithm/DJ_3.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << H(qubits[0]) \ 10 | << X(qubits[1])<< H(qubits[1]) \ 11 | << CNOT(qubits[1], qubits[0]) \ 12 | << X(qubits[0]) << H(qubits[0])\ 13 | << H(qubits[1]) \ 14 | << measure_all(qubits, cbits) 15 | 16 | # 量子程序运行1000次,并返回测量结果 17 | result = run_with_configuration(prog, cbits, 1000) 18 | print(result) 19 | finalize() -------------------------------------------------------------------------------- /quantum_algorithm/Grover_1.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | machine = CPUQVM() 5 | machine.initQVM() 6 | x = machine.cAlloc() 7 | data = [0,3,2,1] 8 | measure_qubits = QVec() 9 | 10 | # 构建Grover算法量子线路 11 | grover_cir = Grover(data, x==2, machine, measure_qubits, 1) 12 | cbits = machine.cAlloc_many(len(measure_qubits)) 13 | prog = QProg() 14 | prog << grover_cir << measure_all(measure_qubits, cbits) 15 | 16 | # 量子程序运行1000次,并返回测量结果 17 | result = machine.run_with_configuration(prog, cbits, 1000) 18 | print(result) 19 | finalize() -------------------------------------------------------------------------------- /quantum_algorithm/Grover_2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import pyqpanda as pq 4 | import numpy as np 5 | 6 | if __name__ == "__main__": 7 | 8 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 9 | x = machine.cAlloc() 10 | prog = pq.create_empty_qprog() 11 | 12 | data=[3, 6, 6, 9, 10, 15, 11, 6] 13 | grover_result = pq.Grover_search(data, x==6, machine, 1) 14 | 15 | print(grover_result[1]) -------------------------------------------------------------------------------- /quantum_algorithm/HHLDemo.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | import numpy as np 3 | 4 | if __name__ == "__main__": 5 | A=[1,0,0,1] 6 | b=[0.6,0.8] 7 | result = pq.HHL_solve_linear_equations(A,b,1) 8 | 9 | #打印测量结果 10 | for key in result: 11 | print(key) -------------------------------------------------------------------------------- /quantum_algorithm/HadamardTest.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | 3 | if __name__ == "__main__": 4 | 5 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 6 | cqv = machine.qAlloc_many(1) 7 | tqv = machine.qAlloc_many(1) 8 | prog = pq.create_empty_qprog() 9 | 10 | # 构建量子程序 11 | prog.insert(pq.H(cqv[0])) \ 12 | .insert(pq.H(tqv[0])) \ 13 | .insert(pq.H(tqv[0]).control([cqv[0]]))\ 14 | .insert(pq.H(cqv[0])) 15 | 16 | # 对量子程序进行概率测量 17 | result = pq.prob_run_dict(prog, cqv, -1) 18 | pq.destroy_quantum_machine(machine) 19 | 20 | # 打印测量结果 21 | for key in result: 22 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/QFTDemo.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | from numpy import pi 3 | 4 | if __name__ == "__main__": 5 | 6 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 7 | qvec = machine.qAlloc_many(3) 8 | prog = pq.create_empty_qprog() 9 | 10 | # 构建量子程序 11 | prog.insert(pq.QFT(qvec)) 12 | 13 | # 对量子程序进行概率测量 14 | result = pq.prob_run_dict(prog, qvec, -1) 15 | pq.destroy_quantum_machine(machine) 16 | 17 | # 打印测量结果 18 | for key in result: 19 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/QMath.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | # from numpy import pi 3 | 4 | if __name__ == "__main__": 5 | # 为了节约比特数,辅助比特将会互相借用 6 | qvm = pq.init_quantum_machine(pq.QMachineType.CPU) 7 | 8 | qdivvec = qvm.qAlloc_many(10) 9 | qmulvec = qdivvec[:7] 10 | qsubvec = qmulvec[:-1] 11 | qvec1 = qvm.qAlloc_many(4) 12 | qvec2 = qvm.qAlloc_many(4) 13 | qvec3 = qvm.qAlloc_many(4) 14 | cbit = qvm.cAlloc() 15 | prog = pq.create_empty_qprog() 16 | 17 | # (4/1+1-3)*5=10 18 | prog.insert(pq.bind_data(4,qvec3)) \ 19 | .insert(pq.bind_data(1,qvec2)) \ 20 | .insert(pq.QDivider(qvec3, qvec2, qvec1, qdivvec, cbit)) \ 21 | .insert(pq.bind_data(1,qvec2)) \ 22 | .insert(pq.bind_data(1,qvec2)) \ 23 | .insert(pq.QAdd(qvec1, qvec2, qsubvec)) \ 24 | .insert(pq.bind_data(1,qvec2)) \ 25 | .insert(pq.bind_data(3,qvec2)) \ 26 | .insert(pq.QSub(qvec1, qvec2, qsubvec)) \ 27 | .insert(pq.bind_data(3,qvec2)) \ 28 | .insert(pq.bind_data(5,qvec2)) \ 29 | .insert(pq.QMul(qvec1, qvec2, qvec3, qmulvec)) \ 30 | .insert(pq.bind_data(5,qvec2)) 31 | 32 | # 对量子程序进行概率测量 33 | result = pq.prob_run_dict(prog, qmulvec,1) 34 | pq.destroy_quantum_machine(qvm) 35 | 36 | # 打印测量结果 37 | for key in result: 38 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/QPEDemo.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | from numpy import pi 3 | 4 | if __name__ == "__main__": 5 | 6 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 7 | qvec = machine.qAlloc_many(1) 8 | cqv = machine.qAlloc_many(4) 9 | prog = pq.create_empty_qprog() 10 | 11 | # 构建量子程序 12 | prog.insert(pq.H(cqv[0]))\ 13 | .insert(pq.H(cqv[1]))\ 14 | .insert(pq.H(cqv[2]))\ 15 | .insert(pq.H(cqv[3]))\ 16 | .insert(pq.H(qvec[0]))\ 17 | .insert(pq.S(qvec[0]))\ 18 | .insert(pq.RY(qvec[0], pi/4).control(cqv[0]))\ 19 | .insert(pq.RY(qvec[0], pi/2).control(cqv[1]))\ 20 | .insert(pq.RY(qvec[0], pi).control(cqv[2]))\ 21 | .insert(pq.RY(qvec[0], pi*2).control(cqv[3])) \ 22 | .insert(pq.QFT(cqv).dagger()) 23 | 24 | # 对量子程序进行概率测量 25 | result = pq.prob_run_dict(prog, cqv, -1) 26 | pq.destroy_quantum_machine(machine) 27 | 28 | # 打印测量结果 29 | for key in result: 30 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/SWAPTest.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | 3 | if __name__ == "__main__": 4 | 5 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 6 | cqv = machine.qAlloc_many(1) 7 | tqv = machine.qAlloc_many(1) 8 | qvec = machine.qAlloc_many(1) 9 | prog = pq.create_empty_qprog() 10 | 11 | # 构建量子程序 12 | prog.insert(pq.H(cqv[0])) \ 13 | .insert(pq.H(tqv[0])) \ 14 | .insert(pq.X(qvec[0])) \ 15 | .insert(pq.SWAP(tqv[0],qvec[0]).control([cqv[0]]))\ 16 | .insert(pq.H(cqv[0])) 17 | 18 | # 对量子程序进行概率测量 19 | result = pq.prob_run_dict(prog, cqv, -1) 20 | pq.destroy_quantum_machine(machine) 21 | 22 | # 打印测量结果 23 | for key in result: 24 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_algorithm/ShorDemo.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | 3 | if __name__ == "__main__": 4 | N=15 5 | result = pq.Shor_factorization(N) 6 | # print(result) 7 | # 打印测量结果 8 | for key in result: 9 | print(key) -------------------------------------------------------------------------------- /quantum_algorithm/Superposition.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | 3 | if __name__ == "__main__": 4 | 5 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 6 | qubits = machine.qAlloc_many(3) 7 | prog = pq.create_empty_qprog() 8 | 9 | # 构建量子程序 10 | prog.insert(pq.H(qubits[0])) \ 11 | .insert(pq.H(qubits[1])) \ 12 | .insert(pq.H(qubits[2])) 13 | 14 | # 对量子程序进行概率测量 15 | result = pq.prob_run_dict(prog, qubits, -1) 16 | pq.destroy_quantum_machine(machine) 17 | 18 | # 打印测量结果 19 | for key in result: 20 | print(key+":"+str(result[key])) -------------------------------------------------------------------------------- /quantum_ml/fermion/fermion_init.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | p1 = FermionOperator() 4 | p2 = FermionOperator({'1+ 0': 2,'3+ 2+ 1 0': 3}) 5 | p3 = FermionOperator('1+ 0', 2) 6 | p4 = FermionOperator(2) 7 | p5=p2 -------------------------------------------------------------------------------- /quantum_ml/fermion/fermion_math.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | a = FermionOperator('1+ 0', 2) 4 | b = FermionOperator('3+ 2', 3) 5 | plus=a+b 6 | minus=a-b 7 | multiply=a*b 8 | print("a + b = {}".format(plus)) 9 | print("a - b = {}".format(minus)) 10 | print("a * b = {}".format(multiply)) -------------------------------------------------------------------------------- /quantum_ml/fermion/var.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | a = var(2, True) 4 | b = var(3, True) 5 | fermion_op = VarFermionOperator('1+ 0', a) 6 | pauli_op = VarPauliOperator('Z1 Z0', b) -------------------------------------------------------------------------------- /quantum_ml/pauli/getMaxIndex.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | a = PauliOperator('Z0 Z1', 2) 4 | b = PauliOperator('X5 X6', 3) 5 | muliply = a * b 6 | print("a * b = {}".format(muliply)) 7 | print("Index : {}".format(muliply.getMaxIndex())) 8 | -------------------------------------------------------------------------------- /quantum_ml/pauli/pauli_init.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | p1 = PauliOperator() 4 | p2 = PauliOperator({'Z0 Z1': 2, 'X1 Y2': 3}) 5 | p3 = PauliOperator('Z0 Z1', 2) 6 | p4 = PauliOperator(2) 7 | p5 = p2 -------------------------------------------------------------------------------- /quantum_ml/pauli/pauli_math.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | a = PauliOperator('Z0 Z1', 2) 5 | b = PauliOperator('X5 X6', 3) 6 | plus = a + b 7 | minus = a - b 8 | multiply = a * b 9 | print("a + b = {}".format(plus)) 10 | print("a - b = {}".format(minus)) 11 | print("a * b = {}".format(multiply)) -------------------------------------------------------------------------------- /quantum_ml/pauli/remapQubitIndex.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | a = PauliOperator('Z0 Z1', 2) 4 | b = PauliOperator('X5 X6', 3) 5 | muliply = a * b 6 | index_map = {} 7 | remap_pauli = muliply.remapQubitIndex(index_map) 8 | print("remap_pauli = {}".format(remap_pauli)) 9 | print("Index : {}".format(remap_pauli.getMaxIndex())) -------------------------------------------------------------------------------- /quantum_ml/qaoa.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | 4 | def oneCircuit(qlist, Hamiltonian, beta, gamma): 5 | vqc=VariationalQuantumCircuit() 6 | for i in range(len(Hamiltonian)): 7 | tmp_vec=[] 8 | item=Hamiltonian[i] 9 | dict_p = item[0] 10 | for iter in dict_p: 11 | if 'Z'!= dict_p[iter]: 12 | pass 13 | tmp_vec.append(qlist[iter]) 14 | 15 | coef = item[1] 16 | 17 | if 2 != len(tmp_vec): 18 | pass 19 | 20 | vqc.insert(VariationalQuantumGate_CNOT(tmp_vec[0], tmp_vec[1])) 21 | vqc.insert(VariationalQuantumGate_RZ(tmp_vec[1], 2*gamma*coef)) 22 | vqc.insert(VariationalQuantumGate_CNOT(tmp_vec[0], tmp_vec[1])) 23 | 24 | for j in qlist: 25 | vqc.insert(VariationalQuantumGate_RX(j,2.0*beta)) 26 | return vqc 27 | 28 | 29 | if __name__=="__main__": 30 | problem = {'Z0 Z4':0.73,'Z0 Z5':0.33,'Z0 Z6':0.5,'Z1 Z4':0.69,'Z1 Z5':0.36, 31 | 'Z2 Z5':0.88,'Z2 Z6':0.58,'Z3 Z5':0.67,'Z3 Z6':0.43} 32 | Hp = PauliOperator(problem) 33 | qubit_num = Hp.getMaxIndex() 34 | 35 | machine=init_quantum_machine(QMachineType.CPU) 36 | qlist = machine.qAlloc_many(qubit_num) 37 | 38 | step = 4 39 | 40 | beta = var(np.ones((step,1),dtype = 'float64'), True) 41 | gamma = var(np.ones((step,1),dtype = 'float64'), True) 42 | 43 | vqc=VariationalQuantumCircuit() 44 | 45 | for i in qlist: 46 | vqc.insert(VariationalQuantumGate_H(i)) 47 | 48 | for i in range(step): 49 | vqc.insert(oneCircuit(qlist,Hp.toHamiltonian(1),beta[i], gamma[i])) 50 | 51 | 52 | loss = qop(vqc, Hp, machine, qlist) 53 | optimizer = MomentumOptimizer.minimize(loss, 0.02, 0.9) 54 | 55 | leaves = optimizer.get_variables() 56 | 57 | for i in range(100): 58 | optimizer.run(leaves, 0) 59 | loss_value = optimizer.get_loss() 60 | print("i: ", i, " loss:",loss_value ) 61 | 62 | # 验证结果 63 | prog = QProg() 64 | qcir = vqc.feed() 65 | prog.insert(qcir) 66 | directly_run(prog) 67 | 68 | result = quick_measure(qlist, 100) 69 | print(result) -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/0_classes.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | 5 | init(QMachineType.CPU) 6 | qubits = qAlloc_many(4) 7 | cbits = cAlloc_many(4) 8 | prog = QProg() 9 | 10 | # 构建量子程序 11 | prog << H(qubits[0]) \ 12 | << X(qubits[1]) \ 13 | << iSWAP(qubits[0], qubits[1]) \ 14 | << CNOT(qubits[1], qubits[2]) \ 15 | << H(qubits[3]) \ 16 | << measure_all(qubits, cbits) 17 | 18 | # 量子程序运行1000次,并返回测量结果 19 | result = run_with_configuration(prog, cbits, 1000) 20 | 21 | # 打印量子态在量子程序多次运行结果中出现的次数 22 | print(result) 23 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/10_RYGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(1) 6 | cbits = cAlloc_many(1) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << RY(qubits[0], np.pi/2) \ 10 | << Measure(qubits[0], cbits[0]) 11 | # 量子程序运行1000次,并返回测量结果 12 | result = run_with_configuration(prog, cbits, 1000) 13 | print(result) 14 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/11_RZGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(1) 6 | cbits = cAlloc_many(1) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << RZ(qubits[0], np.pi/2) \ 10 | << Measure(qubits[0], cbits[0]) 11 | # 量子程序运行1000次,并返回测量结果 12 | result = run_with_configuration(prog, cbits, 1000) 13 | print(result) 14 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/12_CNOTGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << CNOT(qubits[0], qubits[1]) \ 10 | << Measure(qubits[0], cbits[0]) \ 11 | << Measure(qubits[1], cbits[1]) 12 | # 量子程序运行1000次,并返回测量结果 13 | result = run_with_configuration(prog, cbits, 1000) 14 | print(result) 15 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/13_CRGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << CR(qubits[0], qubits[1], np.pi) \ 10 | << Measure(qubits[0], cbits[0]) \ 11 | << Measure(qubits[1], cbits[1]) 12 | # 量子程序运行1000次,并返回测量结果 13 | result = run_with_configuration(prog, cbits, 1000) 14 | print(result) 15 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/14_SWAPGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << X(qubits[0]) \ 10 | << SWAP(qubits[0], qubits[1]) \ 11 | << Measure(qubits[0], cbits[0]) \ 12 | << Measure(qubits[1], cbits[1]) 13 | # 量子程序运行1000次,并返回测量结果 14 | result = run_with_configuration(prog, cbits, 1000) 15 | print(result) 16 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/15_ToffoliGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(3) 6 | cbits = cAlloc_many(3) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << X(qubits[1]) \ 10 | << X(qubits[2]) \ 11 | << Toffoli(qubits[1],qubits[2],qubits[0]) \ 12 | << Measure(qubits[0], cbits[0]) \ 13 | << Measure(qubits[1], cbits[1]) \ 14 | << Measure(qubits[2], cbits[2]) 15 | # 量子程序运行1000次,并返回测量结果 16 | result = run_with_configuration(prog, cbits, 1000) 17 | print(result) 18 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/1_interface.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(3) 5 | control_qubits = [qubits[0], qubits[1]] 6 | prog = create_empty_qprog() 7 | # 构建量子程序 8 | prog << H(qubits) \ 9 | << H(qubits[0]).dagger() \ 10 | << X(qubits[2]).control(control_qubits) 11 | # 对量子程序进行概率测量 12 | result = prob_run_dict(prog, qubits, -1) 13 | # 打印测量结果 14 | print(result) 15 | finalize() 16 | -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/2_ measure.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(4) 6 | cbits = cAlloc_many(4) 7 | 8 | # 构建量子程序 9 | prog = QProg() 10 | prog << H(qubits[0])\ 11 | << H(qubits[1])\ 12 | << H(qubits[2])\ 13 | << H(qubits[3])\ 14 | << measure_all(qubits, cbits) 15 | 16 | # 量子程序运行1000次,并返回测量结果 17 | result = run_with_configuration(prog, cbits, 1000) 18 | 19 | # 打印测量结果 20 | print(result) 21 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/3_ pmeasure.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(2) 6 | cbits = cAlloc_many(2) 7 | 8 | prog = QProg() 9 | prog << H(qubits[0])\ 10 | << CNOT(qubits[0], qubits[1]) 11 | 12 | print("prob_run_dict: ") 13 | result1 = prob_run_dict(prog, qubits, -1) 14 | print(result1) 15 | 16 | print("prob_run_tuple_list: ") 17 | result2 = prob_run_tuple_list(prog, qubits, -1) 18 | print(result2) 19 | 20 | print("prob_run_list: ") 21 | result3 = prob_run_list(prog, qubits, -1) 22 | print(result3) 23 | 24 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/4_circuit.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(4) 5 | cbits = cAlloc_many(4) 6 | # 构建量子程序 7 | prog = QProg() 8 | circuit = create_empty_circuit() 9 | circuit << H(qubits[0]) \ 10 | << CNOT(qubits[0], qubits[1]) \ 11 | << CNOT(qubits[1], qubits[2]) \ 12 | << CNOT(qubits[2], qubits[3]) 13 | prog << circuit << Measure(qubits[0], cbits[0]) 14 | # 量子程序运行1000次,并返回测量结果 15 | result = run_with_configuration(prog, cbits, 1000) 16 | # 打印量子态在量子程序多次运行结果中出现的次数 17 | print(result) 18 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/5_HGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(1) 5 | cbits = cAlloc_many(1) 6 | # 构建量子程序 7 | prog = QProg() 8 | prog << H(qubits[0]) \ 9 | << Measure(qubits[0], cbits[0]) 10 | # 量子程序运行1000次,并返回测量结果 11 | result = run_with_configuration(prog, cbits, 1000) 12 | print(result) 13 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/6_XGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(1) 5 | cbits = cAlloc_many(1) 6 | # 构建量子程序 7 | prog = QProg() 8 | prog << X(qubits[0]) \ 9 | << Measure(qubits[0], cbits[0]) 10 | # 量子程序运行1000次,并返回测量结果 11 | result = run_with_configuration(prog, cbits, 1000) 12 | print(result) 13 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/7_YGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(1) 5 | cbits = cAlloc_many(1) 6 | # 构建量子程序 7 | prog = QProg() 8 | prog << Y(qubits[0]) \ 9 | << Measure(qubits[0], cbits[0]) 10 | # 量子程序运行1000次,并返回测量结果 11 | result = run_with_configuration(prog, cbits, 1000) 12 | print(result) 13 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/8_ZGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | init(QMachineType.CPU) 4 | qubits = qAlloc_many(1) 5 | cbits = cAlloc_many(1) 6 | # 构建量子程序 7 | prog = QProg() 8 | prog << Z(qubits[0]) \ 9 | << Measure(qubits[0], cbits[0]) 10 | # 量子程序运行1000次,并返回测量结果 11 | result = run_with_configuration(prog, cbits, 1000) 12 | print(result) 13 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/basic_program/9_RXGate.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | if __name__ == "__main__": 4 | init(QMachineType.CPU) 5 | qubits = qAlloc_many(1) 6 | cbits = cAlloc_many(1) 7 | # 构建量子程序 8 | prog = QProg() 9 | prog << RX(qubits[0], np.pi/2) \ 10 | << Measure(qubits[0], cbits[0]) 11 | # 量子程序运行1000次,并返回测量结果 12 | result = run_with_configuration(prog, cbits, 1000) 13 | print(result) 14 | finalize() -------------------------------------------------------------------------------- /quantum_qpanda/components/0_PauliOperator.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | 5 | a = PauliOperator("Z0 Z1", 2) 6 | b = PauliOperator("X5 Y6", 3) 7 | 8 | plus = a + b 9 | minus = a - b 10 | muliply = a * b 11 | 12 | print("a + b = ", plus) 13 | print("a - b = ", minus) 14 | print("a * b = ", muliply) 15 | 16 | print("Index : ", muliply.getMaxIndex()) 17 | 18 | index_map = {} 19 | remap_pauli = muliply.remapQubitIndex(index_map) 20 | 21 | print("remap_pauli : ", remap_pauli) 22 | print("Index : ", remap_pauli.getMaxIndex()) -------------------------------------------------------------------------------- /quantum_qpanda/components/1_FermionOperator.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | 5 | a = FermionOperator("0 1+", 2) 6 | b = FermionOperator("2+ 3", 3) 7 | 8 | plus = a + b 9 | minus = a - b 10 | muliply = a * b 11 | 12 | print("a + b = ", plus) 13 | print("a - b = ", minus) 14 | print("a * b = ", muliply) 15 | 16 | print("normal_ordered(a + b) = ", plus.normal_ordered()) 17 | print("normal_ordered(a - b) = ", minus.normal_ordered()) 18 | print("normal_ordered(a * b) = ", muliply.normal_ordered()) -------------------------------------------------------------------------------- /quantum_qpanda/components/2_Optimizer.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | import matplotlib 4 | matplotlib.use('TkAgg') 5 | import matplotlib.pyplot as plt 6 | 7 | x = np.array([3.3, 4.4, 5.5, 6.71, 6.93, 4.168, 9.779, 6.182, 7.59, 8 | 2.167, 7.042, 10.791, 5.313, 7.997, 5.654, 9.27,3.1]) 9 | y = np.array([1.7, 2.76, 2.09, 3.19, 1.694, 1.573, 3.366, 2.596, 2.53, 10 | 1.221, 2.827, 3.465, 1.65, 2.904, 2.42, 2.94,1.3]) 11 | 12 | def lossFunc(para,grad,inter,fcall): 13 | y_ = np.zeros(len(y)) 14 | 15 | for i in range(len(y)): 16 | y_[i] = para[0] * x[i] + para[1] 17 | 18 | loss = 0 19 | for i in range(len(y)): 20 | loss += (y_[i] - y[i])**2/len(y) 21 | 22 | return ("", loss) 23 | 24 | optimizer = OptimizerFactory.makeOptimizer('NELDER_MEAD') 25 | 26 | init_para = [0, 0] 27 | optimizer.registerFunc(lossFunc, init_para) 28 | optimizer.setXatol(1e-6) 29 | optimizer.setFatol(1e-6) 30 | optimizer.setMaxIter(200) 31 | optimizer.exec() 32 | 33 | result = optimizer.getResult() 34 | print(result.message) 35 | print(" Current function value: ", result.fun_val) 36 | print(" Iterations: ", result.iters) 37 | print(" Function evaluations: ", result.fcalls) 38 | print(" Optimized para: W: ", result.para[0], " b: ", result.para[1]) 39 | 40 | w = result.para[0] 41 | b = result.para[1] 42 | 43 | plt.plot(x, y, 'o', label = 'Training data') 44 | plt.plot(x, w*x + b, 'r', label = 'Fitted line') 45 | plt.legend() 46 | plt.show() -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/0_NodeIter.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | 4 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 5 | q = machine.qAlloc_many(8) 6 | c = machine.cAlloc_many(8) 7 | prog = pq.QProg() 8 | 9 | prog << pq.H(q[0]) << pq.S(q[2]) << pq.CNOT(q[0], q[1]) \ 10 | << pq.CZ(q[1], q[2]) << pq.CR(q[1], q[2], math.pi/2) 11 | iter_head = prog.head() 12 | iter = prog.last() 13 | while iter != iter_head: 14 | if pq.NodeType.GATE_NODE == iter.get_node_type(): 15 | gate = pq.QGate(iter) 16 | print(gate.gate_type()) 17 | iter = iter.get_pre() 18 | else: 19 | print('Traversal End.\n') -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/0_NodeIter_reverse.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | 4 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 5 | q = machine.qAlloc_many(8) 6 | c = machine.cAlloc_many(8) 7 | prog = pq.QProg() 8 | 9 | prog << pq.H(q[0]) << pq.S(q[2]) << pq.CNOT(q[0], q[1]) \ 10 | << pq.CZ(q[1], q[2]) << pq.CR(q[1], q[2], math.pi/2) 11 | iter = prog.begin() 12 | iter_end = prog.end() 13 | while iter != iter_end: 14 | if pq.NodeType.GATE_NODE == iter.get_node_type(): 15 | gate = pq.QGate(iter) 16 | print(gate.gate_type()) 17 | iter = iter.get_next() 18 | else: 19 | print('Traversal End.\n') 20 | 21 | pq.destroy_quantum_machine(machine) 22 | -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/10_Qubit_Rb.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | # 构建噪声虚拟机,调整噪声模拟真实芯片 5 | qvm = NoiseQVM() 6 | qvm.init_qvm() 7 | qvm.set_noise_model(NoiseModel.DEPOLARIZING_KRAUS_OPERATOR, GateType.CZ_GATE, 0.005) 8 | qvm.set_noise_model(NoiseModel.DEPOLARIZING_KRAUS_OPERATOR, GateType.PAULI_Y_GATE, 0.005) 9 | qv = qvm.qAlloc_many(4) 10 | 11 | # 同样可以申请云计算机器(采用真实芯片) 12 | # qvm = QCloud() 13 | # qvm.init_qvm("898D47CF515A48CEAA9F2326394B85C6") 14 | 15 | # 设置随机线路中clifford门集数量 16 | range = [ 5,10,15 ] 17 | 18 | # 测量单比特随机基准 19 | res = single_qubit_rb(qvm, qv[0], range, 10, 1000) 20 | 21 | # 同样可以测量两比特随机基准 22 | #res = double_qubit_rb(qvm, qv[0], qv[1], range, 10, 1000) 23 | 24 | # 对应的数值随噪声影响,噪声数值越大,所得结果越小,且随clifford门集数量增多,结果数值越小。 25 | print(res) 26 | 27 | qvm.finalize() -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/11_Gate_Xeb.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | 5 | # 构建噪声虚拟机,调整噪声模拟真实芯片 6 | qvm = NoiseQVM() 7 | qvm.init_qvm() 8 | qv = qvm.qAlloc_many(4) 9 | 10 | # 设置噪声参数 11 | qvm.set_noise_model(NoiseModel.DEPOLARIZING_KRAUS_OPERATOR, GateType.CZ_GATE, 0.1) 12 | 13 | # 同样可以申请云计算机器(采用真实芯片) 14 | # qvm = QCloud() 15 | # qvm.init_qvm("898D47CF515A48CEAA9F2326394B85C6") 16 | 17 | # 设置不同层数组合 18 | range = [2,4,6,8,10] 19 | # 现在可测试双门类型主要为CZ CNOT SWAP ISWAP SQISWAP 20 | res = double_gate_xeb(qvm, qv[0], qv[1], range, 10, 1000, GateType.CZ_GATE) 21 | # 对应的数值随噪声影响,噪声数值越大,所得结果越小,且层数增多,结果数值越小。 22 | 23 | print(res) 24 | 25 | qvm.finalize() -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/1_Gate_Counter.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__ == "__main__": 3 | qvm = init_quantum_machine(QMachineType.CPU) 4 | qubits = qvm.qAlloc_many(2) 5 | cbits = qvm.cAlloc_many(2) 6 | prog = QProg() 7 | # 构建量子程序 8 | prog << X(qubits[0]) << Y(qubits[1])\ 9 | << H(qubits[0]) << RX(qubits[0], 3.14)\ 10 | << Measure(qubits[0], cbits[0]) 11 | # 统计逻辑门个数 12 | number = get_qgate_num(prog) 13 | print("QGate number: " + str(number)) 14 | qvm.finalize() -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/2_Clock_Cycle.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | 4 | if __name__ == "__main__": 5 | qvm = init_quantum_machine(QMachineType.CPU) 6 | qubits = qvm.qAlloc_many(4) 7 | cbits = qvm.cAlloc_many(4) 8 | # 构建量子程序 9 | prog = QProg() 10 | prog << H(qubits[0]) << CNOT(qubits[0], qubits[1])\ 11 | << iSWAP(qubits[1], qubits[2]) << RX(qubits[3], np.pi / 4) 12 | 13 | # 统计量子程序时钟周期 14 | clock_cycle = get_qprog_clock_cycle(prog, qvm) 15 | print(clock_cycle) 16 | destroy_quantum_machine(qvm) -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/3_Get_Matrix.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | class InitQMachine: 4 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 5 | self.m_machine = pq.init_quantum_machine(machineType) 6 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 7 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 8 | self.m_prog = pq.QProg() 9 | def __del__(self): 10 | pq.destroy_quantum_machine(self.m_machine) 11 | 12 | def get_matrix(q, c): 13 | prog = pq.QProg() 14 | # 构建量子程序 15 | prog << pq.H(q[0]) \ 16 | << pq.S(q[2]) \ 17 | << pq.CNOT(q[0], q[1]) \ 18 | << pq.CZ(q[1], q[2]) \ 19 | << pq.CR(q[1], q[2], math.pi/2) 20 | # 获取线路对应矩阵 21 | result_mat = pq.get_matrix(prog) 22 | # 打印矩阵信息 23 | pq.print_matrix(result_mat) 24 | 25 | if __name__=="__main__": 26 | init_machine = InitQMachine(16, 16) 27 | qlist = init_machine.m_qlist 28 | clist = init_machine.m_clist 29 | machine = init_machine.m_machine 30 | get_matrix(qlist, clist) 31 | print("Test over.") -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/4_Match_Topology.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | 4 | class InitQMachine: 5 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 6 | self.m_machine = pq.init_quantum_machine(machineType) 7 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 8 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 9 | self.m_prog = pq.QProg() 10 | 11 | def __del__(self): 12 | pq.destroy_quantum_machine(self.m_machine) 13 | 14 | def is_match_topology(q, c): 15 | cx = pq.CNOT(q[1], q[3]) 16 | 17 | # 构建拓扑结构 18 | qubits_topology = [[0,1,0,0,0],[1,0,1,1,0],[0,1,0,0,0],[0,1,0,0,1],[0,0,0,1,0]] 19 | 20 | #判断逻辑门是否符合量子拓扑结构 21 | if (pq.is_match_topology(cx,qubits_topology)) == True: 22 | print('Match !\n') 23 | else: 24 | print('Not match.') 25 | 26 | if __name__=="__main__": 27 | init_machine = InitQMachine(16, 16) 28 | qlist = init_machine.m_qlist 29 | clist = init_machine.m_clist 30 | machine = init_machine.m_machine 31 | is_match_topology(qlist, clist) 32 | print("Test over.") -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/5_Adjacent_Qgate_Type.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | 3 | class InitQMachine: 4 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 5 | self.m_machine = pq.init_quantum_machine(machineType) 6 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 7 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 8 | self.m_prog = pq.QProg() 9 | 10 | def __del__(self): 11 | pq.destroy_quantum_machine(self.m_machine) 12 | 13 | def get_adjacent_qgate_type(qlist, clist): 14 | prog = pq.QProg() 15 | 16 | # 构建量子程序 17 | prog << pq.T(qlist[0]) \ 18 | << pq.CNOT(qlist[1], qlist[2]) \ 19 | << pq.Reset(qlist[1]) \ 20 | << pq.H(qlist[3]) \ 21 | << pq.H(qlist[4]) 22 | 23 | iter = prog.begin() 24 | iter = iter.get_next() 25 | type =iter.get_node_type() 26 | if pq.NodeType.GATE_NODE == type: 27 | gate = pq.QGate(iter) 28 | print(gate.gate_type()) 29 | 30 | # 获取指定位置前后逻辑门类型 31 | list = pq.get_adjacent_qgate_type(prog,iter) 32 | print(len(list)) 33 | print(len(list[0].m_target_qubits)) 34 | print(list[1].m_is_dagger) 35 | 36 | node_type = list[0].m_node_type 37 | print(node_type) 38 | if node_type == pq.NodeType.GATE_NODE: 39 | gateFront = pq.QGate(list[0].m_iter) 40 | print(gateFront.gate_type()) 41 | 42 | node_type = list[1].m_node_type 43 | print(node_type) 44 | if node_type == pq.NodeType.GATE_NODE: 45 | gateBack = pq.QGate(list[1].m_iter) 46 | print(gateBack.gate_type()) 47 | 48 | if __name__=="__main__": 49 | init_machine = InitQMachine(16, 16) 50 | qlist = init_machine.m_qlist 51 | clist = init_machine.m_clist 52 | machine = init_machine.m_machine 53 | get_adjacent_qgate_type(qlist, clist) 54 | print("Test over.") -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/6_Is_Swappable.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | 4 | class InitQMachine: 5 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 6 | self.m_machine = pq.init_quantum_machine(machineType) 7 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 8 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 9 | self.m_prog = pq.QProg() 10 | 11 | def __del__(self): 12 | pq.destroy_quantum_machine(self.m_machine) 13 | 14 | #测试接口: 判断指定的两个逻辑门是否可以交换位置 15 | def is_swappable(q, c): 16 | prog = pq.QProg() 17 | cir = pq.QCircuit() 18 | cir2 = pq.QCircuit() 19 | cir2 << pq.H(q[3]) << pq.RX(q[1], math.pi/2) << pq.T(q[2]) << pq.RY(q[3], math.pi/2) << pq.RZ(q[2], math.pi/2) 20 | cir2.set_dagger(True) 21 | cir << pq.H(q[1]) << cir2 << pq.CR(q[1], q[2], math.pi/2) 22 | prog << pq.H(q[0]) << pq.S(q[2]) \ 23 | << cir\ 24 | << pq.CNOT(q[0], q[1]) << pq.CZ(q[1], q[2]) << pq.measure_all(q,c) 25 | 26 | iter_first = cir.begin() 27 | 28 | iter_second = cir2.begin() 29 | #iter_second = iter_second.get_next() 30 | #iter_second = iter_second.get_next() 31 | #iter_second = iter_second.get_next() 32 | 33 | type =iter_first.get_node_type() 34 | if pq.NodeType.GATE_NODE == type: 35 | gate = pq.QGate(iter_first) 36 | print(gate.gate_type()) 37 | 38 | type =iter_second.get_node_type() 39 | if pq.NodeType.GATE_NODE == type: 40 | gate = pq.QGate(iter_second) 41 | print(gate.gate_type()) 42 | 43 | if (pq.is_swappable(prog, iter_first, iter_second)) == True: 44 | print('Could be swapped !\n') 45 | else: 46 | print('Could NOT be swapped.') 47 | 48 | if __name__=="__main__": 49 | init_machine = InitQMachine(16, 16) 50 | qlist = init_machine.m_qlist 51 | clist = init_machine.m_clist 52 | machine = init_machine.m_machine 53 | 54 | is_swappable(qlist, clist) 55 | print("Test over.") -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/7_Supported_Qgate_Type.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | 3 | class InitQMachine: 4 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 5 | self.m_machine = pq.init_quantum_machine(machineType) 6 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 7 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 8 | self.m_prog = pq.QProg() 9 | def __del__(self): 10 | pq.destroy_quantum_machine(self.m_machine) 11 | 12 | def support_qgate_type(): 13 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 14 | q = machine.qAlloc_many(8) 15 | prog = pq.QProg() 16 | prog << pq.H(q[1]) 17 | result = pq.is_supported_qgate_type(prog.begin()) 18 | if result == True: 19 | print('Support !\n') 20 | else: 21 | print('Unsupport !') 22 | 23 | if __name__=="__main__": 24 | init_machine = InitQMachine(16, 16) 25 | qlist = init_machine.m_qlist 26 | clist = init_machine.m_clist 27 | machine = init_machine.m_machine 28 | support_qgate_type() 29 | print("Test over.") -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/8_Print_Qcircuit.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | from pyqpanda.Visualization.circuit_draw import * 3 | import math 4 | class InitQMachine: 5 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 6 | self.m_machine = pq.init_quantum_machine(machineType) 7 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 8 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 9 | 10 | def __del__(self): 11 | pq.destroy_quantum_machine(self.m_machine) 12 | 13 | def print_qcircuit(q, c): 14 | # 构建量子程序 15 | prog = pq.QCircuit() 16 | prog << pq.CU(1, 2, 3, 4, q[0], q[5]) << pq.H(q[0]) << pq.S(q[2])\ 17 | << pq.CNOT(q[0], q[1]) << pq.CZ(q[1], q[2]) << pq.CR(q[2], q[1], math.pi/2) 18 | prog.set_dagger(True) 19 | 20 | print('draw_qprog:') 21 | # 通过print直接输出量子线路字符画,该方法会在控制台输出量子线路,输出格式为utf8编码,所以在非utf8编码的控制台下,输出字符画会出现乱码情况。 22 | # 同时,该方法会将当前量子线路字符画信息保存到文件,文件名为 “QCircuitTextPic.txt”,文件用utf8编码,并保存在当面路径下面, 23 | # 所以用户也可以通过该文件查看量子线路信息,注意该文件要以uft8格式打开,否则会出现乱码。 24 | print(prog) 25 | # 通过draw_qprog接口输出量子线路字符画,该方法功能和print方法一样,区别在于该接口可以指定控制台编码类型,以保证在控制台输出的量子线路字符画能正常显示。 26 | # 参数“console_encode_type” 用于指定控制台类型,目前支持两种编码方式:utf8和gbk,默认为utf8 27 | draw_qprog(prog, 'text', console_encode_type='gbk') 28 | # draw_qprog接口还可以将量子线路保存成图片,调用方式如下。参数“filename”用于指定保存的文件名。 29 | draw_qprog(prog, 'pic', filename='./test_cir_draw.png') 30 | 31 | if __name__=="__main__": 32 | init_machine = InitQMachine(16, 16) 33 | qlist = init_machine.m_qlist 34 | clist = init_machine.m_clist 35 | machine = init_machine.m_machine 36 | 37 | print_qcircuit(qlist, clist) -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/9_Quantum_Volume.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | #构建噪声虚拟机,设置噪声参数 5 | qvm = NoiseQVM() 6 | qvm.init_qvm() 7 | qvm.set_noise_model(NoiseModel.DEPOLARIZING_KRAUS_OPERATOR, GateType.CZ_GATE, 0.005) 8 | #同样可以申请云计算机器(采用真实芯片),采用真实芯片要考虑芯片构造 9 | #qvm = QCloud() 10 | #qvm.init_qvm("898D47CF515A48CEAA9F2326394B85C6") 11 | 12 | #构建待测量的量子比特组合, 这里比特组合为2组,其中 量子比特3、4为一组;量子比特2,3,5为一组 13 | qubit_lists = [[3,4], [2,3,5]] 14 | 15 | #设置随机迭代次数 16 | ntrials = 100 17 | 18 | #设置测量次数,即真实芯片或者噪声虚拟机shots数值 19 | shots = 2000 20 | qv_result = calculate_quantum_volume(qvm, qubit_lists, ntrials, shots) 21 | print("Quantum Volume : ", qv_result) 22 | qvm.finalize() -------------------------------------------------------------------------------- /quantum_qpanda/prog_info/test_cir_draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/quantum_qpanda/prog_info/test_cir_draw.png -------------------------------------------------------------------------------- /quantum_qpanda/tools/0_Circuit_Optimizer.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | if __name__=="__main__": 3 | machine = init_quantum_machine(QMachineType.CPU) 4 | q = machine.qAlloc_many(4) 5 | c = machine.cAlloc_many(4) 6 | # 构建量子程序 7 | prog = QProg() 8 | prog << H(q[0])\ 9 | << H(q[2])\ 10 | << H(q[3])\ 11 | << CNOT(q[1], q[0])\ 12 | << H(q[0])\ 13 | << CNOT(q[1], q[2])\ 14 | << H(q[2])\ 15 | << CNOT(q[2], q[3])\ 16 | << H(q[3]) 17 | # 构建查询线路 18 | query_cir = QCircuit() 19 | query_cir << H(q[0])\ 20 | << CNOT(q[1], q[0])\ 21 | << H(q[0]) 22 | # 构建替换线路 23 | replace_cir = QCircuit() 24 | replace_cir << CZ(q[1], q[0]) 25 | print("查询替换前:") 26 | print(convert_qprog_to_originir(prog,machine)) 27 | # 搜索量子程序中的查询线路,并用替换线路替代 28 | update_prog = circuit_optimizer(prog, [[query_cir, replace_cir]]) 29 | print("查询替换后:") 30 | print(convert_qprog_to_originir(update_prog,machine)) -------------------------------------------------------------------------------- /quantum_qpanda/tools/1_Fill_Qprog_By_I.py: -------------------------------------------------------------------------------- 1 | import pyqpanda.pyQPanda as pq 2 | import math 3 | from pyqpanda.Visualization.circuit_draw import * 4 | import numpy as np 5 | class InitQMachine: 6 | def __init__(self, quBitCnt, cBitCnt, machineType = pq.QMachineType.CPU): 7 | self.m_machine = pq.init_quantum_machine(machineType) 8 | self.m_qlist = self.m_machine.qAlloc_many(quBitCnt) 9 | self.m_clist = self.m_machine.cAlloc_many(cBitCnt) 10 | def __del__(self): 11 | pq.destroy_quantum_machine(self.m_machine) 12 | def fill_I(q, c): 13 | # 构建量子程序 14 | prog = pq.QCircuit() 15 | prog << pq.CU(1, 2, 3, 4, q[0], q[5]) << pq.H(q[0]) << pq.S(q[2]) << pq.CNOT(q[0], q[1]) << pq.CZ(q[1], q[2]) << pq.CR(q[2], q[1], math.pi/2) 16 | prog.set_dagger(True) 17 | # 输出原量子程序 18 | print('source prog:') 19 | draw_qprog(prog, 'text',console_encode_type='gbk') 20 | """ 21 | console_encode_type='utf8' or 'gbk'(默认'utf8') 22 | """ 23 | # 量子程序填充 I 门 24 | prog = pq.fill_qprog_by_I(prog) 25 | # 输出填充 I 门的量子程序 26 | print('The prog after fill_qprog_by_I:') 27 | draw_qprog(prog, 'text',console_encode_type='gbk') 28 | draw_qprog(prog, 'pic', filename='./test_cir_draw.png') 29 | if __name__=="__main__": 30 | init_machine = InitQMachine(16, 16) 31 | qlist = init_machine.m_qlist 32 | clist = init_machine.m_clist 33 | machine = init_machine.m_machine 34 | fill_I(qlist, clist) -------------------------------------------------------------------------------- /quantum_qpanda/tools/2_Matrix_Decompose.py: -------------------------------------------------------------------------------- 1 | import pyqpanda as pq 2 | import numpy as np 3 | 4 | if __name__=="__main__": 5 | 6 | machine = pq.init_quantum_machine(pq.QMachineType.CPU) 7 | q = machine.qAlloc_many(2) 8 | c = machine.cAlloc_many(2) 9 | 10 | source_matrix = [(0.6477054522122977+0.1195417767870219j), (-0.16162176706189357-0.4020495632468249j), (-0.19991615329121998-0.3764618308248643j), (-0.2599957197928922-0.35935248873007863j), 11 | (-0.16162176706189363-0.40204956324682495j), (0.7303014482204584-0.4215172444390785j), (-0.15199187936216693+0.09733585496768032j), (-0.22248203136345918-0.1383600597660744j), 12 | (-0.19991615329122003-0.3764618308248644j), (-0.15199187936216688+0.09733585496768032j), (0.6826630277354306-0.37517063774206166j), (-0.3078966462928956-0.2900897445133085j), 13 | (-0.2599957197928923-0.3593524887300787j), (-0.22248203136345912-0.1383600597660744j), (-0.30789664629289554-0.2900897445133085j), (0.6640994547408099-0.338593803336005j)] 14 | 15 | print("source matrix : ") 16 | print(source_matrix) 17 | 18 | out_cir = pq.matrix_decompose(q, source_matrix) 19 | circuit_matrix = pq.get_matrix(out_cir) 20 | 21 | print("the decomposed matrix : ") 22 | print(circuit_matrix) 23 | 24 | source_matrix = np.round(np.array(source_matrix),3) 25 | circuit_matrix = np.round(np.array(circuit_matrix),3) 26 | 27 | if np.all(source_matrix == circuit_matrix): 28 | print('matrix decompose ok !') 29 | else: 30 | print('matrix decompose false !') -------------------------------------------------------------------------------- /quantum_qpanda/tools/test_cir_draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/quantum_qpanda/tools/test_cir_draw.png -------------------------------------------------------------------------------- /quantum_qpanda/vqc/0_Var.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | 4 | if __name__=="__main__": 5 | 6 | m1 = np.array([[1., 2.],[3., 4.]]) 7 | v1 = var(m1) 8 | 9 | m2 = np.array([[5., 6.],[7., 8.]]) 10 | v2 = var(m2) 11 | 12 | sum = v1 + v2 13 | minus = v1 - v2 14 | multiply = v1 * v2 15 | 16 | print("v1: ", v1.get_value()) 17 | print("v2: ", v2.get_value()) 18 | print("sum: " , eval(sum)) 19 | print("minus: " , eval(minus)) 20 | print("multiply: " , eval(multiply)) 21 | 22 | m3 = np.array([[4., 3.],[2., 1.]]) 23 | v1.set_value(m3) 24 | 25 | print("sum: " , eval(sum)) 26 | print("minus: " , eval(minus)) 27 | print("multiply: " , eval(multiply)) -------------------------------------------------------------------------------- /quantum_qpanda/vqc/1_VQC_VGQ.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | 3 | if __name__=="__main__": 4 | 5 | machine = init_quantum_machine(QMachineType.CPU) 6 | q = machine.qAlloc_many(2) 7 | 8 | x = var(1) 9 | y = var(2) 10 | 11 | 12 | vqc = VariationalQuantumCircuit() 13 | vqc.insert(VariationalQuantumGate_H(q[0])) 14 | vqc.insert(VariationalQuantumGate_RX(q[0], x)) 15 | vqc.insert(VariationalQuantumGate_RY(q[1], y)) 16 | vqc.insert(VariationalQuantumGate_RZ(q[0], 0.12)) 17 | vqc.insert(VariationalQuantumGate_CZ(q[0], q[1])) 18 | vqc.insert(VariationalQuantumGate_CNOT(q[0], q[1])) 19 | 20 | circuit1 = vqc.feed() 21 | 22 | prog = QProg() 23 | prog.insert(circuit1) 24 | 25 | print(convert_qprog_to_originir(prog, machine)) 26 | 27 | x.set_value([[3.]]) 28 | y.set_value([[4.]]) 29 | 30 | circuit2 = vqc.feed() 31 | prog2 = QProg() 32 | prog2.insert(circuit2) 33 | print(convert_qprog_to_originir(prog2, machine)) -------------------------------------------------------------------------------- /quantum_qpanda/vqc/2_Optimizer.py: -------------------------------------------------------------------------------- 1 | from pyqpanda import * 2 | import numpy as np 3 | import matplotlib 4 | matplotlib.use('TkAgg') 5 | import matplotlib.pyplot as plt 6 | 7 | x = np.array([3.3, 4.4, 5.5, 6.71, 6.93, 4.168, 9.779, 6.182, 7.59, 8 | 2.167, 7.042, 10.791, 5.313, 7.997, 5.654, 9.27,3.1]) 9 | y = np.array([1.7, 2.76, 2.09, 3.19, 1.694, 1.573, 3.366, 2.596, 2.53, 10 | 1.221, 2.827, 3.465, 1.65, 2.904, 2.42, 2.94,1.3]) 11 | 12 | 13 | X = var(x.reshape(len(x), 1)) 14 | Y = var(y.reshape(len(y), 1)) 15 | 16 | W = var(0, True) 17 | B = var(0, True) 18 | 19 | Y_ = W*X + B 20 | 21 | loss = sum(poly(Y_ - Y, var(2))/len(x)) 22 | 23 | optimizer = VanillaGradientDescentOptimizer.minimize(loss, 0.01, 1.e-6) 24 | leaves = optimizer.get_variables() 25 | 26 | for i in range(1000): 27 | optimizer.run(leaves, 0) 28 | loss_value = optimizer.get_loss() 29 | print("i: ", i, " loss: ", loss_value, " W: ", eval(W,True), " b: ", eval(B, True)) 30 | 31 | w2 = W.get_value()[0, 0] 32 | b2 = B.get_value()[0, 0] 33 | 34 | plt.plot(x, y, 'o', label = 'Training data') 35 | plt.plot(x, w2*x + b2, 'r', label = 'Fitted line') 36 | plt.legend() 37 | plt.show() -------------------------------------------------------------------------------- /量子计算【编程篇】/第1章 编程基础.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【编程篇】/第1章 编程基础.pdf -------------------------------------------------------------------------------- /量子计算【编程篇】/第2章 编程进阶.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【编程篇】/第2章 编程进阶.pdf -------------------------------------------------------------------------------- /量子计算【编程篇】/第3章 常用工具接口.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【编程篇】/第3章 常用工具接口.pdf -------------------------------------------------------------------------------- /量子计算【编程篇】/第4章 组件-算符、优化算法.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【编程篇】/第4章 组件-算符、优化算法.pdf -------------------------------------------------------------------------------- /量子计算【编程篇】/第5章 VQC-变量、可变量子门.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【编程篇】/第5章 VQC-变量、可变量子门.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第10章 固定收益定价.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第10章 固定收益定价.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第11章 信用风险分析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第11章 信用风险分析.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第12章 QGAN期权定价.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第12章 QGAN期权定价.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第1章 量子金融概要.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第1章 量子金融概要.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第2章 量子振幅估计.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第2章 量子振幅估计.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第3章 投资组合优化.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第3章 投资组合优化.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第4章 分散投资.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第4章 分散投资.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第5章 欧式看涨期权定价.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第5章 欧式看涨期权定价.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第6章 欧式看跌期权定价.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第6章 欧式看跌期权定价.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第7章 牛市套利.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第7章 牛市套利.pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第8章 一篮子期权 (Basket Options).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第8章 一篮子期权 (Basket Options).pdf -------------------------------------------------------------------------------- /量子计算【量子金融】/第9章 亚式障碍期权(Asian barriers options).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mymagicpower/qubits/a4b80d16dd49ce5bf026f71ce5f2cf4cee05f699/量子计算【量子金融】/第9章 亚式障碍期权(Asian barriers options).pdf --------------------------------------------------------------------------------