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