sqdtoolz 0.9.3.dev1__tar.gz → 0.9.4.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.3.dev1 → sqdtoolz-0.9.4.dev1}/PKG-INFO +1 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/pyproject.toml +1 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSpecification.py +8 -0
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIBellStateFidelity.py +81 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBlobs.py +9 -0
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZICalibX.py +217 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons2QFixedCoupler.py +1 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZICryoscope.py +42 -37
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIDailyTuneup.py +258 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDispersive.py +13 -13
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDragScaling.py +19 -8
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIFixedCouplerTuneup.py +17 -3
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIPhaseCompensation2Q.py +212 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQASM.py +10 -5
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py +175 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabi.py +10 -9
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRandomisedBenchmarking.py +9 -7
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResOptimal.py +65 -33
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIResOptimalAmpSweepSS.py +259 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZISingleQubitTuneup.py +194 -81
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1.py +1 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZITWPATuneup.py +23 -15
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIqubit.py +1 -0
- sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ZI/phase_compensation_cz.py +290 -0
- sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ZI/sinlge_qubit_gates_sweep_chunking.py → sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates_sweep_chunking.py +1 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/SOFTqpu.py +32 -24
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/QuantumElements/TunableTransmonCouplerFixed.py +42 -8
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIQuantumElement.py +5 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIQubit.py +14 -8
- sqdtoolz-0.9.4.dev1/sqdtoolz/Utilities/DataDensityMatrix.py +499 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataIQDiscriminate.py +5 -2
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Miscellaneous.py +57 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ParserOpenQASM.py +27 -20
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/PKG-INFO +1 -1
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/SOURCES.txt +5 -1
- sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZICalibX.py +0 -142
- sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZIDailyTuneup.py +0 -132
- sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py +0 -67
- sqdtoolz-0.9.3.dev1/sqdtoolz/Utilities/DataDensityMatrix.py +0 -307
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/LICENSE +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/README.md +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/setup.cfg +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_ETH_FPGA.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_M4i_Digitiser.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_TektronixDSA70804B.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ATTEN_Vaunix.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/AWG5014C.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Agilent_N8241A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/DDG_DG645.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/DSO_DS1054Z.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Agilent_N8241A_constants_python3.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/PrologixGPIBEthernet.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/RPi_gpio_interface.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/RPi_serial_interface.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/M4i.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/regs.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/spcerr.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/pyspcm.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/teproteus.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/tevisainst.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/FGEN_FY6900.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_SGS100A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_SMB100A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2_RPi.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SA_RS_FSV.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_B2901A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_Keithley236.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_TENMA_72_2710.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_BJT_RPi.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_BJT_RPi_Multi.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_FPGA_VNA.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RFSwitchController_CryoRadiall.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RPiCryo.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RPiRadial.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RpiIQBox.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/THERM_TC0309.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Tabor_P2584M.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VNA_Agilent_N5232A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VNA_Keysight_P9373A.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_Delft_IVVI.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_IVVI_pyro.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_RpiMultiDAC.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_PLX.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_VCOM.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_pyro.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_Stahl_16CH.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ZILabOneQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyACQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyACQex.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyAWG.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyDDG.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyGENmwSource.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummySMU.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiment.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentConfiguration.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSpecifications/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSweeps.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpACstarkRamseyGE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpBodePlot.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibGE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrot.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrotAuto.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpGateBenchmarks.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpHahnGE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationLO.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationSB.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpPeakScouterIQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpPulsedCavitySpec.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpQubitFluxSweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRabi.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRamseyGE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRandomisedBenchmarking.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVs.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVsFast.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpSingleShotGE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpT1GE.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAEquations.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAoptimalSNR.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIActiveResetTuneup.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBenchmarkETH.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitFluxSweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitPowerSweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitSpec.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabiRamseyT1.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRamsey.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRes.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResFluxSweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResPowerSweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1SingleShot.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler_osc.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/cryo_scope.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/flux_scope.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/oqasm_scheduled_qubits.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_single_chevron.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_spectroscopy_gef.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates_sweep.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQdso.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQsa.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQvna.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/AWG.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DDG.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DataProcessor.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DecisionBlock.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Decisions/DEC_SVM.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENatten.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENfuncGen.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENmwSource.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENmwSrcAWG.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENsmu.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENswitch.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENswitchTrig.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENtherm.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENvoltSource.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/HALbase.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/LockableProperties.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/MultiACQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_AmpPhs.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ChannelArithmetic.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ConstantArithmetic.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_DDC.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Decimation.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Duplicate.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ESD.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FFT.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FIR.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Integrate.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Max.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Mean.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanBlock.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanVariance.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Rename.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Slice.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Variance.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_kMeans.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDC.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDCFIR.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Decimation.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FFT.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FIR.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Integrate.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Mean.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_MultiplierConst.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ChannelArithmetic.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ConstantArithmetic.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_DDC.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Decimation.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Duplicate.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ESD.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FFT.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FIR.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Integrate.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Max.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Mean.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_MeanBlock.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Rename.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Slice.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorCPU.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorFPGA.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorGPU.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/SOFTpid.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/TriggerPulse.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformGeneric.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformMapper.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformSegments.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformTransformations.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/QuantumElements/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIACQ.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIPulses.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIbase.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Laboratory.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataFitting.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataIQNormalise.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataQubitFlux.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataSingleShotThreshold.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/ExperimentViewer.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileConverter.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileIO.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileJSON.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Flattenator.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersJSONConfigZI.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersSoftQPUZI.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates.inc +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates_transmon_fixed_coupler.inc +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Optimisers.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/QubitGates.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/ResonatorTools.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/TimingPlots.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Variable.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/__init__.py +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/dependency_links.txt +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/requires.txt +0 -0
- {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sqdtoolz
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.4.dev1
|
|
4
4
|
Summary: toolbox to control and run experiments
|
|
5
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
|
|
@@ -93,6 +93,14 @@ class ExperimentSpecification:
|
|
|
93
93
|
obj = self._lab._get_resolved_obj(self._cur_mappings[cur_entry]['Destination'])
|
|
94
94
|
if obj != None:
|
|
95
95
|
setattr(obj, self._cur_mappings[cur_entry]['Property'], self._cur_mappings[cur_entry]['Value'])
|
|
96
|
+
|
|
97
|
+
def update_entries(self):
|
|
98
|
+
for cur_entry in self._cur_mappings:
|
|
99
|
+
if len(self._cur_mappings[cur_entry]['Destination']) == 0:
|
|
100
|
+
continue
|
|
101
|
+
obj = self._lab._get_resolved_obj(self._cur_mappings[cur_entry]['Destination'])
|
|
102
|
+
if obj != None:
|
|
103
|
+
self._cur_mappings[cur_entry]['Value'] = getattr(obj, self._cur_mappings[cur_entry]['Property'])
|
|
96
104
|
|
|
97
105
|
def _get_targets(self):
|
|
98
106
|
ret_targets = []
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from sqdtoolz.Experiments.Experimental.ExpZIqubit import ExpZIqubit
|
|
2
|
+
from sqdtoolz.Utilities.DataDensityMatrix import DataDensityMatrix
|
|
3
|
+
from sqdtoolz.Experiments.Experimental.ExpZIQASM import ExpZIQASM
|
|
4
|
+
from sqdtoolz.Experiments.Experimental.ExpZIQASMDataViewer import ExpZIQASMDataViewer
|
|
5
|
+
from sqdtoolz.Utilities.DataDensityMatrix import DataDensityMatrix
|
|
6
|
+
from sqdtoolz.HAL.ZI.QuantumElements import TunableTransmonCouplerFixed
|
|
7
|
+
|
|
8
|
+
class ExpZIBellStateFidelity(ExpZIqubit):
|
|
9
|
+
def __init__(self, name, expt_config, hal_QPU, qubit_ids, **kwargs):
|
|
10
|
+
|
|
11
|
+
assert len(qubit_ids)==2, "Must provide exactly two qubits in qubit_ids, e.g. ['Q0', 'Q2']."
|
|
12
|
+
|
|
13
|
+
self._name = name
|
|
14
|
+
self._qubit_ids = qubit_ids
|
|
15
|
+
self._hal_QPU = hal_QPU
|
|
16
|
+
self._config = expt_config
|
|
17
|
+
|
|
18
|
+
self._dont_show_plot = kwargs.pop('dont_show_plot', False)
|
|
19
|
+
self._update_coupler = kwargs.pop('update', True)
|
|
20
|
+
|
|
21
|
+
self._q1_object = self._hal_QPU.get_qubit_obj(qubit_ids[0])
|
|
22
|
+
self._q2_object = self._hal_QPU.get_qubit_obj(qubit_ids[1])
|
|
23
|
+
|
|
24
|
+
self._qasm_path = kwargs.pop('save_qasm_path', f'BellStateTomography{qubit_ids[0]}{qubit_ids[1]}.qasm')
|
|
25
|
+
|
|
26
|
+
kwargs['coordinate_system'] = kwargs.get('coordinate_system', 'RH')
|
|
27
|
+
assert kwargs['coordinate_system'] in ['LH', 'RH'], "The 'coordinate_system' must be either LH or RH for left/right handed."
|
|
28
|
+
|
|
29
|
+
state_prep = """reset q[0];
|
|
30
|
+
reset q[1];
|
|
31
|
+
h q[0];
|
|
32
|
+
h q[1];
|
|
33
|
+
cz q[0], q[1];
|
|
34
|
+
h q[1];
|
|
35
|
+
"""
|
|
36
|
+
print(f"Building QASM script...")
|
|
37
|
+
self._qasm_full = DataDensityMatrix.generate_tomography_qasm(state_prep, num_qubits=2, save=self._qasm_path)
|
|
38
|
+
|
|
39
|
+
self._file_path = None
|
|
40
|
+
self._purity = None
|
|
41
|
+
self._fidelity = None
|
|
42
|
+
|
|
43
|
+
def run(self, lab):
|
|
44
|
+
all_qubits = [i[0][0] for i in self._hal_QPU._qubits]
|
|
45
|
+
exp = ExpZIQASM(self._name, self._config, self._hal_QPU, all_qubits, self._qasm_path)
|
|
46
|
+
|
|
47
|
+
qregs = exp.get_qubit_regs()
|
|
48
|
+
exp.set_qubit_reg_to_ZI_mappings({('q',0): self._qubit_ids[1],('q',1): self._qubit_ids[0]})
|
|
49
|
+
assert len(qregs) <= len(self._qubit_ids), f"The QASM script needs {len(qregs)} while only {len(self._qubit_ids)} qubits have been specified."
|
|
50
|
+
|
|
51
|
+
lab.run_single(exp, override_ACQ_params={'AcquisitionMode': 'DISCRIMINATION', 'AveragingOrder': 'SingleShot'})
|
|
52
|
+
self._file_path = exp._file_path
|
|
53
|
+
|
|
54
|
+
def post_process(self, use_abs_phase=False, readout_correction=True, state='ge'):
|
|
55
|
+
# if readout_correction != None:
|
|
56
|
+
# self._readout_correction = readout_correction
|
|
57
|
+
|
|
58
|
+
#TODO: need to check this for the new readout configs
|
|
59
|
+
|
|
60
|
+
ledv = ExpZIQASMDataViewer(self._file_path)
|
|
61
|
+
ledv.get_inner_slicing_vars()
|
|
62
|
+
#
|
|
63
|
+
if readout_correction is True and self._q1_object.CorrectionMatrix is not None and self._q2_object.CorrectionMatrix is not None:
|
|
64
|
+
try:
|
|
65
|
+
leRho = DataDensityMatrix.fromDataViewer(ledv, readout_correction_matrices=[self._q1_object.CorrectionMatrix, self._q2_object.CorrectionMatrix])
|
|
66
|
+
except:
|
|
67
|
+
leRho = DataDensityMatrix.fromDataViewer(ledv, readout_correction_matrices=[self._q1_object.CorrectionMatrix, self._q2_object.CorrectionMatrix])
|
|
68
|
+
else:
|
|
69
|
+
pass
|
|
70
|
+
elif readout_correction:
|
|
71
|
+
print("Unable to apply readout correction as CorrectionMatrix was not found in qubit attributes. Please check the selected correction matrix (i.e. 'ge' or 'gef') is present. Continuing without readout correction.")
|
|
72
|
+
leRho = DataDensityMatrix.fromDataViewer(ledv)
|
|
73
|
+
else:
|
|
74
|
+
leRho = DataDensityMatrix.fromDataViewer(ledv)
|
|
75
|
+
self._fidelity = leRho.get_fidelity_pure_state([1,0,0,1])*100
|
|
76
|
+
leRho.plot3D([1,0,0,1], use_abs_phase=use_abs_phase, extra_title=f' - {self._qubit_ids[0]}{self._qubit_ids[1]}: $F={self._fidelity:.4f}$', save_path=self._file_path + 'BellState.png')
|
|
77
|
+
self._purity = leRho.get_purity()
|
|
78
|
+
if self._update_coupler:
|
|
79
|
+
cpl = self._hal_QPU.get_coupler_obj_from_qubits(self._qubit_ids[0], self._qubit_ids[1], TunableTransmonCouplerFixed)
|
|
80
|
+
cpl.FidelityBell = self._fidelity
|
|
81
|
+
|
|
@@ -81,3 +81,12 @@ class ExpZIBlobs(ExpZIqubit):
|
|
|
81
81
|
#
|
|
82
82
|
fig.suptitle(f"Average Fidelity: {leDIQD.get_average_fidelity()*100:.4g}% {extra_title}", y=0.92)
|
|
83
83
|
return fig
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def get_correction_matrices(self, update=False):
|
|
87
|
+
ret_mats = []
|
|
88
|
+
for m,qubit in enumerate(self._qubit_ids):
|
|
89
|
+
ret_mats.append(np.linalg.inv(self._leDIQDs[m].get_assignment_probabilities().T))
|
|
90
|
+
if update:
|
|
91
|
+
self._hal_QPU.get_qubit_obj(qubit).CorrectionMatrix = ret_mats[-1]
|
|
92
|
+
return ret_mats
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
from sqdtoolz.Experiments.Experimental.ExpZIqubit import ExpZIqubit
|
|
2
|
+
from sqdtoolz.Utilities.DataIQNormalise import DataIQNormalise
|
|
3
|
+
import matplotlib.pyplot as plt
|
|
4
|
+
from sqdtoolz.Utilities.DataFitting import*
|
|
5
|
+
from sqdtoolz.Utilities.Miscellaneous import Miscellaneous
|
|
6
|
+
from sqdtoolz.Experiments.Experimental.ZI import single_qubit_gates_sweep
|
|
7
|
+
import numpy as np
|
|
8
|
+
import scipy.optimize
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ExpZICalibX(ExpZIqubit):
|
|
12
|
+
def __init__(self, name, expt_config, hal_QPU, qubit_ids, calib_denominator=1, **kwargs):
|
|
13
|
+
self._qubit_datasets = qubit_ids
|
|
14
|
+
self._hal_QPU = hal_QPU
|
|
15
|
+
|
|
16
|
+
self._dont_show_plot = kwargs.pop('dont_show_plot', False)
|
|
17
|
+
assert (not 'update' in kwargs) or ('update' in kwargs and not kwargs['update']), "Don't set 'update=True'. The updates shall be done by calling update_qubit after running the experiment."
|
|
18
|
+
kwargs['update'] = False
|
|
19
|
+
self._fit_vals = []
|
|
20
|
+
self._fit_data = []
|
|
21
|
+
self._failed_qubits = []
|
|
22
|
+
self._cur_angle = 0.0
|
|
23
|
+
self._prev_angle = 0.0
|
|
24
|
+
self._only_every_n = kwargs.pop('only_every_n', 1)
|
|
25
|
+
assert calib_denominator in [1, 2], "Either supply 'calib_denominator' with 1 or 2 for X or X/2 gate calibration"
|
|
26
|
+
self._calib_denominator = calib_denominator
|
|
27
|
+
self._num_gates = kwargs.pop('num_gates', 20)
|
|
28
|
+
|
|
29
|
+
self._expected_corr_sign = kwargs.pop('expected_corr_sign', None)
|
|
30
|
+
assert self._expected_corr_sign in (None, 1, -1, 1.0, -1.0), "expected_corr_sign must be None, 1 or -1"
|
|
31
|
+
|
|
32
|
+
if calib_denominator == 2:
|
|
33
|
+
gate_label = 'X/2'
|
|
34
|
+
else:
|
|
35
|
+
gate_label = 'X'
|
|
36
|
+
|
|
37
|
+
kwargs['gate_lists'] = [[[gate_label] * n for _ in range(len(qubit_ids))] for n in range(1, self._num_gates + 1) if n % self._only_every_n == 0]
|
|
38
|
+
|
|
39
|
+
self._n_vals = np.array([n for n in range(1, self._num_gates + 1) if n % self._only_every_n == 0])
|
|
40
|
+
assert len(self._n_vals) >= 4, (
|
|
41
|
+
f"only_every_n={self._only_every_n} with num_gates={self._num_gates} leaves only "
|
|
42
|
+
f"{len(self._n_vals)} gate-count point(s) -- need at least 4 for a reliable fit. "
|
|
43
|
+
"Reduce only_every_n or increase num_gates."
|
|
44
|
+
)
|
|
45
|
+
super().__init__(name, expt_config, single_qubit_gates_sweep, hal_QPU, qubit_ids, **kwargs)
|
|
46
|
+
|
|
47
|
+
def _model_func(self, n_vals, corr_pct, decay_per_100):
|
|
48
|
+
if self._calib_denominator == 2:
|
|
49
|
+
return np.sin((n_vals - 1) * (1 + corr_pct / 100) * np.pi / 2) \
|
|
50
|
+
* np.exp(-(n_vals - 1) / (decay_per_100 * 100)) / 2 + 0.5
|
|
51
|
+
else:
|
|
52
|
+
return np.cos((n_vals - 1) * (1 + corr_pct / 100) * np.pi) \
|
|
53
|
+
* np.exp(-(n_vals - 1) / (decay_per_100 * 100)) / 2 + 0.5
|
|
54
|
+
|
|
55
|
+
def _fit_single_qubit(self, qubit_dataset):
|
|
56
|
+
leData = self.retrieve_last_dataset(qubit_dataset)
|
|
57
|
+
arr = leData.get_numpy_array()
|
|
58
|
+
assert self._normalise_data, "No point analysing this without normalised data..."
|
|
59
|
+
|
|
60
|
+
# Get calibration data
|
|
61
|
+
calib_file = qubit_dataset + '_calib'
|
|
62
|
+
leDataCalib = self.retrieve_last_dataset(calib_file)
|
|
63
|
+
dnorm = ExpZIqubit.normalise_qubit_data(leDataCalib, self._transition)
|
|
64
|
+
pop_probs = dnorm.normalise_data(arr)
|
|
65
|
+
|
|
66
|
+
n_vals = self._n_vals
|
|
67
|
+
|
|
68
|
+
# bounds
|
|
69
|
+
if self._expected_corr_sign == 1 or self._expected_corr_sign == 1.0:
|
|
70
|
+
corr_bounds = (0.0, 10.0)
|
|
71
|
+
elif self._expected_corr_sign == -1 or self._expected_corr_sign == -1.0:
|
|
72
|
+
corr_bounds = (-10.0, 0.0)
|
|
73
|
+
else:
|
|
74
|
+
corr_bounds = (-10.0, 10.0)
|
|
75
|
+
decay_bounds = (0.1, 20.0) #TODO: check this bound
|
|
76
|
+
|
|
77
|
+
# initial guess
|
|
78
|
+
corr_grid = np.linspace(*corr_bounds, 801)
|
|
79
|
+
decay_grid = np.geomspace(*decay_bounds, 25)
|
|
80
|
+
best_cost, best_guess = np.inf, (0.0, 1.0)
|
|
81
|
+
for decay in decay_grid:
|
|
82
|
+
residuals = pop_probs[None, :] - self._model_func(n_vals[None, :], corr_grid[:, None], decay)
|
|
83
|
+
costs = np.sum(residuals ** 2, axis=1)
|
|
84
|
+
i = np.argmin(costs)
|
|
85
|
+
if costs[i] < best_cost:
|
|
86
|
+
best_cost, best_guess = costs[i], (corr_grid[i], decay)
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
popt, pcov = scipy.optimize.curve_fit(
|
|
90
|
+
self._model_func, n_vals, pop_probs, p0=best_guess,
|
|
91
|
+
bounds=([corr_bounds[0], decay_bounds[0]], [corr_bounds[1], decay_bounds[1]]),
|
|
92
|
+
method='trf', maxfev=20000,
|
|
93
|
+
)
|
|
94
|
+
perr = np.sqrt(np.diag(pcov)) if np.all(np.isfinite(pcov)) else (np.nan, np.nan)
|
|
95
|
+
except RuntimeError as e:
|
|
96
|
+
raise RuntimeError(f"curve_fit failed to converge from grid guess {best_guess}: {e}")
|
|
97
|
+
|
|
98
|
+
fit_data = {'Gate': 'X/2' if self._calib_denominator == 2 else 'X'}
|
|
99
|
+
fit_data['Corr_Fac_Pct'] = popt[0]
|
|
100
|
+
fit_data['Corr_Fac_Pct_err'] = perr[0]
|
|
101
|
+
fit_data['Gate_Decay_per_100'] = popt[1]
|
|
102
|
+
fit_data['Gate_Decay_per_100_err'] = perr[1]
|
|
103
|
+
|
|
104
|
+
# --- Goodness-of-fit / sanity checks --------------------------------
|
|
105
|
+
fitted = self._model_func(n_vals, *popt)
|
|
106
|
+
ss_res = np.sum((pop_probs - fitted) ** 2)
|
|
107
|
+
ss_tot = np.sum((pop_probs - np.mean(pop_probs)) ** 2)
|
|
108
|
+
r_squared = 1 - ss_res / ss_tot if ss_tot > 0 else np.nan
|
|
109
|
+
fit_data['r_squared'] = r_squared
|
|
110
|
+
|
|
111
|
+
pinned = (np.isclose(popt[0], corr_bounds, atol=0.05).any()
|
|
112
|
+
or np.isclose(popt[1], decay_bounds, atol=0.05).any())
|
|
113
|
+
if pinned:
|
|
114
|
+
print(f"Fit for '{qubit_dataset}' has a parameter at its bound (corr={popt[0]:.3f}%, decay={popt[1]:.3f}/100) -- do not trust this calibration without inspecting the plot.")
|
|
115
|
+
if not np.isnan(r_squared) and r_squared < 0.8:
|
|
116
|
+
print(f"Poor fit quality for '{qubit_dataset}' (R^2={r_squared:.3f}). Inspect fitted_plot_{qubit_dataset}.png before trusting this correction factor.")
|
|
117
|
+
|
|
118
|
+
if (1 + popt[0] / 100) < 1:
|
|
119
|
+
fit_data['Gate_Corr_Fac'] = float(1 / (1 + popt[0] / 100))
|
|
120
|
+
else:
|
|
121
|
+
fit_data['Gate_Corr_Fac'] = 2 - float(1 / (1 + popt[0] / 100))
|
|
122
|
+
|
|
123
|
+
fig, ax = plt.subplots(1)
|
|
124
|
+
ax.plot(n_vals, pop_probs, 'o-')
|
|
125
|
+
ax.plot(n_vals, fitted, 'ro')
|
|
126
|
+
ax.set_xlabel('Number of Gates (n)')
|
|
127
|
+
ax.set_ylabel(r'Normalised $e$-Population')
|
|
128
|
+
if self._calib_denominator == 2:
|
|
129
|
+
cur_angle = (1 + popt[0] / 100) * 90
|
|
130
|
+
# self._prev_angle = (1 + popt[0] / 100) * 90
|
|
131
|
+
ax.set_title(f"Actual X/2 angle: {cur_angle:.6f}\n"
|
|
132
|
+
f"Previous angle: {self._prev_angle:.6f}")
|
|
133
|
+
else:
|
|
134
|
+
cur_angle = (1 + popt[0] / 100) * 180
|
|
135
|
+
# self._prev_angle = (1 + popt[0] / 100) * 180
|
|
136
|
+
ax.set_title(f"Actual X angle: {cur_angle:.6f}\n"
|
|
137
|
+
f"Previous angle: {self._prev_angle:.6f}")
|
|
138
|
+
self._prev_angle = cur_angle
|
|
139
|
+
fit_data['angle'] = cur_angle
|
|
140
|
+
ax.legend(['Raw', 'Fit'])
|
|
141
|
+
fig.savefig(self._file_path + f'fitted_plot_{qubit_dataset}.png')
|
|
142
|
+
if not self._dont_show_plot:
|
|
143
|
+
fig.show()
|
|
144
|
+
else:
|
|
145
|
+
plt.close(fig)
|
|
146
|
+
|
|
147
|
+
fit_data['n_vals'] = n_vals
|
|
148
|
+
np.save(self._file_path + f'fitted_data_{qubit_dataset}.npy', fit_data)
|
|
149
|
+
fit_data['pop_probs'] = pop_probs
|
|
150
|
+
fit_data['fitted_pop_probs'] = fitted
|
|
151
|
+
fit_data['calib_denominator'] = self._calib_denominator
|
|
152
|
+
return fit_data
|
|
153
|
+
|
|
154
|
+
def _post_process(self, data):
|
|
155
|
+
self._fit_vals = []
|
|
156
|
+
self._fit_data = []
|
|
157
|
+
self._failed_qubits = []
|
|
158
|
+
for qubit_dataset in self._qubit_datasets:
|
|
159
|
+
try:
|
|
160
|
+
fit_data = self._fit_single_qubit(qubit_dataset)
|
|
161
|
+
except Exception as e:
|
|
162
|
+
print(f"[ExpZICalibX] ERROR: fit failed for qubit '{qubit_dataset}': {e}")
|
|
163
|
+
self._failed_qubits.append(qubit_dataset)
|
|
164
|
+
self._fit_data.append({'qubit_name': qubit_dataset, 'data': None, 'error': str(e)})
|
|
165
|
+
continue
|
|
166
|
+
self._fit_data.append({'qubit_name': qubit_dataset, 'data': fit_data})
|
|
167
|
+
#TODO: Generalise it for EF later?
|
|
168
|
+
self._fit_vals.append({'qubit_obj': self._hal_QPU.get_qubit_obj(qubit_dataset),
|
|
169
|
+
'Gate_Corr_Fac': fit_data['Gate_Corr_Fac']})
|
|
170
|
+
if self._failed_qubits:
|
|
171
|
+
print(f"[ExpZICalibX] {len(self._failed_qubits)} qubit(s) have no usable fit and will "
|
|
172
|
+
f"be skipped by update_qubits: {self._failed_qubits}")
|
|
173
|
+
|
|
174
|
+
@staticmethod
|
|
175
|
+
def plot_fitted_results(ax, data: dict, qubit_name=None):
|
|
176
|
+
if 'n_vals' in data:
|
|
177
|
+
data_x = data['n_vals']
|
|
178
|
+
else:
|
|
179
|
+
# Fallback for fit_data saved by an older version of this class that
|
|
180
|
+
# didn't record n_vals: this reproduces the OLD x-axis --
|
|
181
|
+
print("[ExpZICalibX] WARNING: 'n_vals' not found in saved fit data "
|
|
182
|
+
"(this was fitted with an older version) -- plotting against "
|
|
183
|
+
"iteration index, which is only correct if only_every_n was 1.")
|
|
184
|
+
data_x = np.arange(0, len(data['pop_probs']), 1)
|
|
185
|
+
data_y = data['pop_probs']
|
|
186
|
+
fit = data['fitted_pop_probs']
|
|
187
|
+
ax.set_ylabel(r'Normalised $e$-Population')
|
|
188
|
+
ax.set_xlabel('Gates')
|
|
189
|
+
ax.grid(visible=True, which='minor'); ax.grid(visible=True, which='major', color='k')
|
|
190
|
+
ax.plot(data_x, data_y, 'kx')
|
|
191
|
+
ax.plot(data_x, fit, 'ro-', lw=1)
|
|
192
|
+
if qubit_name is not None:
|
|
193
|
+
qstring = f'{qubit_name} '
|
|
194
|
+
else:
|
|
195
|
+
qstring = ''
|
|
196
|
+
# r2 = data.get('r_squared', None)
|
|
197
|
+
# r2_str = f" (R^2={r2:.3f})" if r2 is not None and not np.isnan(r2) else ""
|
|
198
|
+
if data['calib_denominator'] == 2:
|
|
199
|
+
ax.set_title(f"{qstring}Actual X/2 angle: {data['angle']:.6f}")
|
|
200
|
+
else:
|
|
201
|
+
ax.set_title(f"{qstring}Actual X angle: {data['angle']:.6f}")
|
|
202
|
+
ax.legend(['Raw', 'Fit'])
|
|
203
|
+
|
|
204
|
+
def update_qubits(self, reverse_parity=False):
|
|
205
|
+
assert len(self._fit_vals) > 0, "Must run ExpZICalibX Experiment before qubits can be updated."
|
|
206
|
+
if self._failed_qubits:
|
|
207
|
+
print(f"[ExpZICalibX] Skipping update for qubit(s) with no usable fit: {self._failed_qubits}")
|
|
208
|
+
while len(self._fit_vals) > 0:
|
|
209
|
+
cur_fit = self._fit_vals.pop(0)
|
|
210
|
+
if reverse_parity:
|
|
211
|
+
correction = 2 - cur_fit['Gate_Corr_Fac']
|
|
212
|
+
else:
|
|
213
|
+
correction = cur_fit['Gate_Corr_Fac']
|
|
214
|
+
if self._calib_denominator == 2:
|
|
215
|
+
cur_fit['qubit_obj'].DriveGEAmplitudeXon2 *= correction
|
|
216
|
+
elif self._calib_denominator == 1:
|
|
217
|
+
cur_fit['qubit_obj'].DriveGEAmplitudeX *= correction
|
|
@@ -17,6 +17,7 @@ class ExpZIChevrons2QFixedCoupler(ExpZIqubit):
|
|
|
17
17
|
self._fit_freq = None
|
|
18
18
|
assert 'amplitudes' in kwargs, "Must supply the array of flux amplitudes to sweep on the coupler."
|
|
19
19
|
self._amplitudes = kwargs.pop('amplitudes')
|
|
20
|
+
assert np.min(self._amplitudes) >= -1 and np.max(self._amplitudes) <= 1, f"Magnitude of a value in the amplitude sweep is above unity ({np.min(self._amplitudes):.2f} t0 {np.max(self._amplitudes):.2f})."
|
|
20
21
|
self._plot_with_frequency = kwargs.pop('plot_with_frequency', True)
|
|
21
22
|
|
|
22
23
|
self.cur_coupler_obj = hal_QPU.get_coupler_obj_from_qubits(qubit_ids[0],qubit_ids[1], TunableTransmonCouplerFixed)
|
{sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZICryoscope.py
RENAMED
|
@@ -30,7 +30,7 @@ class ExpZICryoscope:
|
|
|
30
30
|
assert len(self._qubit_ids) >1 , "Also must define a second qubit as it will attempt to optimise a pulse specific to each coupler element"
|
|
31
31
|
|
|
32
32
|
self._amplitudes = kwargs.pop('amplitudes', np.linspace(0.3, 0.3, 1))
|
|
33
|
-
self._lengths = kwargs.pop('lengths', np.
|
|
33
|
+
self._lengths = kwargs.pop('lengths', np.arange(0.0, 300e-9, (1/2.0)*1e-9))
|
|
34
34
|
self._transition = kwargs.pop('transition', 'ge')
|
|
35
35
|
|
|
36
36
|
self._normalise_data = kwargs.pop('normalise_data', True)
|
|
@@ -44,42 +44,47 @@ class ExpZICryoscope:
|
|
|
44
44
|
assert self.Ec_over_h is not None, "Must provide Ec_over_h for the qubit to convert frequency shift to flux for pulse reconstruction."
|
|
45
45
|
self.norm_window = kwargs.pop('norm_window', None)
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
47
|
+
def run(self, lab):
|
|
48
|
+
kwargs = self._kwargs
|
|
49
|
+
qubit = self._qubit_ids[0]
|
|
50
|
+
|
|
51
|
+
lab.group_open(self._name)
|
|
52
|
+
# x90 - measures <Y>
|
|
53
|
+
exp_X = ExpZIqubit(f'cryoscope_{qubit}_X90', self._expt_config, cryo_scope, self._hal_QPU, self._qubit_ids,
|
|
54
|
+
lengths=self._lengths,
|
|
55
|
+
amplitudes=self._amplitudes,
|
|
56
|
+
y90=False,
|
|
57
|
+
**self._kwargs
|
|
58
|
+
)
|
|
59
|
+
lab.run_single(exp_X, **kwargs)
|
|
60
|
+
#
|
|
61
|
+
dataX90 = exp_X.retrieve_last_dataset(qubit)
|
|
62
|
+
if self._normalise_data:
|
|
63
|
+
self.data['calibX'] = exp_X.retrieve_last_dataset(qubit+'_calib')
|
|
64
|
+
|
|
65
|
+
# y90 - measures <X>
|
|
66
|
+
exp_Y = ExpZIqubit(f'cryoscope_{qubit}_Y90', self._expt_config, cryo_scope, self._hal_QPU, self._qubit_ids,
|
|
67
|
+
lengths=self._lengths,
|
|
68
|
+
amplitudes=self._amplitudes,
|
|
69
|
+
y90=True,
|
|
70
|
+
**self._kwargs
|
|
71
|
+
)
|
|
72
|
+
lab.run_single(exp_Y, **kwargs)
|
|
73
|
+
#
|
|
74
|
+
dataY90 = exp_Y.retrieve_last_dataset(qubit)
|
|
75
|
+
if self._normalise_data:
|
|
76
|
+
self.data['calibY'] = exp_Y.retrieve_last_dataset(qubit+'_calib')
|
|
77
|
+
|
|
78
|
+
lab.group_close()
|
|
79
|
+
|
|
80
|
+
self.data['Y'] = dataX90.get_numpy_array()
|
|
81
|
+
self.data['X'] = dataY90.get_numpy_array()
|
|
82
|
+
self.data['tau'] = dataX90.param_vals[1]
|
|
83
|
+
self.data['amplitude'] = dataX90.param_vals[0]
|
|
84
|
+
|
|
85
|
+
self.post_process()
|
|
86
|
+
self.plot_summary()
|
|
87
|
+
self.fit_step_response()
|
|
83
88
|
|
|
84
89
|
def post_process(self, filter_window_length=7, polyorder=2):
|
|
85
90
|
assert isinstance(filter_window_length, int) and filter_window_length > 0, "filter_window_length must be a positive integer"
|