qsharp-lang 1.26.2-dev → 1.26.3-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 (337) hide show
  1. package/dist/data-structures/circuit.d.ts +0 -15
  2. package/dist/data-structures/circuit.js +1 -19
  3. package/dist/katas-content.generated.js +1 -1
  4. package/dist/katas-content.generated.md.js +1 -1
  5. package/dist/samples.generated.js +4 -4
  6. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  7. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  8. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  9. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  10. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  11. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  12. package/docs/Std.Arithmetic/AddLE.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  19. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  22. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  23. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  24. package/docs/Std.Arithmetic/IncByI.md +1 -1
  25. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  26. package/docs/Std.Arithmetic/IncByL.md +1 -1
  27. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  28. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  29. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  30. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  31. package/docs/Std.Arithmetic/MAJ.md +1 -1
  32. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  33. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  34. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  36. package/docs/Std.Arithmetic/index.md +1 -1
  37. package/docs/Std.Arrays/All.md +1 -1
  38. package/docs/Std.Arrays/Any.md +1 -1
  39. package/docs/Std.Arrays/Chunks.md +1 -1
  40. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  41. package/docs/Std.Arrays/ColumnAt.md +1 -1
  42. package/docs/Std.Arrays/Count.md +1 -1
  43. package/docs/Std.Arrays/Diagonal.md +1 -1
  44. package/docs/Std.Arrays/DrawMany.md +1 -1
  45. package/docs/Std.Arrays/Enumerated.md +1 -1
  46. package/docs/Std.Arrays/Excluding.md +1 -1
  47. package/docs/Std.Arrays/Filtered.md +1 -1
  48. package/docs/Std.Arrays/FlatMapped.md +1 -1
  49. package/docs/Std.Arrays/Flattened.md +1 -1
  50. package/docs/Std.Arrays/Fold.md +1 -1
  51. package/docs/Std.Arrays/ForEach.md +1 -1
  52. package/docs/Std.Arrays/Head.md +1 -1
  53. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  54. package/docs/Std.Arrays/IndexOf.md +1 -1
  55. package/docs/Std.Arrays/IndexRange.md +1 -1
  56. package/docs/Std.Arrays/Interleaved.md +1 -1
  57. package/docs/Std.Arrays/IsEmpty.md +1 -1
  58. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  59. package/docs/Std.Arrays/IsSorted.md +1 -1
  60. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  61. package/docs/Std.Arrays/Mapped.md +1 -1
  62. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  63. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  64. package/docs/Std.Arrays/Most.md +1 -1
  65. package/docs/Std.Arrays/MostAndTail.md +1 -1
  66. package/docs/Std.Arrays/Padded.md +1 -1
  67. package/docs/Std.Arrays/Partitioned.md +1 -1
  68. package/docs/Std.Arrays/Rest.md +1 -1
  69. package/docs/Std.Arrays/Reversed.md +1 -1
  70. package/docs/Std.Arrays/SequenceI.md +1 -1
  71. package/docs/Std.Arrays/SequenceL.md +1 -1
  72. package/docs/Std.Arrays/Sorted.md +1 -1
  73. package/docs/Std.Arrays/Subarray.md +1 -1
  74. package/docs/Std.Arrays/Swapped.md +1 -1
  75. package/docs/Std.Arrays/Tail.md +1 -1
  76. package/docs/Std.Arrays/Transposed.md +1 -1
  77. package/docs/Std.Arrays/Unzipped.md +1 -1
  78. package/docs/Std.Arrays/Where.md +1 -1
  79. package/docs/Std.Arrays/Windows.md +1 -1
  80. package/docs/Std.Arrays/Zipped.md +1 -1
  81. package/docs/Std.Arrays/index.md +1 -1
  82. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  83. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  84. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  85. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  86. package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
  87. package/docs/Std.Canon/ApplyP.md +1 -1
  88. package/docs/Std.Canon/ApplyPauli.md +1 -1
  89. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  90. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  91. package/docs/Std.Canon/ApplyQFT.md +1 -1
  92. package/docs/Std.Canon/ApplyQPE.md +1 -1
  93. package/docs/Std.Canon/ApplyToEach.md +1 -1
  94. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  95. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  96. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  97. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  98. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  99. package/docs/Std.Canon/CX.md +1 -1
  100. package/docs/Std.Canon/CY.md +1 -1
  101. package/docs/Std.Canon/CZ.md +1 -1
  102. package/docs/Std.Canon/Fst.md +1 -1
  103. package/docs/Std.Canon/MapPauliAxis.md +1 -1
  104. package/docs/Std.Canon/Relabel.md +1 -1
  105. package/docs/Std.Canon/Snd.md +1 -1
  106. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  107. package/docs/Std.Canon/index.md +1 -1
  108. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  109. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  110. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  111. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  112. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  113. package/docs/Std.Convert/BoolAsResult.md +1 -1
  114. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  115. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  116. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  117. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  118. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  119. package/docs/Std.Convert/IntAsDouble.md +1 -1
  120. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  121. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  122. package/docs/Std.Convert/ResultAsBool.md +1 -1
  123. package/docs/Std.Convert/index.md +1 -1
  124. package/docs/Std.Core/Complex.md +1 -1
  125. package/docs/Std.Core/Length.md +1 -1
  126. package/docs/Std.Core/Repeated.md +1 -1
  127. package/docs/Std.Core/index.md +1 -1
  128. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  129. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  130. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  131. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  132. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  133. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  134. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  135. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  136. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  137. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  138. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  139. package/docs/Std.Diagnostics/Fact.md +1 -1
  140. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  141. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  142. package/docs/Std.Diagnostics/PostSelectZ.md +40 -0
  143. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  144. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  145. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  147. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  148. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  149. package/docs/Std.Diagnostics/index.md +2 -1
  150. package/docs/Std.Intrinsic/AND.md +1 -1
  151. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  152. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  153. package/docs/Std.Intrinsic/CNOT.md +1 -1
  154. package/docs/Std.Intrinsic/Exp.md +1 -1
  155. package/docs/Std.Intrinsic/H.md +1 -1
  156. package/docs/Std.Intrinsic/I.md +1 -1
  157. package/docs/Std.Intrinsic/M.md +1 -1
  158. package/docs/Std.Intrinsic/Measure.md +1 -1
  159. package/docs/Std.Intrinsic/Message.md +1 -1
  160. package/docs/Std.Intrinsic/R.md +1 -1
  161. package/docs/Std.Intrinsic/R1.md +1 -1
  162. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  163. package/docs/Std.Intrinsic/RFrac.md +1 -1
  164. package/docs/Std.Intrinsic/Reset.md +1 -1
  165. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  166. package/docs/Std.Intrinsic/Rx.md +1 -1
  167. package/docs/Std.Intrinsic/Rxx.md +1 -1
  168. package/docs/Std.Intrinsic/Ry.md +1 -1
  169. package/docs/Std.Intrinsic/Ryy.md +1 -1
  170. package/docs/Std.Intrinsic/Rz.md +1 -1
  171. package/docs/Std.Intrinsic/Rzz.md +1 -1
  172. package/docs/Std.Intrinsic/S.md +1 -1
  173. package/docs/Std.Intrinsic/SWAP.md +1 -1
  174. package/docs/Std.Intrinsic/SX.md +1 -1
  175. package/docs/Std.Intrinsic/T.md +1 -1
  176. package/docs/Std.Intrinsic/X.md +1 -1
  177. package/docs/Std.Intrinsic/Y.md +1 -1
  178. package/docs/Std.Intrinsic/Z.md +1 -1
  179. package/docs/Std.Intrinsic/index.md +1 -1
  180. package/docs/Std.Logical/Xor.md +1 -1
  181. package/docs/Std.Logical/index.md +1 -1
  182. package/docs/Std.Math/AbsComplex.md +1 -1
  183. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  184. package/docs/Std.Math/AbsD.md +1 -1
  185. package/docs/Std.Math/AbsI.md +1 -1
  186. package/docs/Std.Math/AbsL.md +1 -1
  187. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  188. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  189. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  190. package/docs/Std.Math/ArcCos.md +1 -1
  191. package/docs/Std.Math/ArcCosh.md +1 -1
  192. package/docs/Std.Math/ArcSin.md +1 -1
  193. package/docs/Std.Math/ArcSinh.md +1 -1
  194. package/docs/Std.Math/ArcTan.md +1 -1
  195. package/docs/Std.Math/ArcTan2.md +1 -1
  196. package/docs/Std.Math/ArcTanh.md +1 -1
  197. package/docs/Std.Math/ArgComplex.md +1 -1
  198. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  199. package/docs/Std.Math/Binom.md +1 -1
  200. package/docs/Std.Math/BitSizeI.md +1 -1
  201. package/docs/Std.Math/BitSizeL.md +1 -1
  202. package/docs/Std.Math/Ceiling.md +1 -1
  203. package/docs/Std.Math/Complex.md +1 -1
  204. package/docs/Std.Math/ComplexPolar.md +1 -1
  205. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  206. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  207. package/docs/Std.Math/Cos.md +1 -1
  208. package/docs/Std.Math/Cosh.md +1 -1
  209. package/docs/Std.Math/DivRemI.md +1 -1
  210. package/docs/Std.Math/DivRemL.md +1 -1
  211. package/docs/Std.Math/DividedByC.md +1 -1
  212. package/docs/Std.Math/DividedByCP.md +1 -1
  213. package/docs/Std.Math/E.md +1 -1
  214. package/docs/Std.Math/ExpModI.md +1 -1
  215. package/docs/Std.Math/ExpModL.md +1 -1
  216. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  217. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  218. package/docs/Std.Math/FactorialI.md +1 -1
  219. package/docs/Std.Math/FactorialL.md +1 -1
  220. package/docs/Std.Math/Floor.md +1 -1
  221. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  222. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  223. package/docs/Std.Math/HammingWeightI.md +1 -1
  224. package/docs/Std.Math/InverseModI.md +1 -1
  225. package/docs/Std.Math/InverseModL.md +1 -1
  226. package/docs/Std.Math/IsCoprimeI.md +1 -1
  227. package/docs/Std.Math/IsCoprimeL.md +1 -1
  228. package/docs/Std.Math/IsInfinite.md +1 -1
  229. package/docs/Std.Math/IsNaN.md +1 -1
  230. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  231. package/docs/Std.Math/Lg.md +1 -1
  232. package/docs/Std.Math/Log.md +1 -1
  233. package/docs/Std.Math/Log10.md +1 -1
  234. package/docs/Std.Math/LogFactorialD.md +1 -1
  235. package/docs/Std.Math/LogGammaD.md +1 -1
  236. package/docs/Std.Math/LogOf2.md +1 -1
  237. package/docs/Std.Math/Max.md +1 -1
  238. package/docs/Std.Math/MaxD.md +1 -1
  239. package/docs/Std.Math/MaxI.md +1 -1
  240. package/docs/Std.Math/MaxL.md +1 -1
  241. package/docs/Std.Math/Min.md +1 -1
  242. package/docs/Std.Math/MinD.md +1 -1
  243. package/docs/Std.Math/MinI.md +1 -1
  244. package/docs/Std.Math/MinL.md +1 -1
  245. package/docs/Std.Math/MinusC.md +1 -1
  246. package/docs/Std.Math/MinusCP.md +1 -1
  247. package/docs/Std.Math/ModulusI.md +1 -1
  248. package/docs/Std.Math/ModulusL.md +1 -1
  249. package/docs/Std.Math/NegationC.md +1 -1
  250. package/docs/Std.Math/NegationCP.md +1 -1
  251. package/docs/Std.Math/PI.md +1 -1
  252. package/docs/Std.Math/PNorm.md +1 -1
  253. package/docs/Std.Math/PNormalized.md +1 -1
  254. package/docs/Std.Math/PlusC.md +1 -1
  255. package/docs/Std.Math/PlusCP.md +1 -1
  256. package/docs/Std.Math/PowC.md +1 -1
  257. package/docs/Std.Math/PowCP.md +1 -1
  258. package/docs/Std.Math/RealMod.md +1 -1
  259. package/docs/Std.Math/Round.md +1 -1
  260. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  261. package/docs/Std.Math/SignD.md +1 -1
  262. package/docs/Std.Math/SignI.md +1 -1
  263. package/docs/Std.Math/SignL.md +1 -1
  264. package/docs/Std.Math/Sin.md +1 -1
  265. package/docs/Std.Math/Sinh.md +1 -1
  266. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  267. package/docs/Std.Math/Sqrt.md +1 -1
  268. package/docs/Std.Math/SquaredNorm.md +1 -1
  269. package/docs/Std.Math/Tan.md +1 -1
  270. package/docs/Std.Math/Tanh.md +1 -1
  271. package/docs/Std.Math/TimesC.md +1 -1
  272. package/docs/Std.Math/TimesCP.md +1 -1
  273. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  274. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  275. package/docs/Std.Math/Truncate.md +1 -1
  276. package/docs/Std.Math/index.md +1 -1
  277. package/docs/Std.Measurement/IsLossResult.md +1 -1
  278. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  279. package/docs/Std.Measurement/MResetX.md +1 -1
  280. package/docs/Std.Measurement/MResetY.md +1 -1
  281. package/docs/Std.Measurement/MResetZ.md +1 -1
  282. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  283. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  284. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  285. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  286. package/docs/Std.Measurement/index.md +1 -1
  287. package/docs/Std.Random/DrawRandomBool.md +1 -1
  288. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  289. package/docs/Std.Random/DrawRandomInt.md +1 -1
  290. package/docs/Std.Random/index.md +1 -1
  291. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  292. package/docs/Std.Range/RangeEnd.md +1 -1
  293. package/docs/Std.Range/RangeReverse.md +1 -1
  294. package/docs/Std.Range/RangeStart.md +1 -1
  295. package/docs/Std.Range/RangeStep.md +1 -1
  296. package/docs/Std.Range/index.md +1 -1
  297. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  298. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  299. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  300. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  301. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  302. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
  303. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  304. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  305. package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
  306. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  307. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  308. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  309. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  310. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  311. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  312. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  313. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  314. package/docs/Std.ResourceEstimation/index.md +1 -1
  315. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  316. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  317. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  318. package/docs/Std.StatePreparation/index.md +1 -1
  319. package/docs/Std.TableLookup/Select.md +1 -1
  320. package/docs/Std.TableLookup/index.md +1 -1
  321. package/docs/index.md +1 -1
  322. package/docs/toc.yml +1 -0
  323. package/lib/nodejs/qsc_wasm.cjs +1318 -1392
  324. package/lib/nodejs/qsc_wasm.d.cts +313 -290
  325. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  326. package/lib/web/qsc_wasm.d.ts +388 -364
  327. package/lib/web/qsc_wasm.js +1346 -1346
  328. package/lib/web/qsc_wasm_bg.wasm +0 -0
  329. package/package.json +1 -1
  330. package/ux/circuit-vis/circuit.ts +0 -1
  331. package/ux/circuit-vis/formatters/gateFormatter.ts +111 -86
  332. package/ux/circuit-vis/formatters/registerFormatter.ts +2 -5
  333. package/ux/circuit-vis/gateRenderData.ts +10 -3
  334. package/ux/circuit-vis/panel.ts +1 -0
  335. package/ux/circuit-vis/process.ts +162 -57
  336. package/ux/circuit-vis/sqore.ts +34 -28
  337. package/ux/circuit-vis/utils.ts +2 -1
@@ -10,12 +10,7 @@ import {
10
10
  groupTopPadding,
11
11
  groupBottomPadding,
12
12
  } from "./constants.js";
13
- import {
14
- ComponentGrid,
15
- Operation,
16
- ConditionalRender,
17
- SourceLocation,
18
- } from "./circuit.js";
13
+ import { ComponentGrid, Operation, SourceLocation } from "./circuit.js";
19
14
  import { GateRenderData, GateType } from "./gateRenderData.js";
20
15
  import { Register, RegisterMap } from "./register.js";
21
16
  import { getMinGateWidth } from "./utils.js";
@@ -45,19 +40,21 @@ const processOperations = (
45
40
  maxTopPadding: number;
46
41
  maxBottomPadding: number;
47
42
  } => {
48
- if (componentGrid.length === 0)
43
+ if (componentGrid.length === 0) {
49
44
  return {
50
45
  renderDataArray: [],
51
46
  svgWidth: startX + gatePadding * 2,
52
47
  maxTopPadding: 0,
53
48
  maxBottomPadding: 0,
54
49
  };
55
- const numColumns: number = componentGrid.length;
56
- const columnsWidths: number[] = new Array(numColumns).fill(minGateWidth);
50
+ }
57
51
 
58
52
  let maxTopPadding = 0;
59
53
  let maxBottomPadding = 0;
60
54
 
55
+ // Track the width of each column as we process it.
56
+ const columnsWidths: number[] = componentGrid.map(() => minGateWidth);
57
+
61
58
  // Get classical registers and their starting column index
62
59
  const classicalRegs: [number, Register][] =
63
60
  _getClassicalRegStarts(componentGrid);
@@ -97,14 +94,21 @@ const processOperations = (
97
94
  );
98
95
  }
99
96
 
97
+ const isCollapsedGroup =
98
+ renderData.type === GateType.Group && !renderData.isExpanded;
99
+
100
100
  if (
101
101
  op != null &&
102
- [GateType.Unitary, GateType.Ket, GateType.ControlledUnitary].includes(
103
- renderData.type,
104
- )
102
+ ([
103
+ GateType.Unitary,
104
+ GateType.Ket,
105
+ GateType.ControlledUnitary,
106
+ ].includes(renderData.type) ||
107
+ isCollapsedGroup)
105
108
  ) {
106
- // If gate is a unitary type, split targetsY into groups if there
107
- // is a classical register between them for rendering
109
+ // Split multi-wire gate bodies into segments if there is a classical
110
+ // register wire between them. This prevents classical wires from
111
+ // visually intersecting/entering gate bodies.
108
112
 
109
113
  // Get y coordinates of classical registers in the same column as this operation
110
114
  const classicalRegY: number[] = classicalRegs
@@ -120,9 +124,16 @@ const processOperations = (
120
124
  return children[reg.result].y;
121
125
  });
122
126
 
127
+ const allowedThroughY = (renderData.classicalControlRegs ?? []).map(
128
+ (reg) => _getRegY(reg, registers),
129
+ );
130
+ const splitAroundY = classicalRegY.filter(
131
+ (y) => !allowedThroughY.includes(y),
132
+ );
133
+
123
134
  renderData.targetsY = _splitTargetsY(
124
135
  targets,
125
- classicalRegY,
136
+ splitAroundY,
126
137
  registers,
127
138
  );
128
139
  }
@@ -136,13 +147,23 @@ const processOperations = (
136
147
  }),
137
148
  );
138
149
 
139
- // Filter out invalid gates
140
- const filteredArray: GateRenderData[][] = renderDataArray
141
- .map((col) => col.filter(({ type }) => type != GateType.Invalid))
142
- .filter((col) => col.length > 0);
150
+ // Filter out invalid gates and remove empty columns.
151
+ // Keep column widths in sync with the filtered columns.
152
+ const filteredColumns = renderDataArray
153
+ .map((col, colIndex) => ({
154
+ colIndex,
155
+ gates: col.filter(({ type }) => type != GateType.Invalid),
156
+ }))
157
+ .filter(({ gates }) => gates.length > 0);
158
+ const filteredArray: GateRenderData[][] = filteredColumns.map(
159
+ ({ gates }) => gates,
160
+ );
161
+ const filteredColumnWidths: number[] = filteredColumns.map(
162
+ ({ colIndex }) => columnsWidths[colIndex],
163
+ );
143
164
 
144
165
  // Fill in x coord of each gate
145
- const endX: number = _fillRenderDataX(filteredArray, columnsWidths);
166
+ const endX: number = _fillRenderDataX(filteredArray, filteredColumnWidths);
146
167
 
147
168
  return {
148
169
  renderDataArray: filteredArray,
@@ -182,6 +203,29 @@ const _getClassicalRegStarts = (
182
203
  return clsRegs;
183
204
  };
184
205
 
206
+ /**
207
+ * Recursively collects classical control registers from source circuit children.
208
+ * Used inside _opToRenderData for collapsed groups whose children have not been rendered.
209
+ */
210
+ function _collectClassicalControlsFromSourceChildren(
211
+ children: ComponentGrid,
212
+ ): Register[] {
213
+ const regs: Register[] = [];
214
+ for (const col of children) {
215
+ for (const op of col.components) {
216
+ if (op.kind === "unitary") {
217
+ for (const reg of op.controls ?? []) {
218
+ if (reg.result != null) regs.push(reg);
219
+ }
220
+ }
221
+ if (op.children != null) {
222
+ regs.push(..._collectClassicalControlsFromSourceChildren(op.children));
223
+ }
224
+ }
225
+ }
226
+ return regs;
227
+ }
228
+
185
229
  /**
186
230
  * Maps operation to render data (e.g. gate type, position, dimensions, text)
187
231
  * required to render the image.
@@ -198,6 +242,7 @@ const _opToRenderData = (
198
242
  ): GateRenderData => {
199
243
  const renderData: GateRenderData = {
200
244
  type: GateType.Invalid,
245
+ isExpanded: false,
201
246
  x: 0,
202
247
  controlsY: [],
203
248
  targetsY: [],
@@ -230,31 +275,34 @@ const _opToRenderData = (
230
275
  break;
231
276
  }
232
277
 
233
- const {
234
- gate,
235
- args,
236
- children,
237
- dataAttributes,
238
- isConditional,
239
- conditionalRender,
240
- } = op;
278
+ const { gate, args, children, dataAttributes } = op;
279
+
280
+ // Classically-controlled operations are encoded as operations whose `controls` are
281
+ // classical registers (i.e. `Register.result` is set), with IDs provided via
282
+ // `metadata.controlResultIds`.
283
+ const hasClassicalControls =
284
+ op.kind === "unitary" &&
285
+ ((controls?.some((reg) => reg.result != null) ?? false) ||
286
+ (op.metadata?.controlResultIds?.length ?? 0) > 0);
287
+
288
+ const hasChildren = children != null && children.length > 0;
289
+ const expandedAttr = dataAttributes?.["expanded"];
290
+ const defaultExpanded = hasClassicalControls && hasChildren;
291
+ const isExpanded =
292
+ expandedAttr === undefined ? defaultExpanded : expandedAttr === "true";
293
+ renderData.isExpanded = isExpanded;
241
294
 
242
295
  // Set y coords
243
296
  renderData.controlsY = controls?.map((reg) => _getRegY(reg, registers)) || [];
244
297
  renderData.targetsY = targets.map((reg) => _getRegY(reg, registers));
245
298
 
246
- if (isConditional) {
247
- // Classically-controlled operations
248
- if (children == null || children.length == 0)
249
- throw new Error(
250
- "No children operations found for classically-controlled operation.",
251
- );
299
+ if (hasClassicalControls) {
300
+ // Classically-controlled operations.
301
+ // These are treated as composite/group operations when they have children.
302
+ // Expanded vs. collapsed rendering is controlled via the `expanded` state.
252
303
 
253
- renderData.type = GateType.ClassicalControlled;
254
304
  renderData.label = gate;
255
305
 
256
- _processChildren(renderData, children, registers, renderLocations);
257
-
258
306
  // Fill in the ID to be displayed in each control wire's circle.
259
307
  renderData.classicalControlIds =
260
308
  controls
@@ -266,22 +314,30 @@ const _opToRenderData = (
266
314
  )
267
315
  .map((id) => id ?? null) || [];
268
316
 
269
- // Add additional width for classical control circle
270
- renderData.width += controlCircleOffset;
271
- } else if (
272
- conditionalRender == ConditionalRender.AsGroup &&
273
- children &&
274
- (children.length || 0) > 0
275
- ) {
276
- // Grouped operations
317
+ if (hasChildren) {
318
+ renderData.type = GateType.Group;
319
+ if (isExpanded) {
320
+ _processChildren(renderData, children!, registers, renderLocations);
321
+
322
+ // Add additional width for classical control circle.
323
+ // (The group width comes from children layout; it doesn't account for controls.)
324
+ renderData.width += controlCircleOffset;
325
+ }
326
+ } else {
327
+ // Defensive fallback: a conditional without children is rendered as a unitary.
328
+ renderData.type = GateType.Unitary;
329
+ }
330
+ } else if (hasChildren) {
331
+ // Composite/grouped operations.
332
+ // Always represented as `GateType.Group` so the UI can determine expandability
333
+ // solely from gate type.
277
334
 
278
335
  renderData.type = GateType.Group;
279
- // _zoomButton function in gateFormatter.ts relies on
280
- // 'expanded' attribute to render zoom button
281
- renderData.dataAttributes = { expanded: "true" };
282
336
  renderData.label = gate;
283
337
 
284
- _processChildren(renderData, children, registers, renderLocations);
338
+ if (isExpanded) {
339
+ _processChildren(renderData, children!, registers, renderLocations);
340
+ }
285
341
  } else if (op.kind === "measurement") {
286
342
  renderData.type = GateType.Measure;
287
343
  } else if (op.kind === "ket") {
@@ -301,6 +357,32 @@ const _opToRenderData = (
301
357
  renderData.label = gate;
302
358
  }
303
359
 
360
+ // Collect classical control registers for this op and all descendants.
361
+ // For expanded groups, aggregate from already-rendered children to avoid re-walking source data.
362
+ // For collapsed groups with children, walk source data directly.
363
+ {
364
+ const ownControls =
365
+ op.kind === "unitary"
366
+ ? (controls ?? []).filter((r) => r.result != null)
367
+ : [];
368
+ const descendantControls: Register[] =
369
+ renderData.children != null
370
+ ? renderData.children
371
+ .flat()
372
+ .flatMap((c) => c.classicalControlRegs ?? [])
373
+ : hasChildren
374
+ ? _collectClassicalControlsFromSourceChildren(children!)
375
+ : [];
376
+ const seen = new Set<string>();
377
+ renderData.classicalControlRegs = [
378
+ ...ownControls,
379
+ ...descendantControls,
380
+ ].filter((r) => {
381
+ const key = `${r.qubit}:${r.result}`;
382
+ return seen.has(key) ? false : (seen.add(key), true);
383
+ });
384
+ }
385
+
304
386
  // If adjoint, add ' to the end of gate label
305
387
  if (isAdjoint && renderData.label.length > 0) renderData.label += "'";
306
388
 
@@ -308,9 +390,19 @@ const _opToRenderData = (
308
390
  // For now, we only display the first argument
309
391
  if (args !== undefined && args.length > 0) renderData.displayArgs = args[0];
310
392
 
311
- // Minimum width is calculated based on the label and args
393
+ // Minimum width is calculated based on the label and args.
394
+ // If this is a collapsed composite (GateType.Group with no children render data),
395
+ // its width should be based on the summary gate rather than the full expanded layout.
312
396
  const minWidth = getMinGateWidth(renderData);
313
- renderData.width = Math.max(minWidth, renderData.width);
397
+
398
+ const isCollapsedComposite =
399
+ renderData.type === GateType.Group && !isExpanded;
400
+
401
+ if (isCollapsedComposite) {
402
+ renderData.width = minWidth;
403
+ } else {
404
+ renderData.width = Math.max(minWidth, renderData.width);
405
+ }
314
406
 
315
407
  if (op.metadata?.source && renderLocations) {
316
408
  renderData.link = renderLocations([op.metadata.source]);
@@ -323,6 +415,14 @@ const _opToRenderData = (
323
415
  ...dataAttributes,
324
416
  };
325
417
 
418
+ // By default, classically controlled groups are expanded unless explicitly overridden.
419
+ if (defaultExpanded && expandedAttr === undefined) {
420
+ renderData.dataAttributes = {
421
+ ...renderData.dataAttributes,
422
+ expanded: "true",
423
+ };
424
+ }
425
+
326
426
  return renderData;
327
427
  };
328
428
 
@@ -440,27 +540,32 @@ const _fillRenderDataX = (
440
540
  renderDataArray.forEach((col, colIndex) =>
441
541
  col.forEach((renderData) => {
442
542
  const x = colStartX[colIndex];
543
+ const columnWidth = columnWidths[colIndex];
544
+ const columnCenterX = x + columnWidth / 2;
443
545
  switch (renderData.type) {
444
- case GateType.ClassicalControlled:
445
546
  case GateType.Group:
446
547
  {
548
+ // Center the group within the column, and offset nested child gates
549
+ // relative to the group's left edge (plus internal padding).
550
+ const groupLeftX = columnCenterX - renderData.width / 2;
551
+
447
552
  // Subtract startX offset from nested gates and add offset and padding
448
- let offset: number = x - startX + groupPaddingX;
449
- if (renderData.type === GateType.ClassicalControlled) {
553
+ let offset: number = groupLeftX - startX + groupPaddingX;
554
+ if (renderData.classicalControlIds != null) {
450
555
  offset += controlCircleOffset;
451
556
  }
452
557
 
453
558
  // Offset each x coord in children gates
454
559
  _offsetChildrenX(renderData.children, offset);
455
560
 
456
- // Groups should be left-aligned in their column
457
- renderData.x = x + renderData.width / 2;
561
+ // Center gate in column
562
+ renderData.x = columnCenterX;
458
563
  }
459
564
  break;
460
565
 
461
566
  default:
462
567
  // Center gate in column
463
- renderData.x = x + columnWidths[colIndex] / 2;
568
+ renderData.x = columnCenterX;
464
569
  break;
465
570
  }
466
571
  }),
@@ -6,7 +6,6 @@ import { formatGates } from "./formatters/gateFormatter.js";
6
6
  import { formatRegisters } from "./formatters/registerFormatter.js";
7
7
  import { processOperations } from "./process.js";
8
8
  import {
9
- ConditionalRender,
10
9
  Circuit,
11
10
  CircuitGroup,
12
11
  ComponentGrid,
@@ -260,7 +259,6 @@ export class Sqore {
260
259
  for (const col of componentGrid) {
261
260
  for (const op of col.components) {
262
261
  if (currentDepth < targetDepth && op.children != null) {
263
- op.conditionalRender = ConditionalRender.AsGroup;
264
262
  op.dataAttributes = op.dataAttributes || {};
265
263
  op.dataAttributes["expanded"] = "true";
266
264
  this.expandOperationsToDepth(
@@ -429,21 +427,19 @@ export class Sqore {
429
427
  private fillGateRegistry(operation: Operation, location: string): void {
430
428
  if (operation.dataAttributes == null) operation.dataAttributes = {};
431
429
  operation.dataAttributes["location"] = location;
432
- // By default, operations cannot be zoomed-out
433
- operation.dataAttributes["zoom-out"] = "false";
430
+
431
+ // Note: `dataAttributes["expanded"]` is intentionally not defaulted here.
432
+ // Expansion is controlled by:
433
+ // - `renderDepth` (see `expandOperationsToDepth`),
434
+ // - user interaction (expand/collapse), and
435
+ // - `expandIfSingleOperation`, which auto-expands a single top-level op
436
+ // unless it has been explicitly collapsed.
434
437
  this.gateRegistry[location] = operation;
435
438
  operation.children?.forEach((col, colIndex) =>
436
439
  col.components.forEach((childOp, i) => {
437
440
  this.fillGateRegistry(childOp, `${location}-${colIndex},${i}`);
438
- if (childOp.dataAttributes == null) childOp.dataAttributes = {};
439
- // Children operations can be zoomed out
440
- childOp.dataAttributes["zoom-out"] = "true";
441
441
  }),
442
442
  );
443
- // Composite operations can be zoomed in
444
- operation.dataAttributes["zoom-in"] = (
445
- operation.children != null
446
- ).toString();
447
443
  }
448
444
 
449
445
  /**
@@ -458,11 +454,10 @@ export class Sqore {
458
454
  }
459
455
 
460
456
  /**
461
- * Add interactive click handlers for zoom-in/out functionality.
457
+ * Add interactive click handlers for expand/collapse functionality.
462
458
  *
463
459
  * @param container HTML element containing visualized circuit.
464
460
  * @param circuit Circuit to be visualized.
465
- *
466
461
  */
467
462
  private addZoomHandlers(container: HTMLElement, circuit: Circuit): void {
468
463
  container.querySelectorAll(".gate .gate-control").forEach((ctrl) => {
@@ -486,11 +481,10 @@ export class Sqore {
486
481
  }
487
482
 
488
483
  /**
489
- * Expand selected operation for zoom-in interaction.
484
+ * Expand selected composite operation.
490
485
  *
491
486
  * @param componentGrid Grid of circuit components.
492
487
  * @param location Location of operation to expand.
493
- *
494
488
  */
495
489
  private expandOperation(
496
490
  componentGrid: ComponentGrid,
@@ -498,12 +492,10 @@ export class Sqore {
498
492
  ): void {
499
493
  componentGrid.forEach((col) =>
500
494
  col.components.forEach((op) => {
501
- if (op.conditionalRender === ConditionalRender.AsGroup)
502
- this.expandOperation(op.children || [], location);
495
+ if (op.children != null) this.expandOperation(op.children, location);
503
496
  if (op.dataAttributes == null) return op;
504
497
  const opId: string = op.dataAttributes["location"];
505
498
  if (opId === location && op.children != null) {
506
- op.conditionalRender = ConditionalRender.AsGroup;
507
499
  op.dataAttributes["expanded"] = "true";
508
500
  }
509
501
  }),
@@ -511,11 +503,10 @@ export class Sqore {
511
503
  }
512
504
 
513
505
  /**
514
- * Collapse selected operation for zoom-out interaction.
506
+ * Collapse selected composite operation.
515
507
  *
516
508
  * @param componentGrid Grid of circuit components.
517
509
  * @param parentLoc Location of operation to collapse.
518
- *
519
510
  */
520
511
  private collapseOperation(
521
512
  componentGrid: ComponentGrid,
@@ -523,14 +514,18 @@ export class Sqore {
523
514
  ): void {
524
515
  componentGrid.forEach((col) =>
525
516
  col.components.forEach((op) => {
526
- if (op.conditionalRender === ConditionalRender.AsGroup)
527
- this.collapseOperation(op.children || [], parentLoc);
517
+ if (op.children != null) this.collapseOperation(op.children, parentLoc);
528
518
  if (op.dataAttributes == null) return op;
529
519
  const opId: string = op.dataAttributes["location"];
530
- // Collapse parent gate and its children
531
- if (opId.startsWith(parentLoc)) {
532
- op.conditionalRender = ConditionalRender.Always;
520
+ if (opId === parentLoc) {
521
+ // Explicitly collapse the targeted parent operation.
533
522
  op.dataAttributes["expanded"] = "false";
523
+ } else if (opId.startsWith(parentLoc)) {
524
+ // For descendants, remove the explicit expanded attribute rather than
525
+ // forcing it to "false". This allows default expansion rules (e.g.
526
+ // classically controlled groups default to expanded) to re-apply
527
+ // correctly when the parent is later re-expanded.
528
+ delete op.dataAttributes["expanded"];
534
529
  }
535
530
  }),
536
531
  );
@@ -655,7 +650,18 @@ function updateRowHeights(
655
650
  * its children, with a dashed box around the children.
656
651
  */
657
652
  function isExpandedGroup(component: Operation) {
658
- return (
659
- component.dataAttributes?.["expanded"] === "true" || component.isConditional
660
- );
653
+ const expandedAttr = component.dataAttributes?.["expanded"];
654
+ if (expandedAttr != null) {
655
+ return expandedAttr === "true";
656
+ }
657
+
658
+ const hasChildren =
659
+ component.children != null && component.children.length > 0;
660
+ const hasClassicalControls =
661
+ component.kind === "unitary" &&
662
+ (((component.controls ?? []).some((reg) => reg.result != null) ?? false) ||
663
+ (component.metadata?.controlResultIds?.length ?? 0) > 0);
664
+
665
+ // Classically controlled groups default to expanded when not explicitly set.
666
+ return hasChildren && hasClassicalControls;
661
667
  }
@@ -61,6 +61,7 @@ const getMinGateWidth = ({
61
61
  type,
62
62
  label,
63
63
  displayArgs,
64
+ classicalControlIds,
64
65
  }: GateRenderData): number => {
65
66
  switch (type) {
66
67
  case GateType.Measure:
@@ -70,7 +71,7 @@ const getMinGateWidth = ({
70
71
  default: {
71
72
  // Classically controlled gates are wider because of the control button on the left
72
73
  const controlButtonWidth =
73
- type === GateType.ClassicalControlled ? controlCircleOffset : 0;
74
+ classicalControlIds != null ? controlCircleOffset : 0;
74
75
  const labelWidth = _getStringWidth(label);
75
76
  const argsWidth =
76
77
  displayArgs != null ? _getStringWidth(displayArgs, argsFontSize) : 0;