sqdtoolz 0.9.1.dev1__tar.gz → 0.9.3.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/PKG-INFO +2 -2
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/pyproject.toml +2 -2
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py +5 -1
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIqubit.py +7 -1
- sqdtoolz-0.9.3.dev1/sqdtoolz/Utilities/DataDensityMatrix.py +307 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/ParserOpenQASM.py +126 -56
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersJSONConfigZI.py +1 -1
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates_transmon_fixed_coupler.inc +2 -1
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz.egg-info/PKG-INFO +2 -2
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz.egg-info/SOURCES.txt +1 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/LICENSE +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/README.md +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/setup.cfg +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/ACQ_ETH_FPGA.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/ACQ_M4i_Digitiser.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/ACQ_TektronixDSA70804B.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/ATTEN_Vaunix.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/AWG5014C.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Agilent_N8241A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/DDG_DG645.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/DSO_DS1054Z.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Agilent_N8241A_constants_python3.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/PrologixGPIBEthernet.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/RPi_gpio_interface.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/RPi_serial_interface.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/M4i.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/regs.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/spcerr.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/pyspcm.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/teproteus.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Dependencies/tevisainst.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/FGEN_FY6900.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/MWS_SGS100A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/MWS_SMB100A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2_RPi.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SA_RS_FSV.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SMU_B2901A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SMU_Keithley236.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SMU_TENMA_72_2710.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_BJT_RPi.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_BJT_RPi_Multi.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_FPGA_VNA.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_RFSwitchController_CryoRadiall.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_RPiCryo.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_RPiRadial.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/SW_RpiIQBox.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/THERM_TC0309.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/Tabor_P2584M.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VNA_Agilent_N5232A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VNA_Keysight_P9373A.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_Delft_IVVI.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_IVVI_pyro.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_RpiMultiDAC.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_SIM928_PLX.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_SIM928_VCOM.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_SIM928_pyro.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/VOLT_Stahl_16CH.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/ZILabOneQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummyACQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummyACQex.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummyAWG.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummyDDG.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummyGENmwSource.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Drivers/dummySMU.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiment.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/ExperimentConfiguration.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/ExperimentSpecification.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/ExperimentSpecifications/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/ExperimentSweeps.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpACstarkRamseyGE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpBodePlot.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibGE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrot.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrotAuto.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpGateBenchmarks.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpHahnGE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationLO.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationSB.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpPeakScouterIQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpPulsedCavitySpec.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpQubitFluxSweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpRabi.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpRamseyGE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpRandomisedBenchmarking.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVs.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVsFast.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpSingleShotGE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpT1GE.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAEquations.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAoptimalSNR.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIActiveResetTuneup.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBenchmarkETH.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBlobs.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZICalibX.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons2QFixedCoupler.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZICryoscope.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDailyTuneup.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDispersive.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDragScaling.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIFixedCouplerTuneup.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQASM.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitFluxSweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitPowerSweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitSpec.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabi.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabiRamseyT1.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRamsey.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRandomisedBenchmarking.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRes.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResFluxSweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResOptimal.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResPowerSweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZISingleQubitTuneup.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1SingleShot.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZITWPATuneup.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler_osc.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/cryo_scope.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/flux_scope.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/oqasm_scheduled_qubits.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_single_chevron.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_spectroscopy_gef.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates_sweep.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ZI/sinlge_qubit_gates_sweep_chunking.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ACQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ACQdso.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ACQsa.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ACQvna.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/AWG.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/DDG.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/DataProcessor.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/DecisionBlock.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Decisions/DEC_SVM.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENatten.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENfuncGen.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENmwSource.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENmwSrcAWG.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENsmu.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENswitch.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENswitchTrig.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENtherm.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/GENvoltSource.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/HALbase.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/LockableProperties.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/MultiACQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_AmpPhs.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ChannelArithmetic.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ConstantArithmetic.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_DDC.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Decimation.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Duplicate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ESD.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FFT.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FIR.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Integrate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Max.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Mean.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanBlock.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanVariance.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Rename.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Slice.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Variance.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_kMeans.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDC.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDCFIR.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Decimation.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FFT.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FIR.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Integrate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Mean.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_MultiplierConst.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ChannelArithmetic.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ConstantArithmetic.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_DDC.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Decimation.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Duplicate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ESD.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FFT.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FIR.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Integrate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Max.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Mean.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_MeanBlock.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Rename.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Slice.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/ProcessorCPU.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/ProcessorFPGA.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/Processors/ProcessorGPU.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/SOFTpid.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/SOFTqpu.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/TriggerPulse.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/WaveformGeneric.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/WaveformMapper.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/WaveformSegments.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/WaveformTransformations.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/QuantumElements/TunableTransmonCouplerFixed.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/QuantumElements/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/ZIACQ.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/ZIPulses.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/ZIQuantumElement.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/ZIQubit.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/ZIbase.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/HAL/ZI/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Laboratory.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/DataFitting.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/DataIQDiscriminate.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/DataIQNormalise.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/DataQubitFlux.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/DataSingleShotThreshold.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/ExperimentViewer.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/FileConverter.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/FileIO.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/FileJSON.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/Flattenator.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/Miscellaneous.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersSoftQPUZI.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates.inc +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/Optimisers.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/QubitGates.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/ResonatorTools.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Utilities/TimingPlots.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Variable.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/__init__.py +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz.egg-info/dependency_links.txt +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz.egg-info/requires.txt +0 -0
- {sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz.egg-info/top_level.txt +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqdtoolz
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.3.dev1
|
|
4
4
|
Summary: toolbox to control and run experiments
|
|
5
|
-
Author-email: Prasanna Pakkiam <p.pakkiam@uq.edu.au>, Rohit Beriwal <
|
|
5
|
+
Author-email: Prasanna Pakkiam <p.pakkiam@uq.edu.au>, Rohit Beriwal <f20150302d@alumni.bits-pilani.ac.in>
|
|
6
6
|
Project-URL: Homepage, https://github.com/sqdlab/sqdtoolz
|
|
7
7
|
Keywords: control toolbox,timing
|
|
8
8
|
Classifier: Development Status :: 3 - Alpha
|
|
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "sqdtoolz"
|
|
7
|
-
version = "0.9.
|
|
7
|
+
version = "0.9.3.dev1"
|
|
8
8
|
description = "toolbox to control and run experiments"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
11
11
|
authors = [
|
|
12
12
|
{ name = "Prasanna Pakkiam", email = "p.pakkiam@uq.edu.au" },
|
|
13
|
-
{ name = "Rohit Beriwal", email = "
|
|
13
|
+
{ name = "Rohit Beriwal", email = "f20150302d@alumni.bits-pilani.ac.in" }
|
|
14
14
|
]
|
|
15
15
|
keywords = ["control toolbox", "timing"]
|
|
16
16
|
|
{sqdtoolz-0.9.1.dev1 → sqdtoolz-0.9.3.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py
RENAMED
|
@@ -3,6 +3,7 @@ from pathlib import Path
|
|
|
3
3
|
import shutil
|
|
4
4
|
from sqdtoolz.Utilities.FileIO import FileIOReader
|
|
5
5
|
import json
|
|
6
|
+
import numpy as np
|
|
6
7
|
|
|
7
8
|
class ExpZIQASMDataViewer:
|
|
8
9
|
def __init__(self, expziqasm_data_folder_path):
|
|
@@ -19,11 +20,14 @@ class ExpZIQASMDataViewer:
|
|
|
19
20
|
leData = FileIOReader(file_path)
|
|
20
21
|
arr = leData.get_numpy_array()
|
|
21
22
|
if self._meas_params['acq_type'] == 'DISCRIMINATION':
|
|
22
|
-
arr = arr[...,0]
|
|
23
|
+
arr = np.array(arr[...,0], dtype=int)
|
|
23
24
|
if arr.size == 1:
|
|
24
25
|
arr = float(arr)
|
|
25
26
|
return arr
|
|
26
27
|
|
|
28
|
+
def get_number_of_shots(self):
|
|
29
|
+
return self._meas_params['NumRepetitions']
|
|
30
|
+
|
|
27
31
|
def get_inner_slicing_vars(self):
|
|
28
32
|
match self._meas_params['acq_type']:
|
|
29
33
|
case 'DISCRIMINATION':
|
|
@@ -31,6 +31,10 @@ class ExpZIqubit(Experiment):
|
|
|
31
31
|
self._transition = kwargs.pop('transition', 'ge')
|
|
32
32
|
#
|
|
33
33
|
self._plot_ZI = kwargs.pop('ZI_plot', False)
|
|
34
|
+
self._skip_ZI_analysis = kwargs.pop('skip_ZI_analysis', True)
|
|
35
|
+
if self._plot_ZI:
|
|
36
|
+
#Cannot plot_ZI without executing the ZI analysis workflow...
|
|
37
|
+
self._skip_ZI_analysis = False
|
|
34
38
|
self._args = kwargs
|
|
35
39
|
self._show_pulse_sheet = kwargs.pop('show_pulse_sheet', False)
|
|
36
40
|
|
|
@@ -55,6 +59,8 @@ class ExpZIqubit(Experiment):
|
|
|
55
59
|
getattr(options, 'transition')(self._transition)
|
|
56
60
|
if hasattr(options, 'close_figures'):
|
|
57
61
|
options.close_figures(not self._plot_ZI)
|
|
62
|
+
if hasattr(options, 'do_analysis'):
|
|
63
|
+
getattr(options, 'do_analysis')(not self._skip_ZI_analysis)
|
|
58
64
|
if hasattr(options, 'cal_states'):
|
|
59
65
|
#Automatically default to transition for calibration states... Note that this only matters if use_cal_traces is True...
|
|
60
66
|
getattr(options, 'cal_states')( self._args.get('cal_states', self._transition) )
|
|
@@ -116,7 +122,7 @@ class ExpZIqubit(Experiment):
|
|
|
116
122
|
#Another hack for the case where they iterate once per qubit in the experiment for a given workflow...
|
|
117
123
|
if 'qubits' in zi_wfw_params and not ('qubits' in zi_exp_params) and 'qubit' in zi_exp_params:
|
|
118
124
|
execution_time *= len(leQubits)
|
|
119
|
-
qubit_kwarg = {'qubits': leQubits}
|
|
125
|
+
qubit_kwarg = {'qubits': [x.uid for x in leQubits]}
|
|
120
126
|
|
|
121
127
|
if kwargs.get('print_estimated_execution_time',True):
|
|
122
128
|
print(f"Expected Runtime: {execution_time:.3f}s")
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
import numpy as np
|
|
3
|
+
import scipy.optimize
|
|
4
|
+
import matplotlib.pyplot as plt
|
|
5
|
+
|
|
6
|
+
class DataDensityMatrix:
|
|
7
|
+
def __init__(self, density_matrix):
|
|
8
|
+
self._rho = density_matrix
|
|
9
|
+
self._num_qubits = int(np.log2(density_matrix.shape[0]))
|
|
10
|
+
self._eigs = np.linalg.eigvalsh(density_matrix)
|
|
11
|
+
|
|
12
|
+
@classmethod
|
|
13
|
+
def fromDataViewer(cls, dataviewer, dataviewer_reg='c'):
|
|
14
|
+
"""
|
|
15
|
+
This assumes that the data was taken with ExpZIQASM and that the data in register
|
|
16
|
+
dataviewer_reg is structured as the Pauli ordering of measurements. For example, for
|
|
17
|
+
two qubits, it'd be II, IX, IY, IZ, XI, XX etc. So in this case it'd be such that every
|
|
18
|
+
two entries correspond to an array of qubit shots for the first and second qubit
|
|
19
|
+
respectively. If it is an I measurement, the array slot will be ignored in this analysis,
|
|
20
|
+
so it may be None.
|
|
21
|
+
"""
|
|
22
|
+
data = dataviewer.get_data(dataviewer_reg)
|
|
23
|
+
num_measurements = len(data)
|
|
24
|
+
N = 0
|
|
25
|
+
while (N+1) * 4**(N+1) <= num_measurements:
|
|
26
|
+
N += 1
|
|
27
|
+
assert N*4**N==num_measurements, "The number of measurements/qubits do not correspond. For N qubits, there should be N*4^N measurements..."
|
|
28
|
+
#Assuming that data is divided into groups of N (for N qubits) for each measurement type (e.g. IXZI etc.)
|
|
29
|
+
#Also assuming that measurement of 1-state gives -1 eigenvalue for X/Y/Z...
|
|
30
|
+
measurements = [''.join(item) for item in itertools.product(['I','X','Y','Z'], repeat=N)]
|
|
31
|
+
num_shots = dataviewer.get_number_of_shots()
|
|
32
|
+
#
|
|
33
|
+
expectation_values = []
|
|
34
|
+
for m,cur_measurement in enumerate(measurements):
|
|
35
|
+
if m == 0:
|
|
36
|
+
expectation_values.append(1.0)
|
|
37
|
+
continue
|
|
38
|
+
cur_data_set = data[m*N:(m+1)*N]
|
|
39
|
+
#
|
|
40
|
+
#Calculate expectation value
|
|
41
|
+
cur_prod = np.ones(num_shots, dtype=int)
|
|
42
|
+
valid_shots = np.ones(num_shots, dtype=bool)
|
|
43
|
+
for ind, pauli in enumerate(cur_measurement):
|
|
44
|
+
if pauli == 'I':
|
|
45
|
+
continue #Pauli I does not contribute...
|
|
46
|
+
cur_data = cur_data_set[ind]
|
|
47
|
+
#Any F-state (i.e. 2) invalidates the entire shot
|
|
48
|
+
valid_shots &= (cur_data != 2)
|
|
49
|
+
#0 -> +1, 1 -> -1
|
|
50
|
+
cur_prod *= 1 - 2*cur_data
|
|
51
|
+
#Calculate the product across the shot +/-1 values and take mean
|
|
52
|
+
expectation = np.mean(cur_prod[valid_shots])
|
|
53
|
+
expectation_values.append(float(expectation))
|
|
54
|
+
#
|
|
55
|
+
return cls(DataDensityMatrix.estimate_rho_from_expectations(np.array(expectation_values)))
|
|
56
|
+
|
|
57
|
+
@staticmethod
|
|
58
|
+
def estimate_rho_from_expectations(expectation_values):
|
|
59
|
+
"""
|
|
60
|
+
Reconstruct an N-qubit physical density matrix from expectation values
|
|
61
|
+
of all N-qubit Pauli strings.
|
|
62
|
+
|
|
63
|
+
expectation_values should contain the expectation values corresponding to
|
|
64
|
+
the Pauli strings in the ordering:
|
|
65
|
+
II...I, II...X, II...Y, II...Z, ..., ZZ...Z
|
|
66
|
+
|
|
67
|
+
i.e. the ordering generated by itertools.product(['I','X','Y','Z'], repeat=N).
|
|
68
|
+
"""
|
|
69
|
+
#Number of Pauli operators = 4^N
|
|
70
|
+
n_paulis = len(expectation_values)
|
|
71
|
+
N = int(np.log2(n_paulis)/2)
|
|
72
|
+
assert 4**N == n_paulis, f"Expected 4^N expectation values, but got {n_paulis}."
|
|
73
|
+
|
|
74
|
+
I = np.eye(2, dtype=complex)
|
|
75
|
+
X = np.array([[0, 1], [1, 0]], dtype=complex)
|
|
76
|
+
Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
|
|
77
|
+
Z = np.array([[1, 0], [0, -1]], dtype=complex)
|
|
78
|
+
paulis = {'I': I,'X': X,'Y': Y,'Z': Z}
|
|
79
|
+
pauli_strings = list(itertools.product(['I', 'X', 'Y', 'Z'], repeat=N))
|
|
80
|
+
|
|
81
|
+
#Create the Pauli tensor-product operators...
|
|
82
|
+
E_ops = []
|
|
83
|
+
for pauli_string in pauli_strings:
|
|
84
|
+
E = np.array([[1]], dtype=complex)
|
|
85
|
+
for p in pauli_string:
|
|
86
|
+
E = np.kron(E, paulis[p])
|
|
87
|
+
E_ops.append(E)
|
|
88
|
+
|
|
89
|
+
dim = 2**N
|
|
90
|
+
n_params = 2 * dim * dim
|
|
91
|
+
|
|
92
|
+
def params_to_rho(params):
|
|
93
|
+
#First dim^2 are real components, while second dim^2 are imaginary components
|
|
94
|
+
T_real = params[:dim**2].reshape((dim, dim))
|
|
95
|
+
T_imag = params[dim**2:].reshape((dim, dim))
|
|
96
|
+
T = T_real + 1j * T_imag
|
|
97
|
+
#Guarantee Hermitian & positive semidefiniteness
|
|
98
|
+
rho_unnorm = T.conj().T @ T
|
|
99
|
+
#Normalize trace to 1
|
|
100
|
+
trace_val = np.trace(rho_unnorm).real
|
|
101
|
+
if trace_val < 1e-12:
|
|
102
|
+
return np.eye(dim, dtype=complex) / dim #A bit harsh - could just divide and make it positive...?
|
|
103
|
+
return rho_unnorm / trace_val
|
|
104
|
+
|
|
105
|
+
def objective_function(params):
|
|
106
|
+
rho = params_to_rho(params)
|
|
107
|
+
predicted = np.array([np.trace(rho @ E).real for E in E_ops]) #Calculate tr(rho*pauli) to get expectation value
|
|
108
|
+
return np.sum((predicted - expectation_values)**2) #Compare with measured expectation value
|
|
109
|
+
|
|
110
|
+
init_params = np.random.uniform(-1, 1, n_params)
|
|
111
|
+
result = scipy.optimize.minimize(objective_function, init_params, method='BFGS')
|
|
112
|
+
|
|
113
|
+
reconstructed_rho = params_to_rho(result.x)
|
|
114
|
+
|
|
115
|
+
return reconstructed_rho
|
|
116
|
+
|
|
117
|
+
def get_purity(self):
|
|
118
|
+
return np.trace(self._rho @ self._rho).real
|
|
119
|
+
|
|
120
|
+
def get_fidelity_pure_state(self, target_state):
|
|
121
|
+
"""
|
|
122
|
+
Fidelity between a reconstructed density matrix and a pure
|
|
123
|
+
target state given in the usual computational basis.
|
|
124
|
+
|
|
125
|
+
Parameters
|
|
126
|
+
----------
|
|
127
|
+
target_state : ndarray, shape (2^N)
|
|
128
|
+
Target pure state |psi>. Does not need to be normalized;
|
|
129
|
+
it will be normalized internally.
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
float
|
|
134
|
+
State fidelity in [0, 1].
|
|
135
|
+
"""
|
|
136
|
+
psi = np.asarray(target_state, dtype=complex).reshape(-1)
|
|
137
|
+
assert self._rho.shape[0] == len(psi), "Target_state dimension must match density matrix size."
|
|
138
|
+
psi_norm = np.linalg.norm(psi)
|
|
139
|
+
assert psi_norm > 0, "Target_state must be non-zero in magnitude."
|
|
140
|
+
psi = psi / psi_norm
|
|
141
|
+
|
|
142
|
+
#Don't need to use Uhlmann fidelity here. Just go <psi|rho|psi>
|
|
143
|
+
F = np.vdot(psi, self._rho @ psi)
|
|
144
|
+
F = float(np.real_if_close(F))
|
|
145
|
+
return float(np.clip(F, 0.0, 1.0))
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def plot3D(self, target_state=None, use_abs_phase=False):
|
|
149
|
+
"""
|
|
150
|
+
Plot the real part of the density matrix as a 3D bar plot.
|
|
151
|
+
|
|
152
|
+
The reconstructed density matrix is taken from self._rho and the
|
|
153
|
+
number of qubits from self._num_qubits.
|
|
154
|
+
|
|
155
|
+
Parameters
|
|
156
|
+
----------
|
|
157
|
+
target_state : array-like, optional
|
|
158
|
+
Target pure state vector |psi>. If provided, its density matrix
|
|
159
|
+
|psi><psi| is shown as transparent red bars underneath the
|
|
160
|
+
reconstructed state.
|
|
161
|
+
use_abs_phase : bool
|
|
162
|
+
If True, then the two plots will be magnitude/phase instead of
|
|
163
|
+
real/imag...
|
|
164
|
+
|
|
165
|
+
Notes
|
|
166
|
+
-----
|
|
167
|
+
Computational basis states are shown on both axes.
|
|
168
|
+
|
|
169
|
+
Colors:
|
|
170
|
+
Blue = reconstructed state
|
|
171
|
+
Red = target state
|
|
172
|
+
Purple = overlap between target and reconstructed state
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
# ------------------------------------------------------------------
|
|
176
|
+
# Validate reconstructed density matrix
|
|
177
|
+
# ------------------------------------------------------------------
|
|
178
|
+
rho = np.asarray(self._rho, dtype=complex)
|
|
179
|
+
n_qubits = self._num_qubits
|
|
180
|
+
dim = 2 ** n_qubits
|
|
181
|
+
|
|
182
|
+
target_rho = None
|
|
183
|
+
if target_state is not None:
|
|
184
|
+
psi = np.asarray(target_state, dtype=complex).reshape(-1)
|
|
185
|
+
assert self._rho.shape[0] == len(psi), "Target_state dimension must match density matrix size."
|
|
186
|
+
psi_norm = np.linalg.norm(psi)
|
|
187
|
+
assert psi_norm > 0, "Target_state must be non-zero in magnitude."
|
|
188
|
+
psi = psi / psi_norm
|
|
189
|
+
target_rho = np.outer(psi, psi.conj())
|
|
190
|
+
|
|
191
|
+
basis_labels = [rf"$|{i:0{n_qubits}b}\rangle$" for i in range(dim)]
|
|
192
|
+
|
|
193
|
+
xpos, ypos = np.meshgrid(np.arange(dim), np.arange(dim))
|
|
194
|
+
xpos = xpos.flatten()
|
|
195
|
+
ypos = ypos.flatten()
|
|
196
|
+
zpos = np.zeros_like(xpos, dtype=float)
|
|
197
|
+
|
|
198
|
+
dx = dy = 0.7
|
|
199
|
+
|
|
200
|
+
if use_abs_phase:
|
|
201
|
+
actual_vals = [np.abs(rho).flatten(), np.angle(rho).flatten()]
|
|
202
|
+
z_labels = ['Magnitude', 'Argument']
|
|
203
|
+
else:
|
|
204
|
+
actual_vals = [np.real(rho).flatten(), np.imag(rho).flatten()]
|
|
205
|
+
z_labels = ['Real part', 'Imag part']
|
|
206
|
+
if target_rho is not None:
|
|
207
|
+
if use_abs_phase:
|
|
208
|
+
target_vals = [np.abs(target_rho).flatten(), np.angle(target_rho).flatten()]
|
|
209
|
+
else:
|
|
210
|
+
target_vals = [np.real(target_rho).flatten(), np.imag(target_rho).flatten()]
|
|
211
|
+
|
|
212
|
+
fig = plt.figure(); fig.set_figwidth(12); fig.set_figheight(10)
|
|
213
|
+
axs = [None, None]
|
|
214
|
+
axs[0] = fig.add_subplot(1, 2, 1, projection="3d")
|
|
215
|
+
axs[1] = fig.add_subplot(1, 2, 2, projection="3d")
|
|
216
|
+
#Hack on the position of the title; may not work for more than 2 qubits?
|
|
217
|
+
if target_rho is None:
|
|
218
|
+
fig.suptitle(f"Density matrix", y=0.7)
|
|
219
|
+
else:
|
|
220
|
+
fig.suptitle(f"Density matrix\nblue = reconstructed, red = target, purple = overlap", y=0.7)
|
|
221
|
+
|
|
222
|
+
for m,ax in enumerate(axs):
|
|
223
|
+
if target_rho is not None:
|
|
224
|
+
ax.bar3d(xpos, ypos, zpos, dx, dy, target_vals[m], color="red", alpha=0.10, shade=False)
|
|
225
|
+
ax.bar3d(xpos, ypos, zpos, dx, dy, actual_vals[m], color="steelblue", alpha=0.75, shade=True)
|
|
226
|
+
|
|
227
|
+
ax.set_box_aspect(None, zoom=0.85) #Hack to get z-axis labels to appear in frame...
|
|
228
|
+
ax.set_xticks(np.arange(dim) + dx / 2)
|
|
229
|
+
ax.set_yticks(np.arange(dim) + dy / 2)
|
|
230
|
+
ax.set_xticklabels(basis_labels, rotation=45, ha="right")
|
|
231
|
+
ax.set_yticklabels(basis_labels, rotation=-45, ha="left")
|
|
232
|
+
ax.set_xlabel("Column basis state", labelpad=15)
|
|
233
|
+
ax.set_ylabel("Row basis state", labelpad=15)
|
|
234
|
+
ax.set_zlabel(z_labels[m])
|
|
235
|
+
|
|
236
|
+
max_val = np.max(np.abs(actual_vals[m]))
|
|
237
|
+
if target_rho is not None:
|
|
238
|
+
max_val = max(max_val, np.max(np.abs(target_vals[m])))
|
|
239
|
+
max_val = max(max_val, 1e-12)
|
|
240
|
+
if m == 0 and use_abs_phase:
|
|
241
|
+
ax.set_zlim(0, 1.1 * max_val)
|
|
242
|
+
else:
|
|
243
|
+
ax.set_zlim(-1.1 * max_val, 1.1 * max_val)
|
|
244
|
+
ax.view_init(elev=25, azim=-55)
|
|
245
|
+
fig.tight_layout()
|
|
246
|
+
|
|
247
|
+
@staticmethod
|
|
248
|
+
def generate_tomography_qasm(state_prep, num_qubits, qasm_header_str=None, save=None, qasm_include="stdgates_transmon_fixed_coupler.inc"):
|
|
249
|
+
'''
|
|
250
|
+
Generates a QASM script which does full N-qubit tomography
|
|
251
|
+
for a given state_prep, which is a string containing a QASM script for preparation
|
|
252
|
+
of a target state (for example, a two qubit Bell state).
|
|
253
|
+
|
|
254
|
+
The tomography is ordered such that the bases are measured according to the standard
|
|
255
|
+
arrangement of Pauli matrices:
|
|
256
|
+
II...I, II...X, II...Y, II...Z, ..., ZZ...Z
|
|
257
|
+
|
|
258
|
+
The start of the QASM script, with the include file, and the register setup. Defaults to:
|
|
259
|
+
f"""OPENQASM 3;
|
|
260
|
+
include "{qasm_include}";
|
|
261
|
+
|
|
262
|
+
bit[{((num_qubits*4)**num_qubits)/2}] c;
|
|
263
|
+
qubit[{num_qubits}] q;
|
|
264
|
+
"""
|
|
265
|
+
|
|
266
|
+
The qasm script is returned as a string, or can be saved as a file by passing a
|
|
267
|
+
filename to the save argument, for example: save="test.qasm".
|
|
268
|
+
'''
|
|
269
|
+
assert isinstance(num_qubits, int)
|
|
270
|
+
assert isinstance(state_prep, str)
|
|
271
|
+
#
|
|
272
|
+
N = int(num_qubits)
|
|
273
|
+
if qasm_header_str is None:
|
|
274
|
+
qasm_str = f'OPENQASM 3;\ninclude "{qasm_include}";\n\nbit[{int(((N*4)**N)/2)}] c;\nqubit[{N}] q;\n'
|
|
275
|
+
else:
|
|
276
|
+
qasm_str = qasm_header_str
|
|
277
|
+
|
|
278
|
+
paulis = sorted({'I', 'X', 'Y', 'Z'})
|
|
279
|
+
pauli_combinations = list(itertools.product(paulis, repeat=N))
|
|
280
|
+
# imports, register etc.
|
|
281
|
+
for m, bases in enumerate(pauli_combinations):
|
|
282
|
+
assert len(bases)==N
|
|
283
|
+
qasm_str += f"\n//"
|
|
284
|
+
for b in range(N):
|
|
285
|
+
qasm_str += f"{bases[b]}"
|
|
286
|
+
qasm_str += "\n" + state_prep + "delay[0] q;\n"
|
|
287
|
+
# do rotations to measure different bases
|
|
288
|
+
for q in range(N):
|
|
289
|
+
if bases[q]=='X':
|
|
290
|
+
qasm_str += f"ry(-pi/2) q[{q}];\n"
|
|
291
|
+
if bases[q]=='Y':
|
|
292
|
+
qasm_str += f"rx(pi/2) q[{q}];\n"
|
|
293
|
+
# add delay before measurements
|
|
294
|
+
qasm_str += "delay[0] q;\n"
|
|
295
|
+
# measures
|
|
296
|
+
for c in range(N):
|
|
297
|
+
if bases[c] != 'I':
|
|
298
|
+
qasm_str += f"c[{m*N + c}] = measure q[{c}];\n"
|
|
299
|
+
|
|
300
|
+
if save is not None:
|
|
301
|
+
assert isinstance(save, str)
|
|
302
|
+
if not save.endswith(".qasm"):
|
|
303
|
+
save += ".qasm"
|
|
304
|
+
with open(save, "w") as f:
|
|
305
|
+
f.write(qasm_str)
|
|
306
|
+
|
|
307
|
+
return qasm_str
|