qsharp-lang 1.25.5-dev → 1.25.8-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 (336) hide show
  1. package/dist/data-structures/circuit.d.ts +8 -1
  2. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  3. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  4. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  5. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  6. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  7. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  8. package/docs/Std.Arithmetic/AddLE.md +1 -1
  9. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  10. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  11. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  12. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  19. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  20. package/docs/Std.Arithmetic/IncByI.md +1 -1
  21. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  22. package/docs/Std.Arithmetic/IncByL.md +1 -1
  23. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  24. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  25. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  26. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  27. package/docs/Std.Arithmetic/MAJ.md +1 -1
  28. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  29. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  30. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  31. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  32. package/docs/Std.Arithmetic/index.md +1 -1
  33. package/docs/Std.Arrays/All.md +1 -1
  34. package/docs/Std.Arrays/Any.md +1 -1
  35. package/docs/Std.Arrays/Chunks.md +1 -1
  36. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  37. package/docs/Std.Arrays/ColumnAt.md +1 -1
  38. package/docs/Std.Arrays/Count.md +1 -1
  39. package/docs/Std.Arrays/Diagonal.md +1 -1
  40. package/docs/Std.Arrays/DrawMany.md +1 -1
  41. package/docs/Std.Arrays/Enumerated.md +1 -1
  42. package/docs/Std.Arrays/Excluding.md +1 -1
  43. package/docs/Std.Arrays/Filtered.md +1 -1
  44. package/docs/Std.Arrays/FlatMapped.md +1 -1
  45. package/docs/Std.Arrays/Flattened.md +1 -1
  46. package/docs/Std.Arrays/Fold.md +1 -1
  47. package/docs/Std.Arrays/ForEach.md +1 -1
  48. package/docs/Std.Arrays/Head.md +1 -1
  49. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  50. package/docs/Std.Arrays/IndexOf.md +1 -1
  51. package/docs/Std.Arrays/IndexRange.md +1 -1
  52. package/docs/Std.Arrays/Interleaved.md +1 -1
  53. package/docs/Std.Arrays/IsEmpty.md +1 -1
  54. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  55. package/docs/Std.Arrays/IsSorted.md +1 -1
  56. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  57. package/docs/Std.Arrays/Mapped.md +1 -1
  58. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  59. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  60. package/docs/Std.Arrays/Most.md +1 -1
  61. package/docs/Std.Arrays/MostAndTail.md +1 -1
  62. package/docs/Std.Arrays/Padded.md +1 -1
  63. package/docs/Std.Arrays/Partitioned.md +1 -1
  64. package/docs/Std.Arrays/Rest.md +1 -1
  65. package/docs/Std.Arrays/Reversed.md +1 -1
  66. package/docs/Std.Arrays/SequenceI.md +1 -1
  67. package/docs/Std.Arrays/SequenceL.md +1 -1
  68. package/docs/Std.Arrays/Sorted.md +1 -1
  69. package/docs/Std.Arrays/Subarray.md +1 -1
  70. package/docs/Std.Arrays/Swapped.md +1 -1
  71. package/docs/Std.Arrays/Tail.md +1 -1
  72. package/docs/Std.Arrays/Transposed.md +1 -1
  73. package/docs/Std.Arrays/Unzipped.md +1 -1
  74. package/docs/Std.Arrays/Where.md +1 -1
  75. package/docs/Std.Arrays/Windows.md +1 -1
  76. package/docs/Std.Arrays/Zipped.md +1 -1
  77. package/docs/Std.Arrays/index.md +1 -1
  78. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  79. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  80. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  81. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  82. package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
  83. package/docs/Std.Canon/ApplyP.md +1 -1
  84. package/docs/Std.Canon/ApplyPauli.md +1 -1
  85. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  86. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  87. package/docs/Std.Canon/ApplyQFT.md +1 -1
  88. package/docs/Std.Canon/ApplyQPE.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/MapPauliAxis.md +1 -1
  100. package/docs/Std.Canon/Relabel.md +1 -1
  101. package/docs/Std.Canon/Snd.md +1 -1
  102. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  103. package/docs/Std.Canon/index.md +1 -1
  104. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  105. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  106. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  107. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  108. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  109. package/docs/Std.Convert/BoolAsResult.md +1 -1
  110. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  111. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  112. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  113. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  114. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  115. package/docs/Std.Convert/IntAsDouble.md +1 -1
  116. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  117. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  118. package/docs/Std.Convert/ResultAsBool.md +1 -1
  119. package/docs/Std.Convert/index.md +1 -1
  120. package/docs/Std.Core/Complex.md +1 -1
  121. package/docs/Std.Core/Length.md +1 -1
  122. package/docs/Std.Core/Repeated.md +1 -1
  123. package/docs/Std.Core/index.md +1 -1
  124. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  125. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  126. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  127. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  128. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  129. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  130. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  131. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  132. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  133. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  134. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  135. package/docs/Std.Diagnostics/Fact.md +1 -1
  136. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  137. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  138. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  139. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  140. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  141. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  142. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  143. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  144. package/docs/Std.Diagnostics/index.md +1 -1
  145. package/docs/Std.Intrinsic/AND.md +1 -1
  146. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  147. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  148. package/docs/Std.Intrinsic/CNOT.md +1 -1
  149. package/docs/Std.Intrinsic/Exp.md +1 -1
  150. package/docs/Std.Intrinsic/H.md +1 -1
  151. package/docs/Std.Intrinsic/I.md +1 -1
  152. package/docs/Std.Intrinsic/M.md +1 -1
  153. package/docs/Std.Intrinsic/Measure.md +1 -1
  154. package/docs/Std.Intrinsic/Message.md +1 -1
  155. package/docs/Std.Intrinsic/R.md +1 -1
  156. package/docs/Std.Intrinsic/R1.md +1 -1
  157. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  158. package/docs/Std.Intrinsic/RFrac.md +1 -1
  159. package/docs/Std.Intrinsic/Reset.md +1 -1
  160. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  161. package/docs/Std.Intrinsic/Rx.md +1 -1
  162. package/docs/Std.Intrinsic/Rxx.md +1 -1
  163. package/docs/Std.Intrinsic/Ry.md +1 -1
  164. package/docs/Std.Intrinsic/Ryy.md +1 -1
  165. package/docs/Std.Intrinsic/Rz.md +1 -1
  166. package/docs/Std.Intrinsic/Rzz.md +1 -1
  167. package/docs/Std.Intrinsic/S.md +1 -1
  168. package/docs/Std.Intrinsic/SWAP.md +1 -1
  169. package/docs/Std.Intrinsic/SX.md +1 -1
  170. package/docs/Std.Intrinsic/T.md +1 -1
  171. package/docs/Std.Intrinsic/X.md +1 -1
  172. package/docs/Std.Intrinsic/Y.md +1 -1
  173. package/docs/Std.Intrinsic/Z.md +1 -1
  174. package/docs/Std.Intrinsic/index.md +1 -1
  175. package/docs/Std.Logical/Xor.md +1 -1
  176. package/docs/Std.Logical/index.md +1 -1
  177. package/docs/Std.Math/AbsComplex.md +1 -1
  178. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  179. package/docs/Std.Math/AbsD.md +1 -1
  180. package/docs/Std.Math/AbsI.md +1 -1
  181. package/docs/Std.Math/AbsL.md +1 -1
  182. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  183. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  184. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  185. package/docs/Std.Math/ArcCos.md +1 -1
  186. package/docs/Std.Math/ArcCosh.md +1 -1
  187. package/docs/Std.Math/ArcSin.md +1 -1
  188. package/docs/Std.Math/ArcSinh.md +1 -1
  189. package/docs/Std.Math/ArcTan.md +1 -1
  190. package/docs/Std.Math/ArcTan2.md +1 -1
  191. package/docs/Std.Math/ArcTanh.md +1 -1
  192. package/docs/Std.Math/ArgComplex.md +1 -1
  193. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  194. package/docs/Std.Math/Binom.md +1 -1
  195. package/docs/Std.Math/BitSizeI.md +1 -1
  196. package/docs/Std.Math/BitSizeL.md +1 -1
  197. package/docs/Std.Math/Ceiling.md +1 -1
  198. package/docs/Std.Math/Complex.md +1 -1
  199. package/docs/Std.Math/ComplexPolar.md +1 -1
  200. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  201. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  202. package/docs/Std.Math/Cos.md +1 -1
  203. package/docs/Std.Math/Cosh.md +1 -1
  204. package/docs/Std.Math/DivRemI.md +1 -1
  205. package/docs/Std.Math/DivRemL.md +1 -1
  206. package/docs/Std.Math/DividedByC.md +1 -1
  207. package/docs/Std.Math/DividedByCP.md +1 -1
  208. package/docs/Std.Math/E.md +1 -1
  209. package/docs/Std.Math/ExpModI.md +1 -1
  210. package/docs/Std.Math/ExpModL.md +1 -1
  211. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  212. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  213. package/docs/Std.Math/FactorialI.md +1 -1
  214. package/docs/Std.Math/FactorialL.md +1 -1
  215. package/docs/Std.Math/Floor.md +1 -1
  216. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  217. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  218. package/docs/Std.Math/HammingWeightI.md +1 -1
  219. package/docs/Std.Math/InverseModI.md +1 -1
  220. package/docs/Std.Math/InverseModL.md +1 -1
  221. package/docs/Std.Math/IsCoprimeI.md +1 -1
  222. package/docs/Std.Math/IsCoprimeL.md +1 -1
  223. package/docs/Std.Math/IsInfinite.md +1 -1
  224. package/docs/Std.Math/IsNaN.md +1 -1
  225. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  226. package/docs/Std.Math/Lg.md +1 -1
  227. package/docs/Std.Math/Log.md +1 -1
  228. package/docs/Std.Math/Log10.md +1 -1
  229. package/docs/Std.Math/LogFactorialD.md +1 -1
  230. package/docs/Std.Math/LogGammaD.md +1 -1
  231. package/docs/Std.Math/LogOf2.md +1 -1
  232. package/docs/Std.Math/Max.md +1 -1
  233. package/docs/Std.Math/MaxD.md +1 -1
  234. package/docs/Std.Math/MaxI.md +1 -1
  235. package/docs/Std.Math/MaxL.md +1 -1
  236. package/docs/Std.Math/Min.md +1 -1
  237. package/docs/Std.Math/MinD.md +1 -1
  238. package/docs/Std.Math/MinI.md +1 -1
  239. package/docs/Std.Math/MinL.md +1 -1
  240. package/docs/Std.Math/MinusC.md +1 -1
  241. package/docs/Std.Math/MinusCP.md +1 -1
  242. package/docs/Std.Math/ModulusI.md +1 -1
  243. package/docs/Std.Math/ModulusL.md +1 -1
  244. package/docs/Std.Math/NegationC.md +1 -1
  245. package/docs/Std.Math/NegationCP.md +1 -1
  246. package/docs/Std.Math/PI.md +1 -1
  247. package/docs/Std.Math/PNorm.md +1 -1
  248. package/docs/Std.Math/PNormalized.md +1 -1
  249. package/docs/Std.Math/PlusC.md +1 -1
  250. package/docs/Std.Math/PlusCP.md +1 -1
  251. package/docs/Std.Math/PowC.md +1 -1
  252. package/docs/Std.Math/PowCP.md +1 -1
  253. package/docs/Std.Math/RealMod.md +1 -1
  254. package/docs/Std.Math/Round.md +1 -1
  255. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  256. package/docs/Std.Math/SignD.md +1 -1
  257. package/docs/Std.Math/SignI.md +1 -1
  258. package/docs/Std.Math/SignL.md +1 -1
  259. package/docs/Std.Math/Sin.md +1 -1
  260. package/docs/Std.Math/Sinh.md +1 -1
  261. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  262. package/docs/Std.Math/Sqrt.md +1 -1
  263. package/docs/Std.Math/SquaredNorm.md +1 -1
  264. package/docs/Std.Math/Tan.md +1 -1
  265. package/docs/Std.Math/Tanh.md +1 -1
  266. package/docs/Std.Math/TimesC.md +1 -1
  267. package/docs/Std.Math/TimesCP.md +1 -1
  268. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  269. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  270. package/docs/Std.Math/Truncate.md +1 -1
  271. package/docs/Std.Math/index.md +1 -1
  272. package/docs/Std.Measurement/IsLossResult.md +1 -1
  273. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  274. package/docs/Std.Measurement/MResetX.md +1 -1
  275. package/docs/Std.Measurement/MResetY.md +1 -1
  276. package/docs/Std.Measurement/MResetZ.md +1 -1
  277. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  278. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  279. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  280. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  281. package/docs/Std.Measurement/index.md +1 -1
  282. package/docs/Std.Random/DrawRandomBool.md +1 -1
  283. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  284. package/docs/Std.Random/DrawRandomInt.md +1 -1
  285. package/docs/Std.Random/index.md +1 -1
  286. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  287. package/docs/Std.Range/RangeEnd.md +1 -1
  288. package/docs/Std.Range/RangeReverse.md +1 -1
  289. package/docs/Std.Range/RangeStart.md +1 -1
  290. package/docs/Std.Range/RangeStep.md +1 -1
  291. package/docs/Std.Range/index.md +1 -1
  292. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  293. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  294. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  295. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  296. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  297. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
  298. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  299. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  300. package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
  301. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  302. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  303. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  304. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  305. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  306. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  307. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  308. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  309. package/docs/Std.ResourceEstimation/index.md +1 -1
  310. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  311. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  312. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  313. package/docs/Std.StatePreparation/index.md +1 -1
  314. package/docs/Std.TableLookup/Select.md +1 -1
  315. package/docs/Std.TableLookup/index.md +1 -1
  316. package/docs/index.md +1 -1
  317. package/lib/nodejs/qsc_wasm.cjs +2 -2
  318. package/lib/nodejs/qsc_wasm.d.cts +1 -1
  319. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  320. package/lib/web/qsc_wasm.d.ts +1 -1
  321. package/lib/web/qsc_wasm.js +2 -2
  322. package/lib/web/qsc_wasm_bg.wasm +0 -0
  323. package/package.json +1 -1
  324. package/ux/circuit-vis/constants.ts +4 -4
  325. package/ux/circuit-vis/draggable.ts +1 -1
  326. package/ux/circuit-vis/events.ts +3 -12
  327. package/ux/circuit-vis/formatters/gateFormatter.ts +168 -73
  328. package/ux/circuit-vis/formatters/registerFormatter.ts +7 -2
  329. package/ux/circuit-vis/gateRenderData.ts +3 -1
  330. package/ux/circuit-vis/index.ts +9 -1
  331. package/ux/circuit-vis/process.ts +64 -87
  332. package/ux/circuit-vis/sqore.ts +103 -55
  333. package/ux/circuit-vis/state-viz/stateViz.ts +22 -37
  334. package/ux/circuit-vis/utils.ts +9 -19
  335. package/ux/circuit.tsx +12 -95
  336. package/ux/qsharp-circuit.css +6 -49
@@ -5,7 +5,7 @@ import {
5
5
  minGateWidth,
6
6
  startX,
7
7
  gatePadding,
8
- controlBtnOffset,
8
+ controlCircleOffset,
9
9
  groupPaddingX,
10
10
  groupTopPadding,
11
11
  groupBottomPadding,
@@ -242,8 +242,6 @@ const _opToRenderData = (
242
242
  // Set y coords
243
243
  renderData.controlsY = controls?.map((reg) => _getRegY(reg, registers)) || [];
244
244
  renderData.targetsY = targets.map((reg) => _getRegY(reg, registers));
245
- const topY = Math.min(...(renderData.targetsY as number[]));
246
- const bottomY = Math.max(...(renderData.targetsY as number[]));
247
245
 
248
246
  if (isConditional) {
249
247
  // Classically-controlled operations
@@ -252,95 +250,38 @@ const _opToRenderData = (
252
250
  "No children operations found for classically-controlled operation.",
253
251
  );
254
252
 
255
- // Gates to display when classical bit is 0.
256
- const onZeroOps: ComponentGrid = children
257
- .map((col) => ({
258
- components: col.components.filter(
259
- (op) => op.conditionalRender === ConditionalRender.OnZero,
260
- ),
261
- }))
262
- .filter((col) => col.components.length > 0);
263
-
264
- let childrenInstrs = processOperations(
265
- onZeroOps,
266
- topY,
267
- bottomY,
268
- registers,
269
- renderLocations,
270
- );
271
- const zeroGates: GateRenderData[][] = childrenInstrs.renderDataArray;
272
- const zeroChildWidth: number = childrenInstrs.svgWidth;
273
- const zeroChildMaxTopPadding = childrenInstrs.maxTopPadding;
274
- const zeroChildMaxBottomPadding = childrenInstrs.maxBottomPadding;
275
-
276
- // Gates to display when classical bit is 1.
277
- const onOneOps: ComponentGrid = children
278
- .map((col) => ({
279
- components: col.components.filter(
280
- (op) => op.conditionalRender !== ConditionalRender.OnZero,
281
- ),
282
- }))
283
- .filter((col) => col.components.length > 0);
284
- childrenInstrs = processOperations(
285
- onOneOps,
286
- topY,
287
- bottomY,
288
- registers,
289
- renderLocations,
290
- );
291
- const oneGates: GateRenderData[][] = childrenInstrs.renderDataArray;
292
- const oneChildWidth: number = childrenInstrs.svgWidth;
293
- const oneChildMaxTopPadding = childrenInstrs.maxTopPadding;
294
- const oneChildMaxBottomPadding = childrenInstrs.maxBottomPadding;
295
-
296
- // Subtract startX (left-side) and 2*gatePadding (right-side) from nested child gates width
297
- const width: number =
298
- Math.max(zeroChildWidth, oneChildWidth) - startX - gatePadding * 2;
299
-
300
- const maxTopPadding = Math.max(
301
- zeroChildMaxTopPadding,
302
- oneChildMaxTopPadding,
303
- );
304
- const maxBottomPadding = Math.max(
305
- zeroChildMaxBottomPadding,
306
- oneChildMaxBottomPadding,
307
- );
308
-
309
253
  renderData.type = GateType.ClassicalControlled;
310
- renderData.children = [zeroGates, oneGates];
311
- // Add additional width from control button and inner box padding for dashed box
312
- renderData.width = width + controlBtnOffset + groupPaddingX * 2;
313
- renderData.topPadding = maxTopPadding + groupTopPadding;
314
- renderData.bottomPadding = maxBottomPadding + groupBottomPadding;
315
-
316
- // Set targets to first and last quantum registers so we can render the surrounding box
317
- // around all quantum registers.
318
- const qubitsY: number[] = Object.values(registers).map(({ y }) => y);
319
- if (qubitsY.length > 0)
320
- renderData.targetsY = [Math.min(...qubitsY), Math.max(...qubitsY)];
254
+ renderData.label = gate;
255
+
256
+ _processChildren(renderData, children, registers, renderLocations);
257
+
258
+ // Fill in the ID to be displayed in each control wire's circle.
259
+ renderData.classicalControlIds =
260
+ controls
261
+ ?.map(
262
+ (reg) =>
263
+ op.metadata?.controlResultIds?.find(
264
+ (e) => e[0].qubit === reg.qubit && e[0].result === reg.result,
265
+ )?.[1],
266
+ )
267
+ .map((id) => id ?? null) || [];
268
+
269
+ // Add additional width for classical control circle
270
+ renderData.width += controlCircleOffset;
321
271
  } else if (
322
272
  conditionalRender == ConditionalRender.AsGroup &&
323
- (children?.length || 0) > 0
273
+ children &&
274
+ (children.length || 0) > 0
324
275
  ) {
325
- const childrenInstrs = processOperations(
326
- children!,
327
- topY,
328
- bottomY,
329
- registers,
330
- renderLocations,
331
- );
276
+ // Grouped operations
277
+
332
278
  renderData.type = GateType.Group;
333
- renderData.label = gate;
334
- renderData.children = childrenInstrs.renderDataArray;
335
279
  // _zoomButton function in gateFormatter.ts relies on
336
280
  // 'expanded' attribute to render zoom button
337
281
  renderData.dataAttributes = { expanded: "true" };
338
- // Subtract startX (left-side) and add inner box padding for dashed box
339
- renderData.width =
340
- childrenInstrs.svgWidth - startX - gatePadding * 3 + groupPaddingX * 2; // (svgWidth includes 3 extra gate paddings)
341
- renderData.topPadding = childrenInstrs.maxTopPadding + groupTopPadding;
342
- renderData.bottomPadding =
343
- childrenInstrs.maxBottomPadding + groupBottomPadding;
282
+ renderData.label = gate;
283
+
284
+ _processChildren(renderData, children, registers, renderLocations);
344
285
  } else if (op.kind === "measurement") {
345
286
  renderData.type = GateType.Measure;
346
287
  } else if (op.kind === "ket") {
@@ -505,17 +446,20 @@ const _fillRenderDataX = (
505
446
  {
506
447
  // Subtract startX offset from nested gates and add offset and padding
507
448
  let offset: number = x - startX + groupPaddingX;
508
- if (renderData.type === GateType.ClassicalControlled)
509
- offset += controlBtnOffset;
449
+ if (renderData.type === GateType.ClassicalControlled) {
450
+ offset += controlCircleOffset;
451
+ }
510
452
 
511
453
  // Offset each x coord in children gates
512
454
  _offsetChildrenX(renderData.children, offset);
513
455
 
514
- renderData.x = x + columnWidths[colIndex] / 2;
456
+ // Groups should be left-aligned in their column
457
+ renderData.x = x + renderData.width / 2;
515
458
  }
516
459
  break;
517
460
 
518
461
  default:
462
+ // Center gate in column
519
463
  renderData.x = x + columnWidths[colIndex] / 2;
520
464
  break;
521
465
  }
@@ -544,4 +488,37 @@ const _offsetChildrenX = (
544
488
  });
545
489
  };
546
490
 
491
+ /**
492
+ * Processes the children operations and updates the render data accordingly.
493
+ *
494
+ * @param renderData Render data of the parent operation, to be updated with children data.
495
+ * @param children Nested operations to be processed.
496
+ * @param registers Mapping from qubit IDs to register render data.
497
+ * @param renderLocations Optional function to map source locations to link hrefs and titles
498
+ */
499
+ function _processChildren(
500
+ renderData: GateRenderData,
501
+ children: ComponentGrid,
502
+ registers: RegisterMap,
503
+ renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
504
+ ) {
505
+ const topY = Math.min(...(renderData.targetsY as number[]));
506
+ const bottomY = Math.max(...(renderData.targetsY as number[]));
507
+
508
+ const childrenInstrs = processOperations(
509
+ children,
510
+ topY,
511
+ bottomY,
512
+ registers,
513
+ renderLocations,
514
+ );
515
+
516
+ renderData.children = childrenInstrs.renderDataArray;
517
+ renderData.width =
518
+ childrenInstrs.svgWidth - startX - gatePadding * 3 + groupPaddingX * 2; // (svgWidth includes 3 extra gate paddings)
519
+ renderData.topPadding = childrenInstrs.maxTopPadding + groupTopPadding;
520
+ renderData.bottomPadding =
521
+ childrenInstrs.maxBottomPadding + groupBottomPadding;
522
+ }
523
+
547
524
  export { processOperations };
@@ -64,9 +64,15 @@ export type EditorHandlers = {
64
64
  export type DrawOptions = {
65
65
  renderDepth?: number;
66
66
  renderLocations?: (l: SourceLocation[]) => { title: string; href: string };
67
- // When provided, enables editing behaviors (dropzones, run button, etc.) and
68
- // requires the callbacks necessary to support those behaviors.
67
+ /**
68
+ * When provided, enables editing behaviors (dropzones, run button, etc.) and
69
+ * requires the callbacks necessary to support those behaviors.
70
+ */
69
71
  editor?: EditorHandlers;
72
+ /**
73
+ * When provided, enables zoom-to-fit behavior. The callback is called with the new zoom level whenever it changes.
74
+ */
75
+ onZoomChange?: (zoomLevel: number) => void;
70
76
  };
71
77
 
72
78
  /**
@@ -76,6 +82,9 @@ export class Sqore {
76
82
  circuit: Circuit;
77
83
  gateRegistry: GateRegistry = {};
78
84
  renderDepth: number = this.options.renderDepth ?? 0;
85
+ container: HTMLElement | null = null;
86
+ zoomOnResize: boolean = true;
87
+ zoomLevel: number = 100;
79
88
  /**
80
89
  * Initializes Sqore object.
81
90
  *
@@ -104,11 +113,86 @@ export class Sqore {
104
113
  *
105
114
  * @param container HTML element for rendering visualization into.
106
115
  */
107
- draw(container: HTMLElement): void {
116
+ draw(container: HTMLElement) {
108
117
  // Inject into container
109
118
  if (container == null) throw new Error(`Container not provided.`);
110
119
 
120
+ this.container = container;
121
+
111
122
  this.renderCircuit(container);
123
+
124
+ if (this.options.onZoomChange != null) {
125
+ this.zoomToFit();
126
+ window.addEventListener("resize", () => this.onResize());
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Window resize handler to recalculate and set the zoom level
132
+ * based on the new window width.
133
+ */
134
+ private onResize() {
135
+ if (!this.zoomOnResize) {
136
+ return;
137
+ }
138
+
139
+ // Recalculate the zoom level based on the container width
140
+ this.zoomToFit();
141
+ }
142
+
143
+ /**
144
+ * Calculate and set the zoom level to fit the circuit within the container.
145
+ */
146
+ private zoomToFit() {
147
+ if (this.options.onZoomChange == null || this.container == null) {
148
+ return;
149
+ }
150
+ const zoomLevel = this.calculateZoomToFit(this.container);
151
+ this.updateZoomLevel(zoomLevel);
152
+ this.options.onZoomChange?.(zoomLevel);
153
+ }
154
+
155
+ /**
156
+ * Update the zoom level setting and apply it to the SVG element.
157
+ */
158
+ updateZoomLevel(zoomLevel: number) {
159
+ this.zoomLevel = zoomLevel;
160
+ const svg = this.container?.querySelector("svg.qviz");
161
+ if (svg) {
162
+ this.updateSvgWidth(svg as SVGElement, zoomLevel);
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Update the width of the SVG element based on the zoom level.
168
+ */
169
+ updateSvgWidth(svg: SVGElement, zoomLevel: number) {
170
+ // The width attribute contains the true width.
171
+ // We'll leave this attribute untouched, so we can use it again if the
172
+ // zoom level is ever updated.
173
+ const width = svg.getAttribute("width")!;
174
+
175
+ // We'll set the width in the style attribute to (true width * zoom level).
176
+ // This value takes precedence over the true width in the width attribute.
177
+ svg.setAttribute(
178
+ "style",
179
+ `max-width: ${width}; width: ${(parseInt(width) * (zoomLevel || 100)) / 100}; height: auto`,
180
+ );
181
+ }
182
+
183
+ /**
184
+ * Calculate the zoom level that will fit the circuit into the current size of the container.
185
+ */
186
+ calculateZoomToFit(container: HTMLElement): number {
187
+ const svg = container.querySelector("svg.qviz") as SVGElement;
188
+ const containerWidth = container.clientWidth;
189
+ // width and height are the true dimensions generated by qviz
190
+ const width = parseInt(svg.getAttribute("width")!);
191
+ const height = svg.getAttribute("height")!;
192
+
193
+ svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
194
+ const zoom = Math.min(Math.ceil((containerWidth / width) * 100), 100);
195
+ return zoom;
112
196
  }
113
197
 
114
198
  /**
@@ -139,6 +223,9 @@ export class Sqore {
139
223
  const composedSqore: ComposedSqore = this.compose(_circuit);
140
224
  const svg: SVGElement = this.generateSvg(composedSqore);
141
225
  this.setViewBox(svg);
226
+ if (this.options.onZoomChange != null) {
227
+ this.updateSvgWidth(svg, this.zoomLevel);
228
+ }
142
229
  const previousSvg = container.querySelector("svg.qviz");
143
230
  if (previousSvg == null) {
144
231
  container.appendChild(svg);
@@ -308,7 +395,6 @@ export class Sqore {
308
395
  svg.setAttribute("class", "qviz");
309
396
  svg.setAttribute("width", width.toString());
310
397
  svg.setAttribute("height", height.toString());
311
- svg.style.setProperty("max-width", "fit-content");
312
398
 
313
399
  // Add styles
314
400
  document.documentElement.style.setProperty(
@@ -368,58 +454,9 @@ export class Sqore {
368
454
  *
369
455
  */
370
456
  private addGateClickHandlers(container: HTMLElement, circuit: Circuit): void {
371
- this.addClassicalControlHandlers(container);
372
457
  this.addZoomHandlers(container, circuit);
373
458
  }
374
459
 
375
- /**
376
- * Add interactive click handlers for classically-controlled operations.
377
- *
378
- * @param container HTML element containing visualized circuit.
379
- *
380
- */
381
- private addClassicalControlHandlers(container: HTMLElement): void {
382
- container.querySelectorAll(".classically-controlled-btn").forEach((btn) => {
383
- // Zoom in on clicked gate
384
- btn.addEventListener("click", (evt: Event) => {
385
- const textSvg = btn.querySelector("text");
386
- const group = btn.parentElement;
387
- if (textSvg == null || group == null) return;
388
-
389
- const currValue = textSvg.firstChild?.nodeValue;
390
- const zeroGates = group?.querySelector(".gates-zero");
391
- const oneGates = group?.querySelector(".gates-one");
392
- switch (currValue) {
393
- case "?":
394
- textSvg.childNodes[0].nodeValue = "1";
395
- group.classList.remove("classically-controlled-unknown");
396
- group.classList.remove("classically-controlled-zero");
397
- group.classList.add("classically-controlled-one");
398
- zeroGates?.classList.add("hidden");
399
- oneGates?.classList.remove("hidden");
400
- break;
401
- case "1":
402
- textSvg.childNodes[0].nodeValue = "0";
403
- group.classList.remove("classically-controlled-unknown");
404
- group.classList.add("classically-controlled-zero");
405
- group.classList.remove("classically-controlled-one");
406
- zeroGates?.classList.remove("hidden");
407
- oneGates?.classList.add("hidden");
408
- break;
409
- case "0":
410
- textSvg.childNodes[0].nodeValue = "?";
411
- group.classList.add("classically-controlled-unknown");
412
- group.classList.remove("classically-controlled-zero");
413
- group.classList.remove("classically-controlled-one");
414
- zeroGates?.classList.remove("hidden");
415
- oneGates?.classList.remove("hidden");
416
- break;
417
- }
418
- evt.stopPropagation();
419
- });
420
- });
421
- }
422
-
423
460
  /**
424
461
  * Add interactive click handlers for zoom-in/out functionality.
425
462
  *
@@ -439,6 +476,7 @@ export class Sqore {
439
476
  } else if (ctrl.classList.contains("gate-expand")) {
440
477
  this.expandOperation(circuit.componentGrid, gateId);
441
478
  }
479
+ this.zoomOnResize = false;
442
480
  this.renderCircuit(container, circuit);
443
481
 
444
482
  ev.stopPropagation();
@@ -580,10 +618,10 @@ function updateRowHeights(
580
618
  ) {
581
619
  for (const col of componentGrid) {
582
620
  for (const component of col.components) {
583
- if (component.dataAttributes?.["expanded"] === "true") {
621
+ if (isExpandedGroup(component)) {
584
622
  // We're in an expanded group. There is a dashed border above
585
623
  // the top qubit, and below the bottom qubit.
586
- const [topQubit, bottomQubit] = getMinMaxRegIdx(component, numQubits);
624
+ const [topQubit, bottomQubit] = getMinMaxRegIdx(component);
587
625
 
588
626
  // Increment the current count of dashed group borders for
589
627
  // the top and bottom rows for this operation.
@@ -611,3 +649,13 @@ function updateRowHeights(
611
649
  }
612
650
  }
613
651
  }
652
+
653
+ /**
654
+ * An "expanded group" here is any operation that is to be rendered showing
655
+ * its children, with a dashed box around the children.
656
+ */
657
+ function isExpandedGroup(component: Operation) {
658
+ return (
659
+ component.dataAttributes?.["expanded"] === "true" || component.isConditional
660
+ );
661
+ }
@@ -52,7 +52,7 @@ const VIZ = {
52
52
  phaseDotFrac: 0.25,
53
53
  phaseDotRadiusMinPx: 1.5,
54
54
  phaseTextBottomPad: 6,
55
- verticalLabelCharHeight: 14,
55
+ verticalLabelCharHeight: 9,
56
56
  phaseLabelLineHeight: 14,
57
57
  verticalLabelExtraBase: 12,
58
58
  stateLabelVerticalOffset: 4,
@@ -395,7 +395,7 @@ const renderStatePanel = (
395
395
 
396
396
  columnData.forEach((col, i) => renderColumn(g, col, i, prev, layout));
397
397
 
398
- finalizeSvgAndFlex(svg, panel, g, layout);
398
+ finalizeSvgAndFlex(svg, panel, layout);
399
399
  savePreviousValues(panel, columnData);
400
400
  };
401
401
 
@@ -660,43 +660,28 @@ const renderStateLabelSection = (
660
660
  const finalizeSvgAndFlex = (
661
661
  svg: SVGSVGElement,
662
662
  panel: HTMLElement,
663
- g: SVGGElement,
664
663
  layout: LayoutMetrics,
665
664
  ) => {
666
- try {
667
- const bbox = g.getBBox();
668
- const contentHeight = Math.ceil(bbox.height + VIZ.contentHeightExtra);
669
- const svgHeight = Math.max(VIZ.baseHeight, contentHeight);
670
- svg.setAttribute("height", svgHeight.toString());
671
- svg.setAttribute("width", layout.panelWidthPx.toString());
672
- const edgePad = VIZ.edgePad;
673
- panel.style.flexBasis = `${Math.ceil(layout.panelWidthPx + edgePad)}px`;
674
- } catch {
675
- // If getBBox fails (e.g., JSDOM/SVG not fully rendered), fall back to a
676
- // deterministic height based on our layout constants so snapshots still
677
- // include the whole visualization.
678
- const labelTextHeightPx = layout.verticalLabels
679
- ? VIZ.verticalLabelCharHeight * Math.max(1, layout.maxLabelLen)
680
- : VIZ.phaseLabelLineHeight;
681
- const labelBottomY =
682
- layout.stateSectionTopY +
683
- VIZ.stateHeaderPadding +
684
- (layout.verticalLabels
685
- ? VIZ.stateLabelVerticalOffset
686
- : VIZ.stateLabelHorizontalOffset) +
687
- labelTextHeightPx;
688
-
689
- const svgHeight = Math.max(
690
- VIZ.baseHeight,
691
- Math.ceil(
692
- labelBottomY + VIZ.extraBottomPaddingPx + VIZ.marginBottomMinPx,
693
- ),
694
- );
695
- svg.setAttribute("height", svgHeight.toString());
696
- svg.setAttribute("width", layout.panelWidthPx.toString());
697
- const edgePad = VIZ.edgePad;
698
- panel.style.flexBasis = `${Math.ceil(layout.panelWidthPx + edgePad)}px`;
699
- }
665
+ const labelTextHeightPx = layout.verticalLabels
666
+ ? VIZ.verticalLabelCharHeight * Math.max(1, layout.maxLabelLen)
667
+ : VIZ.phaseLabelLineHeight;
668
+ const labelBottomY =
669
+ layout.stateSectionTopY +
670
+ VIZ.stateHeaderPadding +
671
+ (layout.verticalLabels
672
+ ? VIZ.stateLabelVerticalOffset
673
+ : VIZ.stateLabelHorizontalOffset) +
674
+ labelTextHeightPx;
675
+
676
+ const svgHeight = Math.max(
677
+ VIZ.baseHeight,
678
+ Math.ceil(labelBottomY + VIZ.extraBottomPaddingPx + VIZ.marginBottomMinPx),
679
+ );
680
+
681
+ svg.setAttribute("height", svgHeight.toString());
682
+ svg.setAttribute("width", layout.panelWidthPx.toString());
683
+ const edgePad = VIZ.edgePad;
684
+ panel.style.flexBasis = `${Math.ceil(layout.panelWidthPx + edgePad)}px`;
700
685
  };
701
686
 
702
687
  const savePreviousValues = (panel: HTMLElement, columnData: StateColumn[]) => {
@@ -7,6 +7,7 @@ import {
7
7
  labelPaddingX,
8
8
  labelFontSize,
9
9
  argsFontSize,
10
+ controlCircleOffset,
10
11
  } from "./constants.js";
11
12
  import { ComponentGrid, Operation } from "./circuit.js";
12
13
  import { Register } from "./register.js";
@@ -67,11 +68,14 @@ const getMinGateWidth = ({
67
68
  case GateType.Swap:
68
69
  return minGateWidth;
69
70
  default: {
71
+ // Classically controlled gates are wider because of the control button on the left
72
+ const controlButtonWidth =
73
+ type === GateType.ClassicalControlled ? controlCircleOffset : 0;
70
74
  const labelWidth = _getStringWidth(label);
71
75
  const argsWidth =
72
76
  displayArgs != null ? _getStringWidth(displayArgs, argsFontSize) : 0;
73
77
  const textWidth = Math.max(labelWidth, argsWidth) + labelPaddingX * 2;
74
- return Math.max(minGateWidth, textWidth);
78
+ return Math.max(minGateWidth, textWidth) + controlButtonWidth;
75
79
  }
76
80
  }
77
81
  };
@@ -239,10 +243,7 @@ const getGateLocationString = (operation: Operation): string | null => {
239
243
  * @param numQubits The number of qubits in the circuit.
240
244
  * @returns A tuple containing the minimum and maximum register indices.
241
245
  */
242
- function getMinMaxRegIdx(
243
- operation: Operation,
244
- numQubits: number,
245
- ): [number, number] {
246
+ function getMinMaxRegIdx(operation: Operation): [number, number] {
246
247
  let targets: Register[];
247
248
  let controls: Register[];
248
249
  switch (operation.kind) {
@@ -260,20 +261,9 @@ function getMinMaxRegIdx(
260
261
  break;
261
262
  }
262
263
 
263
- const qRegs = [...controls, ...targets]
264
- .filter(({ result }) => result === undefined)
265
- .map(({ qubit }) => qubit);
266
- const clsControls: Register[] = controls.filter(
267
- ({ result }) => result !== undefined,
268
- );
269
- const isClassicallyControlled: boolean = clsControls.length > 0;
270
- if (!isClassicallyControlled && qRegs.length === 0) return [-1, -1];
271
- // If operation is classically-controlled, pad all qubit registers. Otherwise, only pad
272
- // the contiguous range of registers that it covers.
273
- const minRegIdx: number = isClassicallyControlled ? 0 : Math.min(...qRegs);
274
- const maxRegIdx: number = isClassicallyControlled
275
- ? numQubits - 1
276
- : Math.max(...qRegs);
264
+ const qRegs = [...controls, ...targets].map(({ qubit }) => qubit);
265
+ const minRegIdx: number = Math.min(...qRegs);
266
+ const maxRegIdx: number = Math.max(...qRegs);
277
267
 
278
268
  return [minRegIdx, maxRegIdx];
279
269
  }