qsharp-lang 1.15.4-dev → 1.16.1-dev

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 (326) hide show
  1. package/dist/browser.d.ts +2 -2
  2. package/dist/compiler/compiler.d.ts +3 -1
  3. package/dist/compiler/compiler.js +5 -1
  4. package/dist/samples.generated.js +1 -1
  5. package/dist/utils.d.ts +8 -0
  6. package/dist/utils.js +22 -8
  7. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  8. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  9. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  10. package/docs/Std.Arithmetic/AddLE.md +1 -1
  11. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  12. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  19. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  21. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  22. package/docs/Std.Arithmetic/IncByI.md +1 -1
  23. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  24. package/docs/Std.Arithmetic/IncByL.md +1 -1
  25. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  26. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  27. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  28. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  29. package/docs/Std.Arithmetic/MAJ.md +1 -1
  30. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  31. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  32. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  33. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  34. package/docs/Std.Arithmetic/index.md +1 -1
  35. package/docs/Std.Arrays/All.md +1 -1
  36. package/docs/Std.Arrays/Any.md +1 -1
  37. package/docs/Std.Arrays/Chunks.md +1 -1
  38. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  39. package/docs/Std.Arrays/ColumnAt.md +1 -1
  40. package/docs/Std.Arrays/Count.md +1 -1
  41. package/docs/Std.Arrays/Diagonal.md +1 -1
  42. package/docs/Std.Arrays/DrawMany.md +1 -1
  43. package/docs/Std.Arrays/Enumerated.md +1 -1
  44. package/docs/Std.Arrays/Excluding.md +1 -1
  45. package/docs/Std.Arrays/Filtered.md +1 -1
  46. package/docs/Std.Arrays/FlatMapped.md +1 -1
  47. package/docs/Std.Arrays/Flattened.md +1 -1
  48. package/docs/Std.Arrays/Fold.md +1 -1
  49. package/docs/Std.Arrays/ForEach.md +1 -1
  50. package/docs/Std.Arrays/Head.md +1 -1
  51. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  52. package/docs/Std.Arrays/IndexOf.md +1 -1
  53. package/docs/Std.Arrays/IndexRange.md +1 -1
  54. package/docs/Std.Arrays/Interleaved.md +1 -1
  55. package/docs/Std.Arrays/IsEmpty.md +1 -1
  56. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  57. package/docs/Std.Arrays/IsSorted.md +1 -1
  58. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  59. package/docs/Std.Arrays/Mapped.md +1 -1
  60. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  61. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  62. package/docs/Std.Arrays/Most.md +1 -1
  63. package/docs/Std.Arrays/MostAndTail.md +1 -1
  64. package/docs/Std.Arrays/Padded.md +1 -1
  65. package/docs/Std.Arrays/Partitioned.md +1 -1
  66. package/docs/Std.Arrays/Rest.md +1 -1
  67. package/docs/Std.Arrays/Reversed.md +1 -1
  68. package/docs/Std.Arrays/SequenceI.md +1 -1
  69. package/docs/Std.Arrays/SequenceL.md +1 -1
  70. package/docs/Std.Arrays/Sorted.md +1 -1
  71. package/docs/Std.Arrays/Subarray.md +1 -1
  72. package/docs/Std.Arrays/Swapped.md +1 -1
  73. package/docs/Std.Arrays/Tail.md +1 -1
  74. package/docs/Std.Arrays/Transposed.md +1 -1
  75. package/docs/Std.Arrays/Unzipped.md +1 -1
  76. package/docs/Std.Arrays/Where.md +1 -1
  77. package/docs/Std.Arrays/Windows.md +1 -1
  78. package/docs/Std.Arrays/Zipped.md +1 -1
  79. package/docs/Std.Arrays/index.md +1 -1
  80. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  81. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  82. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  83. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  84. package/docs/Std.Canon/ApplyP.md +1 -1
  85. package/docs/Std.Canon/ApplyPauli.md +1 -1
  86. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  87. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  88. package/docs/Std.Canon/ApplyQFT.md +1 -1
  89. package/docs/Std.Canon/ApplyToEach.md +1 -1
  90. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  91. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  92. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  93. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  94. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  95. package/docs/Std.Canon/CX.md +1 -1
  96. package/docs/Std.Canon/CY.md +1 -1
  97. package/docs/Std.Canon/CZ.md +1 -1
  98. package/docs/Std.Canon/Fst.md +1 -1
  99. package/docs/Std.Canon/Relabel.md +1 -1
  100. package/docs/Std.Canon/Snd.md +1 -1
  101. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  102. package/docs/Std.Canon/index.md +1 -1
  103. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  104. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  105. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  106. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  107. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  108. package/docs/Std.Convert/BoolAsResult.md +1 -1
  109. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  110. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  111. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  112. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  113. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  114. package/docs/Std.Convert/IntAsDouble.md +1 -1
  115. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  116. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  117. package/docs/Std.Convert/ResultAsBool.md +1 -1
  118. package/docs/Std.Convert/index.md +1 -1
  119. package/docs/Std.Core/Length.md +1 -1
  120. package/docs/Std.Core/Repeated.md +1 -1
  121. package/docs/Std.Core/index.md +1 -1
  122. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  123. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  124. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  125. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  126. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  127. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  128. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  129. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  130. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  131. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  132. package/docs/Std.Diagnostics/Fact.md +1 -1
  133. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  134. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  135. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  136. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  137. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  138. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  139. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  140. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  141. package/docs/Std.Diagnostics/index.md +1 -1
  142. package/docs/Std.Intrinsic/AND.md +1 -1
  143. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  144. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  145. package/docs/Std.Intrinsic/CNOT.md +1 -1
  146. package/docs/Std.Intrinsic/Exp.md +1 -1
  147. package/docs/Std.Intrinsic/H.md +1 -1
  148. package/docs/Std.Intrinsic/I.md +1 -1
  149. package/docs/Std.Intrinsic/M.md +1 -1
  150. package/docs/Std.Intrinsic/Measure.md +1 -1
  151. package/docs/Std.Intrinsic/Message.md +1 -1
  152. package/docs/Std.Intrinsic/R.md +1 -1
  153. package/docs/Std.Intrinsic/R1.md +1 -1
  154. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  155. package/docs/Std.Intrinsic/RFrac.md +1 -1
  156. package/docs/Std.Intrinsic/Reset.md +1 -1
  157. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  158. package/docs/Std.Intrinsic/Rx.md +1 -1
  159. package/docs/Std.Intrinsic/Rxx.md +1 -1
  160. package/docs/Std.Intrinsic/Ry.md +1 -1
  161. package/docs/Std.Intrinsic/Ryy.md +1 -1
  162. package/docs/Std.Intrinsic/Rz.md +1 -1
  163. package/docs/Std.Intrinsic/Rzz.md +1 -1
  164. package/docs/Std.Intrinsic/S.md +1 -1
  165. package/docs/Std.Intrinsic/SWAP.md +1 -1
  166. package/docs/Std.Intrinsic/SX.md +38 -0
  167. package/docs/Std.Intrinsic/T.md +1 -1
  168. package/docs/Std.Intrinsic/X.md +1 -1
  169. package/docs/Std.Intrinsic/Y.md +1 -1
  170. package/docs/Std.Intrinsic/Z.md +1 -1
  171. package/docs/Std.Intrinsic/index.md +2 -1
  172. package/docs/Std.Logical/Xor.md +1 -1
  173. package/docs/Std.Logical/index.md +1 -1
  174. package/docs/Std.Math/AbsComplex.md +1 -1
  175. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  176. package/docs/Std.Math/AbsD.md +1 -1
  177. package/docs/Std.Math/AbsI.md +1 -1
  178. package/docs/Std.Math/AbsL.md +1 -1
  179. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  180. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  181. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  182. package/docs/Std.Math/ArcCos.md +1 -1
  183. package/docs/Std.Math/ArcCosh.md +1 -1
  184. package/docs/Std.Math/ArcSin.md +1 -1
  185. package/docs/Std.Math/ArcSinh.md +1 -1
  186. package/docs/Std.Math/ArcTan.md +1 -1
  187. package/docs/Std.Math/ArcTan2.md +1 -1
  188. package/docs/Std.Math/ArcTanh.md +1 -1
  189. package/docs/Std.Math/ArgComplex.md +1 -1
  190. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  191. package/docs/Std.Math/Binom.md +1 -1
  192. package/docs/Std.Math/BitSizeI.md +1 -1
  193. package/docs/Std.Math/BitSizeL.md +1 -1
  194. package/docs/Std.Math/Ceiling.md +1 -1
  195. package/docs/Std.Math/Complex.md +1 -1
  196. package/docs/Std.Math/ComplexPolar.md +1 -1
  197. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  198. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  199. package/docs/Std.Math/Cos.md +1 -1
  200. package/docs/Std.Math/Cosh.md +1 -1
  201. package/docs/Std.Math/DivRemI.md +1 -1
  202. package/docs/Std.Math/DivRemL.md +1 -1
  203. package/docs/Std.Math/DividedByC.md +1 -1
  204. package/docs/Std.Math/DividedByCP.md +1 -1
  205. package/docs/Std.Math/E.md +1 -1
  206. package/docs/Std.Math/ExpModI.md +1 -1
  207. package/docs/Std.Math/ExpModL.md +1 -1
  208. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  209. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  210. package/docs/Std.Math/FactorialI.md +1 -1
  211. package/docs/Std.Math/FactorialL.md +1 -1
  212. package/docs/Std.Math/Floor.md +1 -1
  213. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  214. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  215. package/docs/Std.Math/HammingWeightI.md +1 -1
  216. package/docs/Std.Math/InverseModI.md +1 -1
  217. package/docs/Std.Math/InverseModL.md +1 -1
  218. package/docs/Std.Math/IsCoprimeI.md +1 -1
  219. package/docs/Std.Math/IsCoprimeL.md +1 -1
  220. package/docs/Std.Math/IsInfinite.md +1 -1
  221. package/docs/Std.Math/IsNaN.md +1 -1
  222. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  223. package/docs/Std.Math/Lg.md +1 -1
  224. package/docs/Std.Math/Log.md +1 -1
  225. package/docs/Std.Math/Log10.md +1 -1
  226. package/docs/Std.Math/LogFactorialD.md +1 -1
  227. package/docs/Std.Math/LogGammaD.md +1 -1
  228. package/docs/Std.Math/LogOf2.md +1 -1
  229. package/docs/Std.Math/Max.md +1 -1
  230. package/docs/Std.Math/MaxD.md +1 -1
  231. package/docs/Std.Math/MaxI.md +1 -1
  232. package/docs/Std.Math/MaxL.md +1 -1
  233. package/docs/Std.Math/Min.md +1 -1
  234. package/docs/Std.Math/MinD.md +1 -1
  235. package/docs/Std.Math/MinI.md +1 -1
  236. package/docs/Std.Math/MinL.md +1 -1
  237. package/docs/Std.Math/MinusC.md +1 -1
  238. package/docs/Std.Math/MinusCP.md +1 -1
  239. package/docs/Std.Math/ModulusI.md +1 -1
  240. package/docs/Std.Math/ModulusL.md +1 -1
  241. package/docs/Std.Math/NegationC.md +1 -1
  242. package/docs/Std.Math/NegationCP.md +1 -1
  243. package/docs/Std.Math/PI.md +1 -1
  244. package/docs/Std.Math/PNorm.md +1 -1
  245. package/docs/Std.Math/PNormalized.md +1 -1
  246. package/docs/Std.Math/PlusC.md +1 -1
  247. package/docs/Std.Math/PlusCP.md +1 -1
  248. package/docs/Std.Math/PowC.md +1 -1
  249. package/docs/Std.Math/PowCP.md +1 -1
  250. package/docs/Std.Math/RealMod.md +1 -1
  251. package/docs/Std.Math/Round.md +1 -1
  252. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  253. package/docs/Std.Math/SignD.md +1 -1
  254. package/docs/Std.Math/SignI.md +1 -1
  255. package/docs/Std.Math/SignL.md +1 -1
  256. package/docs/Std.Math/Sin.md +1 -1
  257. package/docs/Std.Math/Sinh.md +1 -1
  258. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  259. package/docs/Std.Math/Sqrt.md +1 -1
  260. package/docs/Std.Math/SquaredNorm.md +1 -1
  261. package/docs/Std.Math/Tan.md +1 -1
  262. package/docs/Std.Math/Tanh.md +1 -1
  263. package/docs/Std.Math/TimesC.md +1 -1
  264. package/docs/Std.Math/TimesCP.md +1 -1
  265. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  266. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  267. package/docs/Std.Math/Truncate.md +1 -1
  268. package/docs/Std.Math/index.md +1 -1
  269. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  270. package/docs/Std.Measurement/MResetX.md +1 -1
  271. package/docs/Std.Measurement/MResetY.md +1 -1
  272. package/docs/Std.Measurement/MResetZ.md +1 -1
  273. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  274. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  275. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  276. package/docs/Std.Measurement/index.md +1 -1
  277. package/docs/Std.Random/DrawRandomBool.md +1 -1
  278. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  279. package/docs/Std.Random/DrawRandomInt.md +1 -1
  280. package/docs/Std.Random/index.md +1 -1
  281. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  282. package/docs/Std.Range/RangeEnd.md +1 -1
  283. package/docs/Std.Range/RangeReverse.md +1 -1
  284. package/docs/Std.Range/RangeStart.md +1 -1
  285. package/docs/Std.Range/RangeStep.md +1 -1
  286. package/docs/Std.Range/index.md +1 -1
  287. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  288. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  289. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  290. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  291. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  292. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  293. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  294. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  295. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  296. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  297. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  298. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  299. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  300. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  301. package/docs/Std.ResourceEstimation/index.md +1 -1
  302. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  303. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  304. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  305. package/docs/Std.StatePreparation/index.md +1 -1
  306. package/docs/Std.TableLookup/Select.md +1 -1
  307. package/docs/Std.TableLookup/index.md +1 -1
  308. package/docs/index.md +1 -1
  309. package/docs/toc.yml +1 -0
  310. package/lib/node/qsc_wasm.cjs +22 -4
  311. package/lib/node/qsc_wasm.d.cts +10 -0
  312. package/lib/node/qsc_wasm_bg.wasm +0 -0
  313. package/lib/web/qsc_wasm.d.ts +11 -0
  314. package/lib/web/qsc_wasm.js +21 -4
  315. package/lib/web/qsc_wasm_bg.wasm +0 -0
  316. package/package.json +1 -1
  317. package/ux/circuit-vis/circuitManipulation.ts +145 -48
  318. package/ux/circuit-vis/contextMenu.ts +1 -1
  319. package/ux/circuit-vis/draggable.ts +288 -112
  320. package/ux/circuit-vis/events.ts +433 -199
  321. package/ux/circuit-vis/formatters/inputFormatter.ts +9 -4
  322. package/ux/circuit-vis/panel.ts +37 -34
  323. package/ux/circuit-vis/process.ts +1 -1
  324. package/ux/circuit-vis/sqore.ts +2 -2
  325. package/ux/circuit-vis/utils.ts +17 -1
  326. package/ux/qsharp-circuit.css +2 -35
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.ResourceEstimation.RotationCount
3
3
  title: RotationCount function
4
4
  description: "Q# RotationCount function: Returns a tuple that can be passed to the `AccountForEstimates` operation to specify that the number of rotations is equal to the `amount`."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: function
8
8
  qsharp.package: __Std__
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.ResourceEstimation.RotationDepth
3
3
  title: RotationDepth function
4
4
  description: "Q# RotationDepth function: Returns a tuple that can be passed to the `AccountForEstimates` operation to specify that the rotation depth is equal to the `amount`."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: function
8
8
  qsharp.package: __Std__
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.ResourceEstimation.SingleVariant
3
3
  title: SingleVariant function
4
4
  description: "Q# SingleVariant function: Used to specify that there's only one execution variant in `BeginEstimateCaching` function"
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: function
8
8
  qsharp.package: __Std__
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.ResourceEstimation.TCount
3
3
  title: TCount function
4
4
  description: "Q# TCount function: Returns a tuple that can be passed to the `AccountForEstimates` operation to specify that the number of the T gates is equal to the `amount`."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: function
8
8
  qsharp.package: __Std__
@@ -4,7 +4,7 @@ title: Std.ResourceEstimation namespace
4
4
  description: Table of contents for the Q# ResourceEstimation namespace
5
5
  author: {AUTHOR}
6
6
  ms.author: {MS_AUTHOR}
7
- ms.date: 04/30/2025
7
+ ms.date: 05/12/2025
8
8
  ms.topic: landing-page
9
9
  ---
10
10
 
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.StatePreparation.ApproximatelyPreparePureStateCP
3
3
  title: ApproximatelyPreparePureStateCP operation
4
4
  description: "Q# ApproximatelyPreparePureStateCP operation: Given a set of coefficients and a big-endian quantum register, prepares a state on that register described by the given coefficients, up to a given approximation tolerance."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: operation
8
8
  qsharp.package: __Std__
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.StatePreparation.PreparePureStateD
3
3
  title: PreparePureStateD operation
4
4
  description: "Q# PreparePureStateD operation: Given a set of coefficients and a big-endian quantum register, prepares a state on that register described by the given coefficients."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: operation
8
8
  qsharp.package: __Std__
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.StatePreparation.PrepareUniformSuperposition
3
3
  title: PrepareUniformSuperposition operation
4
4
  description: "Q# PrepareUniformSuperposition operation: Prepares a uniform superposition of states that represent integers 0 through `nStates - 1` in a little-endian `qubits` register."
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: operation
8
8
  qsharp.package: __Std__
@@ -4,7 +4,7 @@ title: Std.StatePreparation namespace
4
4
  description: Table of contents for the Q# StatePreparation namespace
5
5
  author: {AUTHOR}
6
6
  ms.author: {MS_AUTHOR}
7
- ms.date: 04/30/2025
7
+ ms.date: 05/12/2025
8
8
  ms.topic: landing-page
9
9
  ---
10
10
 
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.TableLookup.Select
3
3
  title: Select operation
4
4
  description: "Q# Select operation: Performs table lookup using a SELECT network"
5
- ms.date: 04/30/2025
5
+ ms.date: 05/12/2025
6
6
  ms.topic: managed-reference
7
7
  qsharp.kind: operation
8
8
  qsharp.package: __Std__
@@ -4,7 +4,7 @@ title: Std.TableLookup namespace
4
4
  description: Table of contents for the Q# TableLookup namespace
5
5
  author: {AUTHOR}
6
6
  ms.author: {MS_AUTHOR}
7
- ms.date: 04/30/2025
7
+ ms.date: 05/12/2025
8
8
  ms.topic: landing-page
9
9
  ---
10
10
 
package/docs/index.md CHANGED
@@ -4,7 +4,7 @@ title: Q# standard libraries for the Azure Quantum Development Kit
4
4
  description: Table of contents for the Q# standard libraries for Azure Quantum Development Kit
5
5
  author: {AUTHOR}
6
6
  ms.author: {MS_AUTHOR}
7
- ms.date: 04/30/2025
7
+ ms.date: 05/12/2025
8
8
  ms.topic: landing-page
9
9
  ---
10
10
 
package/docs/toc.yml CHANGED
@@ -187,6 +187,7 @@
187
187
  - {name: Rzz, uid: Qdk.Std.Intrinsic.Rzz}
188
188
  - {name: S, uid: Qdk.Std.Intrinsic.S}
189
189
  - {name: SWAP, uid: Qdk.Std.Intrinsic.SWAP}
190
+ - {name: SX, uid: Qdk.Std.Intrinsic.SX}
190
191
  - {name: T, uid: Qdk.Std.Intrinsic.T}
191
192
  - {name: X, uid: Qdk.Std.Intrinsic.X}
192
193
  - {name: Y, uid: Qdk.Std.Intrinsic.Y}
@@ -611,7 +611,7 @@ function __wbg_adapter_52(arg0, arg1, arg2) {
611
611
  wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2));
612
612
  }
613
613
 
614
- function __wbg_adapter_198(arg0, arg1, arg2, arg3) {
614
+ function __wbg_adapter_201(arg0, arg1, arg2, arg3) {
615
615
  wasm.__wbindgen_export_6(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
616
616
  }
617
617
 
@@ -1093,6 +1093,16 @@ class ProjectLoader {
1093
1093
  const ret = wasm.projectloader_load_project_with_deps(this.__wbg_ptr, ptr0, len0);
1094
1094
  return takeObject(ret);
1095
1095
  }
1096
+ /**
1097
+ * @param {string} file_path
1098
+ * @returns {Promise<IProjectConfig>}
1099
+ */
1100
+ load_openqasm_project(file_path) {
1101
+ const ptr0 = passStringToWasm0(file_path, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1);
1102
+ const len0 = WASM_VECTOR_LEN;
1103
+ const ret = wasm.projectloader_load_openqasm_project(this.__wbg_ptr, ptr0, len0);
1104
+ return takeObject(ret);
1105
+ }
1096
1106
  }
1097
1107
  module.exports.ProjectLoader = ProjectLoader;
1098
1108
 
@@ -1279,7 +1289,7 @@ module.exports.__wbg_new_07527e5c188e7771 = function(arg0, arg1) {
1279
1289
  const a = state0.a;
1280
1290
  state0.a = 0;
1281
1291
  try {
1282
- return __wbg_adapter_198(a, state0.b, arg0, arg1);
1292
+ return __wbg_adapter_201(a, state0.b, arg0, arg1);
1283
1293
  } finally {
1284
1294
  state0.a = a;
1285
1295
  }
@@ -1364,6 +1374,14 @@ module.exports.__wbg_profile_35b65d3ebe7ebbee = function(arg0, arg1) {
1364
1374
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
1365
1375
  };
1366
1376
 
1377
+ module.exports.__wbg_projectType_2bf93409ae72a803 = function(arg0, arg1) {
1378
+ const ret = getObject(arg1).projectType;
1379
+ const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1);
1380
+ const len1 = WASM_VECTOR_LEN;
1381
+ getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
1382
+ getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
1383
+ };
1384
+
1367
1385
  module.exports.__wbg_queueMicrotask_98e746b9f850fe3d = function(arg0) {
1368
1386
  queueMicrotask(getObject(arg0));
1369
1387
  };
@@ -1499,8 +1517,8 @@ module.exports.__wbindgen_cb_drop = function(arg0) {
1499
1517
  return ret;
1500
1518
  };
1501
1519
 
1502
- module.exports.__wbindgen_closure_wrapper955 = function(arg0, arg1, arg2) {
1503
- const ret = makeMutClosure(arg0, arg1, 387, __wbg_adapter_52);
1520
+ module.exports.__wbindgen_closure_wrapper1003 = function(arg0, arg1, arg2) {
1521
+ const ret = makeMutClosure(arg0, arg1, 392, __wbg_adapter_52);
1504
1522
  return addHeapObject(ret);
1505
1523
  };
1506
1524
 
@@ -210,6 +210,7 @@ export interface IProjectHost {
210
210
  export interface IProgramConfig {
211
211
  packageGraphSources: IPackageGraphSources;
212
212
  profile: TargetProfile;
213
+ projectType: ProjectType;
213
214
  }
214
215
 
215
216
 
@@ -242,6 +243,10 @@ export interface IProjectConfig {
242
243
  packageGraphSources: IPackageGraphSources;
243
244
  lints: ({ lint: string; level: string } | { group: string; level: string })[];
244
245
  errors: string[];
246
+ /**
247
+ * The type of project. This is used to determine how to load the project.
248
+ */
249
+ projectType: ProjectType;
245
250
  }
246
251
 
247
252
  export interface ITestDescriptor {
@@ -265,6 +270,10 @@ export type TargetProfile = "base" | "adaptive_ri" | "adaptive_rif" | "unrestric
265
270
  export type LanguageFeatures = "v2-preview-syntax";
266
271
 
267
272
 
273
+
274
+ export type ProjectType = "qsharp" | "openqasm";
275
+
276
+
268
277
  export class DebugService {
269
278
  free(): void;
270
279
  constructor();
@@ -308,4 +317,5 @@ export class ProjectLoader {
308
317
  free(): void;
309
318
  constructor(project_host: IProjectHost);
310
319
  load_project_with_deps(directory: string): Promise<IProjectConfig>;
320
+ load_openqasm_project(file_path: string): Promise<IProjectConfig>;
311
321
  }
Binary file
@@ -210,6 +210,7 @@ export interface IProjectHost {
210
210
  export interface IProgramConfig {
211
211
  packageGraphSources: IPackageGraphSources;
212
212
  profile: TargetProfile;
213
+ projectType: ProjectType;
213
214
  }
214
215
 
215
216
 
@@ -242,6 +243,10 @@ export interface IProjectConfig {
242
243
  packageGraphSources: IPackageGraphSources;
243
244
  lints: ({ lint: string; level: string } | { group: string; level: string })[];
244
245
  errors: string[];
246
+ /**
247
+ * The type of project. This is used to determine how to load the project.
248
+ */
249
+ projectType: ProjectType;
245
250
  }
246
251
 
247
252
  export interface ITestDescriptor {
@@ -265,6 +270,10 @@ export type TargetProfile = "base" | "adaptive_ri" | "adaptive_rif" | "unrestric
265
270
  export type LanguageFeatures = "v2-preview-syntax";
266
271
 
267
272
 
273
+
274
+ export type ProjectType = "qsharp" | "openqasm";
275
+
276
+
268
277
  export class DebugService {
269
278
  free(): void;
270
279
  constructor();
@@ -308,6 +317,7 @@ export class ProjectLoader {
308
317
  free(): void;
309
318
  constructor(project_host: IProjectHost);
310
319
  load_project_with_deps(directory: string): Promise<IProjectConfig>;
320
+ load_openqasm_project(file_path: string): Promise<IProjectConfig>;
311
321
  }
312
322
 
313
323
  export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
@@ -350,6 +360,7 @@ export interface InitOutput {
350
360
  readonly __wbg_projectloader_free: (a: number, b: number) => void;
351
361
  readonly projectloader_new: (a: number) => number;
352
362
  readonly projectloader_load_project_with_deps: (a: number, b: number, c: number) => number;
363
+ readonly projectloader_load_openqasm_project: (a: number, b: number, c: number) => number;
353
364
  readonly git_hash: (a: number) => void;
354
365
  readonly get_qir: (a: number, b: number) => void;
355
366
  readonly get_estimates: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
@@ -607,7 +607,7 @@ function __wbg_adapter_52(arg0, arg1, arg2) {
607
607
  wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2));
608
608
  }
609
609
 
610
- function __wbg_adapter_198(arg0, arg1, arg2, arg3) {
610
+ function __wbg_adapter_201(arg0, arg1, arg2, arg3) {
611
611
  wasm.__wbindgen_export_6(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
612
612
  }
613
613
 
@@ -1087,6 +1087,16 @@ export class ProjectLoader {
1087
1087
  const ret = wasm.projectloader_load_project_with_deps(this.__wbg_ptr, ptr0, len0);
1088
1088
  return takeObject(ret);
1089
1089
  }
1090
+ /**
1091
+ * @param {string} file_path
1092
+ * @returns {Promise<IProjectConfig>}
1093
+ */
1094
+ load_openqasm_project(file_path) {
1095
+ const ptr0 = passStringToWasm0(file_path, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1);
1096
+ const len0 = WASM_VECTOR_LEN;
1097
+ const ret = wasm.projectloader_load_openqasm_project(this.__wbg_ptr, ptr0, len0);
1098
+ return takeObject(ret);
1099
+ }
1090
1100
  }
1091
1101
 
1092
1102
  async function __wbg_load(module, imports) {
@@ -1276,7 +1286,7 @@ function __wbg_get_imports() {
1276
1286
  const a = state0.a;
1277
1287
  state0.a = 0;
1278
1288
  try {
1279
- return __wbg_adapter_198(a, state0.b, arg0, arg1);
1289
+ return __wbg_adapter_201(a, state0.b, arg0, arg1);
1280
1290
  } finally {
1281
1291
  state0.a = a;
1282
1292
  }
@@ -1346,6 +1356,13 @@ function __wbg_get_imports() {
1346
1356
  getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
1347
1357
  getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
1348
1358
  };
1359
+ imports.wbg.__wbg_projectType_2bf93409ae72a803 = function(arg0, arg1) {
1360
+ const ret = getObject(arg1).projectType;
1361
+ const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1);
1362
+ const len1 = WASM_VECTOR_LEN;
1363
+ getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
1364
+ getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
1365
+ };
1349
1366
  imports.wbg.__wbg_queueMicrotask_98e746b9f850fe3d = function(arg0) {
1350
1367
  queueMicrotask(getObject(arg0));
1351
1368
  };
@@ -1455,8 +1472,8 @@ function __wbg_get_imports() {
1455
1472
  const ret = false;
1456
1473
  return ret;
1457
1474
  };
1458
- imports.wbg.__wbindgen_closure_wrapper955 = function(arg0, arg1, arg2) {
1459
- const ret = makeMutClosure(arg0, arg1, 387, __wbg_adapter_52);
1475
+ imports.wbg.__wbindgen_closure_wrapper1003 = function(arg0, arg1, arg2) {
1476
+ const ret = makeMutClosure(arg0, arg1, 392, __wbg_adapter_52);
1460
1477
  return addHeapObject(ret);
1461
1478
  };
1462
1479
  imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {
Binary file
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "qsharp-lang",
3
3
  "description": "qsharp language package for quantum development",
4
- "version": "1.15.4-dev",
4
+ "version": "1.16.1-dev",
5
5
  "license": "MIT",
6
6
  "engines": {
7
7
  "node": ">=16.17.0"
@@ -1,7 +1,8 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
3
 
4
- import { ComponentGrid, Operation, Unitary } from "./circuit";
4
+ import { getOperationRegisters } from "../../src/utils";
5
+ import { Column, ComponentGrid, Operation, Unitary } from "./circuit";
5
6
  import { CircuitEvents } from "./events";
6
7
  import { Register } from "./register";
7
8
  import {
@@ -45,6 +46,8 @@ const moveOperation = (
45
46
  JSON.stringify(originalOperation),
46
47
  );
47
48
 
49
+ _ensureQubitCount(circuitEvents, targetWire);
50
+
48
51
  // Update operation's targets and controls
49
52
  _moveY(
50
53
  circuitEvents,
@@ -70,6 +73,7 @@ const moveOperation = (
70
73
  );
71
74
  if (sourceOperationParent == null) return null;
72
75
  _removeOp(circuitEvents, originalOperation, sourceOperationParent);
76
+ removeTrailingUnusedQubits(circuitEvents);
73
77
 
74
78
  return newSourceOperation;
75
79
  };
@@ -254,6 +258,8 @@ const addOperation = (
254
258
  newSourceOperation.targets = [{ qubit: targetWire }];
255
259
  }
256
260
 
261
+ _ensureQubitCount(circuitEvents, targetWire);
262
+
257
263
  _addOp(
258
264
  circuitEvents,
259
265
  newSourceOperation,
@@ -286,29 +292,32 @@ const removeOperation = (
286
292
 
287
293
  if (sourceOperation == null || sourceOperationParent == null) return null;
288
294
 
289
- // Delete sourceOperation
290
295
  _removeOp(circuitEvents, sourceOperation, sourceOperationParent);
296
+ removeTrailingUnusedQubits(circuitEvents);
291
297
  };
292
298
 
293
299
  /**
294
- * Find and remove operations in-place based on a predicate function.
300
+ * Find and remove operations in-place that return `true` for a predicate function.
295
301
  *
296
- * @param componentGrid The grid of components to search through.
302
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
297
303
  * @param pred The predicate function to determine which operations to remove.
298
304
  */
299
305
  const findAndRemoveOperations = (
300
- componentGrid: ComponentGrid,
306
+ circuitEvents: CircuitEvents,
301
307
  pred: (op: Operation) => boolean,
302
308
  ) => {
303
- const inPlaceFilter = (
304
- grid: ComponentGrid,
305
- pred: (op: Operation) => boolean,
306
- ) => {
309
+ // Remove operations that are true for the predicate function
310
+ const inPlaceFilter = (grid: ComponentGrid) => {
307
311
  let i = 0;
308
312
  while (i < grid.length) {
309
313
  let j = 0;
310
314
  while (j < grid[i].components.length) {
311
- if (!pred(grid[i].components[j])) {
315
+ const op = grid[i].components[j];
316
+ if (op.children) {
317
+ inPlaceFilter(op.children);
318
+ }
319
+ if (pred(op)) {
320
+ circuitEvents.decrementQubitUseCountForOp(op);
312
321
  grid[i].components.splice(j, 1);
313
322
  } else {
314
323
  j++;
@@ -322,25 +331,22 @@ const findAndRemoveOperations = (
322
331
  }
323
332
  };
324
333
 
325
- const recursivePred = (op: Operation) => {
326
- if (pred(op)) return true;
327
- if (op.children) {
328
- inPlaceFilter(op.children, (child) => !recursivePred(child));
329
- }
330
- return false;
331
- };
332
-
333
- inPlaceFilter(componentGrid, (op) => !recursivePred(op));
334
+ inPlaceFilter(circuitEvents.componentGrid);
334
335
  };
335
336
 
336
337
  /**
337
338
  * Add a control to the specified operation on the given wire index.
338
339
  *
340
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
339
341
  * @param op The unitary operation to which the control will be added.
340
342
  * @param wireIndex The index of the wire where the control will be added.
341
343
  * @returns True if the control was added, false if it already existed.
342
344
  */
343
- const addControl = (op: Unitary, wireIndex: number): boolean => {
345
+ const addControl = (
346
+ circuitEvents: CircuitEvents,
347
+ op: Unitary,
348
+ wireIndex: number,
349
+ ): boolean => {
344
350
  if (!op.controls) {
345
351
  op.controls = [];
346
352
  }
@@ -350,6 +356,8 @@ const addControl = (op: Unitary, wireIndex: number): boolean => {
350
356
  if (!existingControl) {
351
357
  op.controls.push({ qubit: wireIndex });
352
358
  op.controls.sort((a, b) => a.qubit - b.qubit);
359
+ _ensureQubitCount(circuitEvents, wireIndex);
360
+ circuitEvents.qubitUseCounts[wireIndex]++;
353
361
  return true;
354
362
  }
355
363
  return false;
@@ -358,23 +366,112 @@ const addControl = (op: Unitary, wireIndex: number): boolean => {
358
366
  /**
359
367
  * Remove a control from the specified operation on the given wire index.
360
368
  *
369
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
361
370
  * @param op The unitary operation from which the control will be removed.
362
371
  * @param wireIndex The index of the wire where the control will be removed.
363
372
  * @returns True if the control was removed, false if it did not exist.
364
373
  */
365
- const removeControl = (op: Unitary, wireIndex: number): boolean => {
374
+ const removeControl = (
375
+ circuitEvents: CircuitEvents,
376
+ op: Unitary,
377
+ wireIndex: number,
378
+ ): boolean => {
366
379
  if (op.controls) {
367
380
  const controlIndex = op.controls.findIndex(
368
381
  (control) => control.qubit === wireIndex,
369
382
  );
370
383
  if (controlIndex !== -1) {
371
384
  op.controls.splice(controlIndex, 1);
385
+ circuitEvents.qubitUseCounts[wireIndex]--;
386
+ if (wireIndex === circuitEvents.qubits.length - 1) {
387
+ removeTrailingUnusedQubits(circuitEvents);
388
+ }
372
389
  return true;
373
390
  }
374
391
  }
375
392
  return false;
376
393
  };
377
394
 
395
+ /**
396
+ * Resolves overlapping operations in each column of the component grid.
397
+ * For each column, splits overlapping operations into separate columns so that
398
+ * no two operations in the same column overlap on their register ranges.
399
+ * Modifies the component grid in-place.
400
+ *
401
+ * @param parentArray The component grid (array of columns) to process.
402
+ */
403
+ const resolveOverlappingOperations = (parentArray: ComponentGrid): void => {
404
+ // Helper to resolve a single column into non-overlapping columns
405
+ const resolveColumn = (col: Column): Column[] => {
406
+ const newColumn: Column = { components: [] };
407
+ let [lastMin, lastMax] = [-1, -1];
408
+ let i = 0;
409
+ while (i < col.components.length) {
410
+ const op = col.components[i];
411
+ const [currMin, currMax] = _getMinMaxRegIdx(op);
412
+ // Sets up the first operation for comparison or if the current operation doesn't overlap
413
+ if (i === 0 || !_doesOverlap([lastMin, lastMax], [currMin, currMax])) {
414
+ [lastMin, lastMax] = [currMin, currMax];
415
+ i++;
416
+ } else {
417
+ // If they overlap, add the current operation to the new column
418
+ newColumn.components.push(op);
419
+ col.components.splice(i, 1);
420
+ }
421
+ }
422
+ if (newColumn.components.length > 0) {
423
+ const newColumns = resolveColumn(newColumn);
424
+ newColumns.push(col);
425
+ return newColumns;
426
+ } else {
427
+ return [col];
428
+ }
429
+ };
430
+
431
+ // In-place update of parentArray
432
+ let i = 0;
433
+ while (i < parentArray.length) {
434
+ const col = parentArray[i];
435
+ const newColumns = resolveColumn(col);
436
+ if (newColumns.length > 1) {
437
+ parentArray.splice(i, 1, ...newColumns);
438
+ i += newColumns.length;
439
+ }
440
+ i++;
441
+ }
442
+ };
443
+
444
+ /**
445
+ * Remove trailing unused qubits from the circuit.
446
+ *
447
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
448
+ */
449
+ const removeTrailingUnusedQubits = (circuitEvents: CircuitEvents) => {
450
+ while (
451
+ circuitEvents.qubitUseCounts.length > 0 &&
452
+ circuitEvents.qubitUseCounts[circuitEvents.qubitUseCounts.length - 1] === 0
453
+ ) {
454
+ circuitEvents.qubits.pop();
455
+ circuitEvents.qubitUseCounts.pop();
456
+ }
457
+ };
458
+
459
+ /**
460
+ * Determines whether two register index ranges overlap.
461
+ *
462
+ * @param op1 The [min, max] register indices of the first operation.
463
+ * @param op2 The [min, max] register indices of the second operation.
464
+ * @returns True if the ranges overlap, false otherwise.
465
+ */
466
+ const _doesOverlap = (
467
+ op1: [number, number],
468
+ op2: [number, number],
469
+ ): boolean => {
470
+ const [min1, max1] = op1;
471
+ const [min2, max2] = op2;
472
+ return max1 >= min2 && max2 >= min1;
473
+ };
474
+
378
475
  /**
379
476
  * Add an operation to the circuit at the specified location.
380
477
  *
@@ -409,12 +506,7 @@ const _addOp = (
409
506
  if (op === originalOperation) continue;
410
507
 
411
508
  const [opMinTarget, opMaxTarget] = _getMinMaxRegIdx(op);
412
- if (
413
- (opMinTarget >= minTarget && opMinTarget <= maxTarget) ||
414
- (opMaxTarget >= minTarget && opMaxTarget <= maxTarget) ||
415
- (minTarget >= opMinTarget && minTarget <= opMaxTarget) ||
416
- (maxTarget >= opMinTarget && maxTarget <= opMaxTarget)
417
- ) {
509
+ if (_doesOverlap([minTarget, maxTarget], [opMinTarget, opMaxTarget])) {
418
510
  insertNewColumn = true;
419
511
  break;
420
512
  }
@@ -433,9 +525,11 @@ const _addOp = (
433
525
  );
434
526
  }
435
527
 
528
+ circuitEvents.incrementQubitUseCountForOp(sourceOperation);
529
+
436
530
  if (sourceOperation.kind === "measurement") {
437
- for (const targetWires of sourceOperation.qubits) {
438
- _updateMeasurementLines(circuitEvents, targetWires.qubit);
531
+ for (const targetWire of sourceOperation.qubits) {
532
+ _updateMeasurementLines(circuitEvents, targetWire.qubit);
439
533
  }
440
534
  }
441
535
  };
@@ -448,25 +542,7 @@ const _addOp = (
448
542
  * @returns A tuple containing the minimum and maximum register indices.
449
543
  */
450
544
  const _getMinMaxRegIdx = (operation: Operation): [number, number] => {
451
- let targets: Register[];
452
- let controls: Register[];
453
- switch (operation.kind) {
454
- case "measurement":
455
- targets = operation.results;
456
- controls = operation.qubits;
457
- break;
458
- case "unitary":
459
- targets = operation.targets;
460
- controls = operation.controls || [];
461
- break;
462
- case "ket":
463
- targets = operation.targets;
464
- controls = [];
465
- break;
466
- }
467
-
468
- const ctrls: Register[] = controls || [];
469
- const qRegs: Register[] = [...ctrls, ...targets].filter(
545
+ const qRegs: Register[] = getOperationRegisters(operation).filter(
470
546
  ({ result }) => result === undefined,
471
547
  );
472
548
  if (qRegs.length === 0) return [-1, -1];
@@ -527,6 +603,8 @@ const _removeOp = (
527
603
  }
528
604
  }
529
605
 
606
+ circuitEvents.decrementQubitUseCountForOp(sourceOperation);
607
+
530
608
  if (sourceOperation.kind === "measurement") {
531
609
  for (const result of sourceOperation.results) {
532
610
  _updateMeasurementLines(circuitEvents, result.qubit);
@@ -544,6 +622,7 @@ const _updateMeasurementLines = (
544
622
  circuitEvents: CircuitEvents,
545
623
  wireIndex: number,
546
624
  ) => {
625
+ _ensureQubitCount(circuitEvents, wireIndex);
547
626
  let resultIndex = 0;
548
627
  for (const col of circuitEvents.componentGrid) {
549
628
  for (const comp of col.components) {
@@ -561,6 +640,22 @@ const _updateMeasurementLines = (
561
640
  resultIndex > 0 ? resultIndex : undefined;
562
641
  };
563
642
 
643
+ /**
644
+ * Ensure that the qubit count in the circuit is sufficient for the given wire index.
645
+ *
646
+ * @param circuitEvents The CircuitEvents instance to handle circuit-related events.
647
+ * @param wireIndex The index of the wire to check.
648
+ */
649
+ const _ensureQubitCount = (circuitEvents: CircuitEvents, wireIndex: number) => {
650
+ while (circuitEvents.qubits.length <= wireIndex) {
651
+ circuitEvents.qubits.push({
652
+ id: circuitEvents.qubits.length,
653
+ numResults: undefined,
654
+ });
655
+ circuitEvents.qubitUseCounts.push(0);
656
+ }
657
+ };
658
+
564
659
  export {
565
660
  moveOperation,
566
661
  addOperation,
@@ -568,4 +663,6 @@ export {
568
663
  findAndRemoveOperations,
569
664
  addControl,
570
665
  removeControl,
666
+ resolveOverlappingOperations,
667
+ removeTrailingUnusedQubits,
571
668
  };