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.
Files changed (242) hide show
  1. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/PKG-INFO +1 -1
  2. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/pyproject.toml +1 -1
  3. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSpecification.py +8 -0
  4. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIBellStateFidelity.py +81 -0
  5. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBlobs.py +9 -0
  6. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZICalibX.py +217 -0
  7. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons2QFixedCoupler.py +1 -0
  8. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZICryoscope.py +42 -37
  9. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIDailyTuneup.py +258 -0
  10. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDispersive.py +13 -13
  11. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIDragScaling.py +19 -8
  12. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIFixedCouplerTuneup.py +17 -3
  13. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIPhaseCompensation2Q.py +212 -0
  14. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQASM.py +10 -5
  15. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py +175 -0
  16. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabi.py +10 -9
  17. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRandomisedBenchmarking.py +9 -7
  18. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResOptimal.py +65 -33
  19. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ExpZIResOptimalAmpSweepSS.py +259 -0
  20. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZISingleQubitTuneup.py +194 -81
  21. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1.py +1 -1
  22. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZITWPATuneup.py +23 -15
  23. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIqubit.py +1 -0
  24. sqdtoolz-0.9.4.dev1/sqdtoolz/Experiments/Experimental/ZI/phase_compensation_cz.py +290 -0
  25. 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
  26. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/SOFTqpu.py +32 -24
  27. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/QuantumElements/TunableTransmonCouplerFixed.py +42 -8
  28. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIQuantumElement.py +5 -1
  29. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIQubit.py +14 -8
  30. sqdtoolz-0.9.4.dev1/sqdtoolz/Utilities/DataDensityMatrix.py +499 -0
  31. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataIQDiscriminate.py +5 -2
  32. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Miscellaneous.py +57 -0
  33. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ParserOpenQASM.py +27 -20
  34. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/PKG-INFO +1 -1
  35. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/SOURCES.txt +5 -1
  36. sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZICalibX.py +0 -142
  37. sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZIDailyTuneup.py +0 -132
  38. sqdtoolz-0.9.3.dev1/sqdtoolz/Experiments/Experimental/ExpZIQASMDataViewer.py +0 -67
  39. sqdtoolz-0.9.3.dev1/sqdtoolz/Utilities/DataDensityMatrix.py +0 -307
  40. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/LICENSE +0 -0
  41. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/README.md +0 -0
  42. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/setup.cfg +0 -0
  43. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_ETH_FPGA.py +0 -0
  44. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_M4i_Digitiser.py +0 -0
  45. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ACQ_TektronixDSA70804B.py +0 -0
  46. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ATTEN_Vaunix.py +0 -0
  47. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/AWG5014C.py +0 -0
  48. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Agilent_N8241A.py +0 -0
  49. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/DDG_DG645.py +0 -0
  50. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/DSO_DS1054Z.py +0 -0
  51. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Agilent_N8241A_constants_python3.py +0 -0
  52. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/PrologixGPIBEthernet.py +0 -0
  53. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/RPi_gpio_interface.py +0 -0
  54. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/RPi_serial_interface.py +0 -0
  55. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/M4i.py +0 -0
  56. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/__init__.py +0 -0
  57. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/__init__.py +0 -0
  58. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/regs.py +0 -0
  59. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/py_header/spcerr.py +0 -0
  60. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/Spectrum/pyspcm.py +0 -0
  61. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/teproteus.py +0 -0
  62. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Dependencies/tevisainst.py +0 -0
  63. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/FGEN_FY6900.py +0 -0
  64. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_SGS100A.py +0 -0
  65. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_SMB100A.py +0 -0
  66. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2.py +0 -0
  67. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/MWS_WFSynthHDProV2_RPi.py +0 -0
  68. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SA_RS_FSV.py +0 -0
  69. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_B2901A.py +0 -0
  70. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_Keithley236.py +0 -0
  71. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SMU_TENMA_72_2710.py +0 -0
  72. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_BJT_RPi.py +0 -0
  73. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_BJT_RPi_Multi.py +0 -0
  74. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_FPGA_VNA.py +0 -0
  75. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RFSwitchController_CryoRadiall.py +0 -0
  76. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RPiCryo.py +0 -0
  77. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RPiRadial.py +0 -0
  78. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/SW_RpiIQBox.py +0 -0
  79. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/THERM_TC0309.py +0 -0
  80. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/Tabor_P2584M.py +0 -0
  81. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VNA_Agilent_N5232A.py +0 -0
  82. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VNA_Keysight_P9373A.py +0 -0
  83. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_Delft_IVVI.py +0 -0
  84. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_IVVI_pyro.py +0 -0
  85. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_RpiMultiDAC.py +0 -0
  86. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_PLX.py +0 -0
  87. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_VCOM.py +0 -0
  88. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_SIM928_pyro.py +0 -0
  89. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/VOLT_Stahl_16CH.py +0 -0
  90. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/ZILabOneQ.py +0 -0
  91. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/__init__.py +0 -0
  92. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyACQ.py +0 -0
  93. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyACQex.py +0 -0
  94. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyAWG.py +0 -0
  95. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyDDG.py +0 -0
  96. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummyGENmwSource.py +0 -0
  97. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Drivers/dummySMU.py +0 -0
  98. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiment.py +0 -0
  99. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentConfiguration.py +0 -0
  100. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSpecifications/__init__.py +0 -0
  101. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/ExperimentSweeps.py +0 -0
  102. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpACstarkRamseyGE.py +0 -0
  103. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpBodePlot.py +0 -0
  104. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibGE.py +0 -0
  105. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrot.py +0 -0
  106. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpCalibXrotAuto.py +0 -0
  107. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpGateBenchmarks.py +0 -0
  108. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpHahnGE.py +0 -0
  109. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationLO.py +0 -0
  110. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpMixerCalibrationSB.py +0 -0
  111. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpPeakScouterIQ.py +0 -0
  112. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpPulsedCavitySpec.py +0 -0
  113. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpQubitFluxSweep.py +0 -0
  114. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRabi.py +0 -0
  115. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRamseyGE.py +0 -0
  116. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpRandomisedBenchmarking.py +0 -0
  117. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVs.py +0 -0
  118. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpResistanceIVsFast.py +0 -0
  119. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpSingleShotGE.py +0 -0
  120. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpT1GE.py +0 -0
  121. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAEquations.py +0 -0
  122. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpVNAoptimalSNR.py +0 -0
  123. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIActiveResetTuneup.py +0 -0
  124. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIBenchmarkETH.py +0 -0
  125. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIChevrons.py +0 -0
  126. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitFluxSweep.py +0 -0
  127. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitPowerSweep.py +0 -0
  128. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIQubitSpec.py +0 -0
  129. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRabiRamseyT1.py +0 -0
  130. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRamsey.py +0 -0
  131. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIRes.py +0 -0
  132. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResFluxSweep.py +0 -0
  133. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIResPowerSweep.py +0 -0
  134. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ExpZIT1SingleShot.py +0 -0
  135. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler.py +0 -0
  136. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/calibrate_tunable_transmon_fixed_coupler_osc.py +0 -0
  137. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/cryo_scope.py +0 -0
  138. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/flux_scope.py +0 -0
  139. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/oqasm_scheduled_qubits.py +0 -0
  140. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_single_chevron.py +0 -0
  141. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/qubit_spectroscopy_gef.py +0 -0
  142. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates.py +0 -0
  143. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Experiments/Experimental/ZI/single_qubit_gates_sweep.py +0 -0
  144. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQ.py +0 -0
  145. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQdso.py +0 -0
  146. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQsa.py +0 -0
  147. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ACQvna.py +0 -0
  148. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/AWG.py +0 -0
  149. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DDG.py +0 -0
  150. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DataProcessor.py +0 -0
  151. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/DecisionBlock.py +0 -0
  152. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Decisions/DEC_SVM.py +0 -0
  153. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENatten.py +0 -0
  154. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENfuncGen.py +0 -0
  155. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENmwSource.py +0 -0
  156. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENmwSrcAWG.py +0 -0
  157. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENsmu.py +0 -0
  158. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENswitch.py +0 -0
  159. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENswitchTrig.py +0 -0
  160. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENtherm.py +0 -0
  161. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/GENvoltSource.py +0 -0
  162. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/HALbase.py +0 -0
  163. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/LockableProperties.py +0 -0
  164. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/MultiACQ.py +0 -0
  165. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_AmpPhs.py +0 -0
  166. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ChannelArithmetic.py +0 -0
  167. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ConstantArithmetic.py +0 -0
  168. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_DDC.py +0 -0
  169. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Decimation.py +0 -0
  170. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Duplicate.py +0 -0
  171. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_ESD.py +0 -0
  172. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FFT.py +0 -0
  173. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_FIR.py +0 -0
  174. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Integrate.py +0 -0
  175. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Max.py +0 -0
  176. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Mean.py +0 -0
  177. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanBlock.py +0 -0
  178. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_MeanVariance.py +0 -0
  179. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Rename.py +0 -0
  180. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Slice.py +0 -0
  181. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_Variance.py +0 -0
  182. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/CPU/CPU_kMeans.py +0 -0
  183. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDC.py +0 -0
  184. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_DDCFIR.py +0 -0
  185. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Decimation.py +0 -0
  186. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FFT.py +0 -0
  187. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_FIR.py +0 -0
  188. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Integrate.py +0 -0
  189. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_Mean.py +0 -0
  190. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/FPGA/FPGA_MultiplierConst.py +0 -0
  191. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ChannelArithmetic.py +0 -0
  192. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ConstantArithmetic.py +0 -0
  193. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_DDC.py +0 -0
  194. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Decimation.py +0 -0
  195. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Duplicate.py +0 -0
  196. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_ESD.py +0 -0
  197. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FFT.py +0 -0
  198. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_FIR.py +0 -0
  199. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Integrate.py +0 -0
  200. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Max.py +0 -0
  201. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Mean.py +0 -0
  202. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_MeanBlock.py +0 -0
  203. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Rename.py +0 -0
  204. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/GPU/GPU_Slice.py +0 -0
  205. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorCPU.py +0 -0
  206. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorFPGA.py +0 -0
  207. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/Processors/ProcessorGPU.py +0 -0
  208. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/SOFTpid.py +0 -0
  209. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/TriggerPulse.py +0 -0
  210. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformGeneric.py +0 -0
  211. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformMapper.py +0 -0
  212. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformSegments.py +0 -0
  213. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/WaveformTransformations.py +0 -0
  214. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/QuantumElements/__init__.py +0 -0
  215. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIACQ.py +0 -0
  216. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIPulses.py +0 -0
  217. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/ZIbase.py +0 -0
  218. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/HAL/ZI/__init__.py +0 -0
  219. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Laboratory.py +0 -0
  220. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataFitting.py +0 -0
  221. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataIQNormalise.py +0 -0
  222. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataQubitFlux.py +0 -0
  223. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/DataSingleShotThreshold.py +0 -0
  224. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/ExperimentViewer.py +0 -0
  225. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileConverter.py +0 -0
  226. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileIO.py +0 -0
  227. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/FileJSON.py +0 -0
  228. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Flattenator.py +0 -0
  229. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersJSONConfigZI.py +0 -0
  230. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/ScheduleParametersSoftQPUZI.py +0 -0
  231. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/__init__.py +0 -0
  232. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates.inc +0 -0
  233. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/OpenQASM/includes/stdgates_transmon_fixed_coupler.inc +0 -0
  234. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/Optimisers.py +0 -0
  235. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/QubitGates.py +0 -0
  236. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/ResonatorTools.py +0 -0
  237. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Utilities/TimingPlots.py +0 -0
  238. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/Variable.py +0 -0
  239. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz/__init__.py +0 -0
  240. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/dependency_links.txt +0 -0
  241. {sqdtoolz-0.9.3.dev1 → sqdtoolz-0.9.4.dev1}/sqdtoolz.egg-info/requires.txt +0 -0
  242. {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.dev1
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sqdtoolz"
7
- version = "0.9.3.dev1"
7
+ version = "0.9.4.dev1"
8
8
  description = "toolbox to control and run experiments"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -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)
@@ -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.linspace(0.0, 300e-9, (1/2.0)*1e-9))
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
- def run(self, lab):
48
- qubit = self._qubit_ids[0]
49
-
50
- lab.group_open(self._name)
51
- # x90 - measures <Y>
52
- exp_X = ExpZIqubit(f'cryoscope_{qubit}_X90', self._expt_config, cryo_scope, self._hal_QPU, self._qubit_ids,
53
- lengths=self._lengths,
54
- amplitudes=self._amplitudes,
55
- y90=False,
56
- **self._kwargs
57
- )
58
- lab.run_single(exp_X, **kwargs)
59
- #
60
- dataX90 = exp_X.retrieve_last_dataset(qubit)
61
- if self._normalise_data:
62
- self.data['calibX'] = exp_X.retrieve_last_dataset(qubit+'_calib')
63
-
64
- # y90 - measures <X>
65
- exp_Y = ExpZIqubit(f'cryoscope_{qubit}_Y90', self._expt_config, cryo_scope, self._hal_QPU, self._qubit_ids,
66
- lengths=self._lengths,
67
- amplitudes=self._amplitudes,
68
- y90=True,
69
- **self._kwargs
70
- )
71
- lab.run_single(exp_Y, **kwargs)
72
- #
73
- dataY90 = exp_Y.retrieve_last_dataset(qubit)
74
- if self._normalise_data:
75
- self.data['calibY'] = exp_Y.retrieve_last_dataset(qubit+'_calib')
76
-
77
- lab.group_close()
78
-
79
- self.data['Y'] = dataX90.get_numpy_array()
80
- self.data['X'] = dataY90.get_numpy_array()
81
- self.data['tau'] = dataX90.param_vals[1]
82
- self.data['amplitude'] = dataX90.param_vals[0]
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"