qsharp-lang 1.25.3-dev → 1.25.5-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 (342) hide show
  1. package/dist/katas-content.generated.js +1 -1
  2. package/dist/katas-content.generated.md.js +1 -1
  3. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  4. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  5. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  6. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  7. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  8. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  9. package/docs/Std.Arithmetic/AddLE.md +1 -1
  10. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  11. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  12. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  19. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  20. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  21. package/docs/Std.Arithmetic/IncByI.md +1 -1
  22. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  23. package/docs/Std.Arithmetic/IncByL.md +1 -1
  24. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  25. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  26. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  27. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  28. package/docs/Std.Arithmetic/MAJ.md +1 -1
  29. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  30. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  31. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  32. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  33. package/docs/Std.Arithmetic/index.md +1 -1
  34. package/docs/Std.Arrays/All.md +1 -1
  35. package/docs/Std.Arrays/Any.md +1 -1
  36. package/docs/Std.Arrays/Chunks.md +1 -1
  37. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  38. package/docs/Std.Arrays/ColumnAt.md +1 -1
  39. package/docs/Std.Arrays/Count.md +1 -1
  40. package/docs/Std.Arrays/Diagonal.md +1 -1
  41. package/docs/Std.Arrays/DrawMany.md +1 -1
  42. package/docs/Std.Arrays/Enumerated.md +1 -1
  43. package/docs/Std.Arrays/Excluding.md +1 -1
  44. package/docs/Std.Arrays/Filtered.md +1 -1
  45. package/docs/Std.Arrays/FlatMapped.md +1 -1
  46. package/docs/Std.Arrays/Flattened.md +1 -1
  47. package/docs/Std.Arrays/Fold.md +1 -1
  48. package/docs/Std.Arrays/ForEach.md +1 -1
  49. package/docs/Std.Arrays/Head.md +1 -1
  50. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  51. package/docs/Std.Arrays/IndexOf.md +1 -1
  52. package/docs/Std.Arrays/IndexRange.md +1 -1
  53. package/docs/Std.Arrays/Interleaved.md +1 -1
  54. package/docs/Std.Arrays/IsEmpty.md +1 -1
  55. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  56. package/docs/Std.Arrays/IsSorted.md +1 -1
  57. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  58. package/docs/Std.Arrays/Mapped.md +1 -1
  59. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  60. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  61. package/docs/Std.Arrays/Most.md +1 -1
  62. package/docs/Std.Arrays/MostAndTail.md +1 -1
  63. package/docs/Std.Arrays/Padded.md +1 -1
  64. package/docs/Std.Arrays/Partitioned.md +1 -1
  65. package/docs/Std.Arrays/Rest.md +1 -1
  66. package/docs/Std.Arrays/Reversed.md +1 -1
  67. package/docs/Std.Arrays/SequenceI.md +1 -1
  68. package/docs/Std.Arrays/SequenceL.md +1 -1
  69. package/docs/Std.Arrays/Sorted.md +1 -1
  70. package/docs/Std.Arrays/Subarray.md +1 -1
  71. package/docs/Std.Arrays/Swapped.md +1 -1
  72. package/docs/Std.Arrays/Tail.md +1 -1
  73. package/docs/Std.Arrays/Transposed.md +1 -1
  74. package/docs/Std.Arrays/Unzipped.md +1 -1
  75. package/docs/Std.Arrays/Where.md +1 -1
  76. package/docs/Std.Arrays/Windows.md +1 -1
  77. package/docs/Std.Arrays/Zipped.md +1 -1
  78. package/docs/Std.Arrays/index.md +1 -1
  79. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  80. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  81. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  82. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  83. package/docs/Std.Canon/ApplyOperationPowerCA.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/ApplyQPE.md +1 -1
  90. package/docs/Std.Canon/ApplyToEach.md +1 -1
  91. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  92. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  93. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  94. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  95. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  96. package/docs/Std.Canon/CX.md +1 -1
  97. package/docs/Std.Canon/CY.md +1 -1
  98. package/docs/Std.Canon/CZ.md +1 -1
  99. package/docs/Std.Canon/Fst.md +1 -1
  100. package/docs/Std.Canon/MapPauliAxis.md +1 -1
  101. package/docs/Std.Canon/Relabel.md +1 -1
  102. package/docs/Std.Canon/Snd.md +1 -1
  103. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  104. package/docs/Std.Canon/index.md +1 -1
  105. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  106. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  107. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  108. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  109. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  110. package/docs/Std.Convert/BoolAsResult.md +1 -1
  111. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  112. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  113. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  114. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  115. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  116. package/docs/Std.Convert/IntAsDouble.md +1 -1
  117. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  118. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  119. package/docs/Std.Convert/ResultAsBool.md +1 -1
  120. package/docs/Std.Convert/index.md +1 -1
  121. package/docs/Std.Core/Complex.md +1 -1
  122. package/docs/Std.Core/Length.md +1 -1
  123. package/docs/Std.Core/Repeated.md +1 -1
  124. package/docs/Std.Core/index.md +1 -1
  125. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  126. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  127. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  128. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  129. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  130. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  131. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  132. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  133. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  134. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  135. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  136. package/docs/Std.Diagnostics/Fact.md +1 -1
  137. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  138. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  139. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  140. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  141. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  142. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  143. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  144. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  145. package/docs/Std.Diagnostics/index.md +1 -1
  146. package/docs/Std.Intrinsic/AND.md +1 -1
  147. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  148. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  149. package/docs/Std.Intrinsic/CNOT.md +1 -1
  150. package/docs/Std.Intrinsic/Exp.md +1 -1
  151. package/docs/Std.Intrinsic/H.md +1 -1
  152. package/docs/Std.Intrinsic/I.md +1 -1
  153. package/docs/Std.Intrinsic/M.md +1 -1
  154. package/docs/Std.Intrinsic/Measure.md +1 -1
  155. package/docs/Std.Intrinsic/Message.md +1 -1
  156. package/docs/Std.Intrinsic/R.md +1 -1
  157. package/docs/Std.Intrinsic/R1.md +1 -1
  158. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  159. package/docs/Std.Intrinsic/RFrac.md +1 -1
  160. package/docs/Std.Intrinsic/Reset.md +1 -1
  161. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  162. package/docs/Std.Intrinsic/Rx.md +1 -1
  163. package/docs/Std.Intrinsic/Rxx.md +1 -1
  164. package/docs/Std.Intrinsic/Ry.md +1 -1
  165. package/docs/Std.Intrinsic/Ryy.md +1 -1
  166. package/docs/Std.Intrinsic/Rz.md +1 -1
  167. package/docs/Std.Intrinsic/Rzz.md +1 -1
  168. package/docs/Std.Intrinsic/S.md +1 -1
  169. package/docs/Std.Intrinsic/SWAP.md +1 -1
  170. package/docs/Std.Intrinsic/SX.md +1 -1
  171. package/docs/Std.Intrinsic/T.md +1 -1
  172. package/docs/Std.Intrinsic/X.md +1 -1
  173. package/docs/Std.Intrinsic/Y.md +1 -1
  174. package/docs/Std.Intrinsic/Z.md +1 -1
  175. package/docs/Std.Intrinsic/index.md +1 -1
  176. package/docs/Std.Logical/Xor.md +1 -1
  177. package/docs/Std.Logical/index.md +1 -1
  178. package/docs/Std.Math/AbsComplex.md +1 -1
  179. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  180. package/docs/Std.Math/AbsD.md +1 -1
  181. package/docs/Std.Math/AbsI.md +1 -1
  182. package/docs/Std.Math/AbsL.md +1 -1
  183. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  184. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  185. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  186. package/docs/Std.Math/ArcCos.md +1 -1
  187. package/docs/Std.Math/ArcCosh.md +1 -1
  188. package/docs/Std.Math/ArcSin.md +1 -1
  189. package/docs/Std.Math/ArcSinh.md +1 -1
  190. package/docs/Std.Math/ArcTan.md +1 -1
  191. package/docs/Std.Math/ArcTan2.md +1 -1
  192. package/docs/Std.Math/ArcTanh.md +1 -1
  193. package/docs/Std.Math/ArgComplex.md +1 -1
  194. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  195. package/docs/Std.Math/Binom.md +1 -1
  196. package/docs/Std.Math/BitSizeI.md +1 -1
  197. package/docs/Std.Math/BitSizeL.md +1 -1
  198. package/docs/Std.Math/Ceiling.md +1 -1
  199. package/docs/Std.Math/Complex.md +1 -1
  200. package/docs/Std.Math/ComplexPolar.md +1 -1
  201. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  202. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  203. package/docs/Std.Math/Cos.md +1 -1
  204. package/docs/Std.Math/Cosh.md +1 -1
  205. package/docs/Std.Math/DivRemI.md +1 -1
  206. package/docs/Std.Math/DivRemL.md +1 -1
  207. package/docs/Std.Math/DividedByC.md +1 -1
  208. package/docs/Std.Math/DividedByCP.md +1 -1
  209. package/docs/Std.Math/E.md +1 -1
  210. package/docs/Std.Math/ExpModI.md +1 -1
  211. package/docs/Std.Math/ExpModL.md +1 -1
  212. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  213. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  214. package/docs/Std.Math/FactorialI.md +1 -1
  215. package/docs/Std.Math/FactorialL.md +1 -1
  216. package/docs/Std.Math/Floor.md +1 -1
  217. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  218. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  219. package/docs/Std.Math/HammingWeightI.md +1 -1
  220. package/docs/Std.Math/InverseModI.md +1 -1
  221. package/docs/Std.Math/InverseModL.md +1 -1
  222. package/docs/Std.Math/IsCoprimeI.md +1 -1
  223. package/docs/Std.Math/IsCoprimeL.md +1 -1
  224. package/docs/Std.Math/IsInfinite.md +1 -1
  225. package/docs/Std.Math/IsNaN.md +1 -1
  226. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  227. package/docs/Std.Math/Lg.md +1 -1
  228. package/docs/Std.Math/Log.md +1 -1
  229. package/docs/Std.Math/Log10.md +1 -1
  230. package/docs/Std.Math/LogFactorialD.md +1 -1
  231. package/docs/Std.Math/LogGammaD.md +1 -1
  232. package/docs/Std.Math/LogOf2.md +1 -1
  233. package/docs/Std.Math/Max.md +1 -1
  234. package/docs/Std.Math/MaxD.md +1 -1
  235. package/docs/Std.Math/MaxI.md +1 -1
  236. package/docs/Std.Math/MaxL.md +1 -1
  237. package/docs/Std.Math/Min.md +1 -1
  238. package/docs/Std.Math/MinD.md +1 -1
  239. package/docs/Std.Math/MinI.md +1 -1
  240. package/docs/Std.Math/MinL.md +1 -1
  241. package/docs/Std.Math/MinusC.md +1 -1
  242. package/docs/Std.Math/MinusCP.md +1 -1
  243. package/docs/Std.Math/ModulusI.md +1 -1
  244. package/docs/Std.Math/ModulusL.md +1 -1
  245. package/docs/Std.Math/NegationC.md +1 -1
  246. package/docs/Std.Math/NegationCP.md +1 -1
  247. package/docs/Std.Math/PI.md +1 -1
  248. package/docs/Std.Math/PNorm.md +1 -1
  249. package/docs/Std.Math/PNormalized.md +1 -1
  250. package/docs/Std.Math/PlusC.md +1 -1
  251. package/docs/Std.Math/PlusCP.md +1 -1
  252. package/docs/Std.Math/PowC.md +1 -1
  253. package/docs/Std.Math/PowCP.md +1 -1
  254. package/docs/Std.Math/RealMod.md +1 -1
  255. package/docs/Std.Math/Round.md +1 -1
  256. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  257. package/docs/Std.Math/SignD.md +1 -1
  258. package/docs/Std.Math/SignI.md +1 -1
  259. package/docs/Std.Math/SignL.md +1 -1
  260. package/docs/Std.Math/Sin.md +1 -1
  261. package/docs/Std.Math/Sinh.md +1 -1
  262. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  263. package/docs/Std.Math/Sqrt.md +1 -1
  264. package/docs/Std.Math/SquaredNorm.md +1 -1
  265. package/docs/Std.Math/Tan.md +1 -1
  266. package/docs/Std.Math/Tanh.md +1 -1
  267. package/docs/Std.Math/TimesC.md +1 -1
  268. package/docs/Std.Math/TimesCP.md +1 -1
  269. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  270. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  271. package/docs/Std.Math/Truncate.md +1 -1
  272. package/docs/Std.Math/index.md +1 -1
  273. package/docs/Std.Measurement/IsLossResult.md +1 -1
  274. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  275. package/docs/Std.Measurement/MResetX.md +1 -1
  276. package/docs/Std.Measurement/MResetY.md +1 -1
  277. package/docs/Std.Measurement/MResetZ.md +1 -1
  278. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  279. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  280. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  281. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  282. package/docs/Std.Measurement/index.md +1 -1
  283. package/docs/Std.Random/DrawRandomBool.md +1 -1
  284. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  285. package/docs/Std.Random/DrawRandomInt.md +1 -1
  286. package/docs/Std.Random/index.md +1 -1
  287. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  288. package/docs/Std.Range/RangeEnd.md +1 -1
  289. package/docs/Std.Range/RangeReverse.md +1 -1
  290. package/docs/Std.Range/RangeStart.md +1 -1
  291. package/docs/Std.Range/RangeStep.md +1 -1
  292. package/docs/Std.Range/index.md +1 -1
  293. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  294. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  295. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  296. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  297. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  298. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
  299. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  300. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  301. package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
  302. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  303. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  304. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  305. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  306. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  307. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  308. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  309. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  310. package/docs/Std.ResourceEstimation/index.md +1 -1
  311. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  312. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  313. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  314. package/docs/Std.StatePreparation/index.md +1 -1
  315. package/docs/Std.TableLookup/Select.md +1 -1
  316. package/docs/Std.TableLookup/index.md +1 -1
  317. package/docs/index.md +1 -1
  318. package/lib/nodejs/qsc_wasm.cjs +2 -2
  319. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  320. package/lib/web/qsc_wasm.js +2 -2
  321. package/lib/web/qsc_wasm_bg.wasm +0 -0
  322. package/package.json +2 -1
  323. package/ux/atoms/index.css +2 -1
  324. package/ux/atoms/layout.ts +59 -17
  325. package/ux/circuit-vis/angleExpression.ts +133 -0
  326. package/ux/circuit-vis/contextMenu.ts +8 -73
  327. package/ux/circuit-vis/events.ts +41 -1
  328. package/ux/circuit-vis/formatters/inputFormatter.ts +14 -6
  329. package/ux/circuit-vis/index.ts +12 -4
  330. package/ux/circuit-vis/panel.ts +65 -28
  331. package/ux/circuit-vis/sqore.ts +30 -16
  332. package/ux/circuit-vis/state-viz/stateViz.ts +763 -0
  333. package/ux/circuit-vis/state-viz/stateVizController.ts +285 -0
  334. package/ux/circuit-vis/state-viz/worker/index.ts +18 -0
  335. package/ux/circuit-vis/state-viz/worker/stateCompute.ts +260 -0
  336. package/ux/circuit-vis/state-viz/worker/stateVizPrep.ts +152 -0
  337. package/ux/circuit.tsx +17 -28
  338. package/ux/data.ts +5 -3
  339. package/ux/histogram.tsx +11 -5
  340. package/ux/index.ts +2 -0
  341. package/ux/qdk-theme.css +15 -0
  342. package/ux/qsharp-circuit.css +311 -1
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: function
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.ResourceEstimation
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: function
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.ResourceEstimation
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.ResourceEstimation-toc
3
3
  title: Std.ResourceEstimation namespace
4
4
  description: Table of contents for the Q# ResourceEstimation namespace
5
- ms.date: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  ms.topic: landing-page
7
7
  ---
8
8
 
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: operation
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.StatePreparation
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: operation
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.StatePreparation
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: operation
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.StatePreparation
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.StatePreparation-toc
3
3
  title: Std.StatePreparation namespace
4
4
  description: Table of contents for the Q# StatePreparation namespace
5
- ms.date: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  ms.topic: landing-page
7
7
  ---
8
8
 
@@ -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: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  qsharp.kind: operation
7
7
  qsharp.package: __Std__
8
8
  qsharp.namespace: Std.TableLookup
@@ -2,7 +2,7 @@
2
2
  uid: Qdk.Std.TableLookup-toc
3
3
  title: Std.TableLookup namespace
4
4
  description: Table of contents for the Q# TableLookup namespace
5
- ms.date: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  ms.topic: landing-page
7
7
  ---
8
8
 
package/docs/index.md CHANGED
@@ -2,7 +2,7 @@
2
2
  uid: Microsoft.Quantum.apiref-toc
3
3
  title: Q# standard libraries for the Microsoft Quantum Development Kit
4
4
  description: Table of contents for the Q# standard libraries for Microsoft Quantum Development Kit
5
- ms.date: 02/02/2026
5
+ ms.date: 02/19/2026
6
6
  ms.topic: landing-page
7
7
  ---
8
8
 
@@ -1570,8 +1570,8 @@ module.exports.__wbindgen_cb_drop = function(arg0) {
1570
1570
  return ret;
1571
1571
  };
1572
1572
 
1573
- module.exports.__wbindgen_closure_wrapper6555 = function(arg0, arg1, arg2) {
1574
- const ret = makeMutClosure(arg0, arg1, 2064, __wbg_adapter_52);
1573
+ module.exports.__wbindgen_closure_wrapper6572 = function(arg0, arg1, arg2) {
1574
+ const ret = makeMutClosure(arg0, arg1, 2071, __wbg_adapter_52);
1575
1575
  return addHeapObject(ret);
1576
1576
  };
1577
1577
 
Binary file
@@ -1525,8 +1525,8 @@ function __wbg_get_imports() {
1525
1525
  const ret = false;
1526
1526
  return ret;
1527
1527
  };
1528
- imports.wbg.__wbindgen_closure_wrapper6555 = function(arg0, arg1, arg2) {
1529
- const ret = makeMutClosure(arg0, arg1, 2064, __wbg_adapter_52);
1528
+ imports.wbg.__wbindgen_closure_wrapper6572 = function(arg0, arg1, arg2) {
1529
+ const ret = makeMutClosure(arg0, arg1, 2071, __wbg_adapter_52);
1530
1530
  return addHeapObject(ret);
1531
1531
  };
1532
1532
  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.25.3-dev",
4
+ "version": "1.25.5-dev",
5
5
  "license": "MIT",
6
6
  "engines": {
7
7
  "node": ">=16.17.0"
@@ -22,6 +22,7 @@
22
22
  "./debug-service-worker": "./dist/debug-service/worker-browser.js",
23
23
  "./katas": "./dist/katas.js",
24
24
  "./katas-md": "./dist/katas-md.js",
25
+ "./state-viz": "./ux/circuit-vis/state-viz/worker/index.ts",
25
26
  "./ux": "./ux/index.ts",
26
27
  "./qdk-theme.css": "./ux/qdk-theme.css"
27
28
  },
@@ -14,6 +14,7 @@
14
14
  padding: 16px;
15
15
  display: flex;
16
16
  flex-direction: column;
17
+ position: relative;
17
18
  }
18
19
 
19
20
  .qs-atoms-app:focus {
@@ -165,7 +166,7 @@
165
166
  position: absolute;
166
167
  display: none;
167
168
  left: 40px;
168
- top: 50px;
169
+ top: 48px;
169
170
  border: 1px solid var(--qdk-mid-gray);
170
171
  border-radius: 8px;
171
172
  background-color: var(--qdk-host-background);
@@ -10,7 +10,7 @@ type ZoneDataInput = {
10
10
  kind: "register" | "interaction" | "measurement";
11
11
  } & (
12
12
  | { rows: number; rowStart?: never; rowEnd?: never }
13
- | { rowStart: number; rowEnd: number; rows?: never }
13
+ | { rowStart: number; rowEnd: number; skipRows?: number[]; rows?: never }
14
14
  );
15
15
 
16
16
  // Normalized internal format always uses rowStart/rowEnd
@@ -18,6 +18,7 @@ type ZoneData = {
18
18
  title: string;
19
19
  rowStart: number;
20
20
  rowEnd: number;
21
+ skipRows?: number[];
21
22
  kind: "register" | "interaction" | "measurement";
22
23
  };
23
24
 
@@ -28,18 +29,31 @@ export type ZoneLayout = {
28
29
  // e.g. if `skipCols: [0,9]` was provided, then a `move(0,1)` would actually move to visual column 0,
29
30
  // and a `move(1,10)` would move to visual column 8.
30
31
  skipCols?: number[];
32
+ // If renumber is true, then all rows and columns will be renumbered in the visualization to be sequential starting from 0
33
+ renumber?: boolean;
31
34
  };
32
35
 
36
+ const TWO_QUBIT_GATES = ["CX", "CY", "CZ", "RXX", "RYY", "RZZ", "SWAP"];
37
+
33
38
  // Normalize zone data to always use rowStart/rowEnd format
34
39
  function normalizeZones(zones: ZoneDataInput[]): ZoneData[] {
35
40
  let nextRowStart = 0;
36
41
  return zones.map((zone) => {
37
42
  if ("rowStart" in zone && zone.rowStart !== undefined) {
43
+ // Verify if skipRows are within the rowStart and rowEnd range
44
+ if (zone.skipRows) {
45
+ if (
46
+ !zone.skipRows.every((r) => r >= zone.rowStart && r <= zone.rowEnd)
47
+ ) {
48
+ throw `Invalid skipRows in zone "${zone.title}": all skipRows must be between rowStart and rowEnd`;
49
+ }
50
+ }
38
51
  // New format with explicit rowStart/rowEnd
39
52
  return {
40
53
  title: zone.title,
41
54
  rowStart: zone.rowStart,
42
55
  rowEnd: zone.rowEnd,
56
+ skipRows: zone.skipRows,
43
57
  kind: zone.kind,
44
58
  };
45
59
  } else {
@@ -97,6 +111,7 @@ export function fillQubitLocations(
97
111
  normalizedZones.forEach((zone) => {
98
112
  if (zone.kind === "register") {
99
113
  for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
114
+ if (zone.skipRows && zone.skipRows.includes(row)) continue;
100
115
  for (let col = 0; col < layout.cols; ++col) {
101
116
  qubits.push([row, col]);
102
117
  }
@@ -121,7 +136,7 @@ function parseMove(
121
136
  op: string,
122
137
  skipCols?: number[],
123
138
  ): { qubit: number; to: Location } | undefined {
124
- const match = op.match(/move\((\d+), (\d+)\) (\d+)/);
139
+ const match = op.match(/move?\((\d+), (\d+)\) (\d+)/);
125
140
  if (match) {
126
141
  const to: Location = [
127
142
  parseInt(match[1]),
@@ -134,15 +149,15 @@ function parseMove(
134
149
 
135
150
  function parseGate(
136
151
  op: string,
137
- ): { gate: string; qubit: number; arg?: string } | undefined {
138
- const match = op.match(/(\w+)\s*(\(.*\))? (\d+)/);
152
+ ): { gate: string; qubits: number[]; arg?: string } | undefined {
153
+ const match = op.match(/(\w+)\s*(\(.*\))? ([\d,\s]+)/);
139
154
  if (match) {
140
155
  const gate = match[1];
141
- const qubit = parseInt(match[3]);
156
+ const qubits = match[3].split(",").map((s) => parseInt(s.trim()));
142
157
  const arg = match[2]
143
158
  ? match[2].substring(1, match[2].length - 2)
144
159
  : undefined;
145
- return { gate, qubit, arg };
160
+ return { gate, qubits, arg };
146
161
  }
147
162
  }
148
163
 
@@ -347,7 +362,8 @@ export class Layout {
347
362
  this.effectiveCols = layout.cols - (layout.skipCols?.length ?? 0);
348
363
 
349
364
  const totalRows = this.normalizedZones.reduce(
350
- (prev, curr) => prev + (curr.rowEnd - curr.rowStart + 1),
365
+ (prev, curr) =>
366
+ prev + (curr.rowEnd - curr.rowStart + 1) - (curr.skipRows?.length ?? 0),
351
367
  0,
352
368
  );
353
369
 
@@ -365,11 +381,14 @@ export class Layout {
365
381
  // Maps absolute row numbers to visual Y offsets
366
382
  this.rowOffsetMap = new Map();
367
383
  let nextOffset = zoneSpacing;
384
+ let globalRowIndex = 0;
368
385
  this.normalizedZones.forEach((zone, index) => {
369
- this.renderZone(index, nextOffset);
386
+ globalRowIndex = this.renderZone(index, nextOffset, globalRowIndex);
370
387
  for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
371
- this.rowOffsetMap.set(row, nextOffset);
372
- nextOffset += qubitSize;
388
+ if (!zone.skipRows?.includes(row)) {
389
+ this.rowOffsetMap.set(row, nextOffset);
390
+ nextOffset += qubitSize;
391
+ }
373
392
  }
374
393
  nextOffset += zoneSpacing; // Add spacing after each zone
375
394
  });
@@ -419,9 +438,17 @@ export class Layout {
419
438
  return this.trace.steps[step].ops;
420
439
  }
421
440
 
422
- private renderZone(zoneIndex: number, offset: number) {
441
+ private renderZone(
442
+ zoneIndex: number,
443
+ offset: number,
444
+ globalRowIndex: number,
445
+ ): number {
423
446
  const zoneData = this.normalizedZones[zoneIndex];
424
- const zoneRows = zoneData.rowEnd - zoneData.rowStart + 1;
447
+ const zoneRows =
448
+ zoneData.rowEnd -
449
+ zoneData.rowStart +
450
+ 1 -
451
+ (zoneData.skipRows?.length ?? 0);
425
452
  const g = createSvgElements("g")[0];
426
453
  setAttributes(g, {
427
454
  transform: `translate(0 ${offset})`,
@@ -478,16 +505,19 @@ export class Layout {
478
505
  }
479
506
 
480
507
  // Number the rows using the absolute row numbers from rowStart to rowEnd
481
- for (let i = 0; i < zoneRows; ++i) {
482
- const rowNum = zoneData.rowStart + i;
508
+ let i = 0;
509
+ for (let rowNum = zoneData.rowStart; rowNum <= zoneData.rowEnd; ++rowNum) {
510
+ if (zoneData.skipRows && zoneData.skipRows.includes(rowNum)) continue;
483
511
  const label = createSvgElements("text")[0];
484
512
  setAttributes(label, {
485
513
  x: `${this.effectiveCols * qubitSize + 5}`,
486
514
  y: `${i * qubitSize + 5}`,
487
515
  class: "qs-atoms-label",
488
516
  });
489
- label.textContent = `${rowNum}`;
517
+ label.textContent = `${this.layout.renumber ? globalRowIndex : rowNum}`;
490
518
  appendChildren(g, [label]);
519
+ ++i;
520
+ ++globalRowIndex;
491
521
  }
492
522
 
493
523
  // Draw the title
@@ -501,6 +531,7 @@ export class Layout {
501
531
 
502
532
  appendChildren(g, [text]);
503
533
  appendChildren(this.container, [g]);
534
+ return globalRowIndex;
504
535
  }
505
536
 
506
537
  private renderQubits() {
@@ -547,7 +578,7 @@ export class Layout {
547
578
  y: `5`,
548
579
  class: "qs-atoms-label",
549
580
  });
550
- label.textContent = `${origCol}`;
581
+ label.textContent = `${this.layout.renumber ? visualCol : origCol}`;
551
582
  appendChildren(g, [label]);
552
583
  ++visualCol;
553
584
  }
@@ -887,7 +918,18 @@ export class Layout {
887
918
  const gate = parseGate(op);
888
919
  if (!gate) throw `Invalid gate: ${op}`;
889
920
  const arg = gate.arg ? gate.arg.substring(0, 4) : undefined;
890
- this.renderGateOnQubit(gate.qubit, gate.gate.toUpperCase(), arg);
921
+ const isTwoQubitGate = TWO_QUBIT_GATES.includes(
922
+ gate.gate.toUpperCase(),
923
+ );
924
+ // Handle the case where an op is a list of qubits to apply the same op to
925
+ for (let i = 0; i < gate.qubits.length; i++) {
926
+ if (isTwoQubitGate && i % 2 !== 0) continue;
927
+ this.renderGateOnQubit(
928
+ gate.qubits[i],
929
+ gate.gate.toUpperCase(),
930
+ arg,
931
+ );
932
+ }
891
933
  }
892
934
  }
893
935
  });
@@ -0,0 +1,133 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+
4
+ // Normalizes "pi" (any case) to "π" and trims whitespace for
5
+ // consistent storage and display.
6
+ export function normalizeAngleExpression(expr: string): string {
7
+ return expr.trim().replace(/pi/gi, "π");
8
+ }
9
+
10
+ // Evaluate a simple arithmetic expression supporting numbers, + - * /, parentheses, and π.
11
+ // Returns `undefined` for invalid inputs.
12
+ export function evaluateAngleExpression(expr: string): number | undefined {
13
+ if (!expr) return undefined;
14
+ const src = normalizeAngleExpression(expr);
15
+ if (!src) return undefined;
16
+
17
+ // Tokenizer
18
+ type Tok = { type: "num" | "pi" | "op" | "lpar" | "rpar"; value?: string };
19
+ const toks: Tok[] = [];
20
+ let i = 0;
21
+ while (i < src.length) {
22
+ const ch = src[i];
23
+ if (ch === " " || ch === "\t" || ch === "\n") {
24
+ i++;
25
+ continue;
26
+ }
27
+ if (ch === "(" || ch === ")") {
28
+ toks.push({ type: ch === "(" ? "lpar" : "rpar" });
29
+ i++;
30
+ continue;
31
+ }
32
+ if (ch === "+" || ch === "-" || ch === "*" || ch === "/") {
33
+ toks.push({ type: "op", value: ch });
34
+ i++;
35
+ continue;
36
+ }
37
+ if (ch === "π") {
38
+ toks.push({ type: "pi" });
39
+ i++;
40
+ continue;
41
+ }
42
+ // number: digits with optional decimal part; no leading dot
43
+ if (ch === "." || /\d/.test(ch)) {
44
+ let j = i + 1;
45
+ while (j < src.length && /[0-9.]/.test(src[j])) j++;
46
+ const numStr = src.slice(i, j);
47
+ const valid = /^(?:\d+(?:\.\d*)?)$/.test(numStr);
48
+ if (!valid) return undefined;
49
+ toks.push({ type: "num", value: numStr });
50
+ i = j;
51
+ continue;
52
+ }
53
+ // Unknown character
54
+ return undefined;
55
+ }
56
+
57
+ // Recursive descent parser
58
+ let k = 0;
59
+ const peek = () => toks[k];
60
+ const consume = () => toks[k++];
61
+
62
+ const parseExpr = (): number | undefined => {
63
+ let lhs = parseTerm();
64
+ if (lhs === undefined) return undefined;
65
+ while (
66
+ peek() &&
67
+ peek().type === "op" &&
68
+ (peek().value === "+" || peek().value === "-")
69
+ ) {
70
+ const op = consume().value!;
71
+ const rhs = parseTerm();
72
+ if (rhs === undefined) return undefined;
73
+ lhs = op === "+" ? lhs + rhs : lhs - rhs;
74
+ }
75
+ return lhs;
76
+ };
77
+
78
+ const parseTerm = (): number | undefined => {
79
+ let lhs = parseFactor();
80
+ if (lhs === undefined) return undefined;
81
+ while (
82
+ peek() &&
83
+ peek().type === "op" &&
84
+ (peek().value === "*" || peek().value === "/")
85
+ ) {
86
+ const op = consume().value!;
87
+ const rhs = parseFactor();
88
+ if (rhs === undefined) return undefined;
89
+ lhs = op === "*" ? lhs * rhs : lhs / rhs;
90
+ }
91
+ return lhs;
92
+ };
93
+
94
+ const parseFactor = (): number | undefined => {
95
+ let sign = 1;
96
+ if (
97
+ peek() &&
98
+ peek().type === "op" &&
99
+ (peek().value === "+" || peek().value === "-")
100
+ ) {
101
+ sign = consume().value! === "-" ? -1 : 1;
102
+ }
103
+
104
+ const t = peek();
105
+ if (!t) return undefined;
106
+ if (t.type === "num") {
107
+ consume();
108
+ return sign * parseFloat(t.value!);
109
+ }
110
+ if (t.type === "pi") {
111
+ consume();
112
+ return sign * Math.PI;
113
+ }
114
+ if (t.type === "lpar") {
115
+ consume();
116
+ const v = parseExpr();
117
+ if (peek() && peek().type === "rpar") consume();
118
+ else return undefined;
119
+ if (v === undefined) return undefined;
120
+ return sign * v;
121
+ }
122
+ return undefined;
123
+ };
124
+
125
+ const result = parseExpr();
126
+ if (result === undefined || k !== toks.length || !isFinite(result))
127
+ return undefined;
128
+ return result;
129
+ }
130
+
131
+ export function isValidAngleExpression(expr: string): boolean {
132
+ return evaluateAngleExpression(expr) !== undefined;
133
+ }
@@ -5,6 +5,10 @@ import { Parameter } from "./circuit.js";
5
5
  import { removeControl, removeOperation } from "./circuitManipulation.js";
6
6
  import { CircuitEvents } from "./events.js";
7
7
  import { findGateElem, findOperation } from "./utils.js";
8
+ import {
9
+ isValidAngleExpression,
10
+ normalizeAngleExpression,
11
+ } from "./angleExpression.js";
8
12
 
9
13
  /**
10
14
  * Adds a context menu to a host element in the circuit visualization.
@@ -176,7 +180,7 @@ const promptForArguments = (
176
180
  }
177
181
  },
178
182
  defaultValue,
179
- validateExpression,
183
+ isValidAngleExpression,
180
184
  'Examples: "2.0 * π" or "π / 2.0"',
181
185
  );
182
186
  };
@@ -185,72 +189,6 @@ const promptForArguments = (
185
189
  });
186
190
  };
187
191
 
188
- /**
189
- * Validate a mathematical expression.
190
- * @param input - The input string to validate.
191
- * @returns True if the expression is valid, false otherwise.
192
- */
193
- const validateExpression = (input: string): boolean => {
194
- // Removes outermost parentheses
195
- const removeParentheses = (expr: string): string => {
196
- while (expr.startsWith("(") && expr.endsWith(")")) {
197
- expr = expr.slice(1, -1).trim(); // Remove outermost parentheses
198
- }
199
- return expr;
200
- };
201
-
202
- // Validates parentheses balance and nesting
203
- const validateParentheses = (expr: string): boolean => {
204
- const stack: string[] = [];
205
- for (const char of expr) {
206
- if (char === "(") {
207
- stack.push(char);
208
- } else if (char === ")") {
209
- if (stack.length === 0) {
210
- return false; // Unmatched closing parenthesis
211
- }
212
- stack.pop();
213
- }
214
- }
215
- return stack.length === 0; // Ensure no unmatched opening parentheses
216
- };
217
-
218
- // Validate the expression recursively
219
- const validate = (expr: string): boolean => {
220
- expr = expr.trim();
221
-
222
- // Remove outermost parentheses
223
- expr = removeParentheses(expr);
224
-
225
- // Find and validate all sub-expressions within parentheses
226
- const parenthesesRegex = /\(([^()]+)\)/g;
227
- let match;
228
- while ((match = parenthesesRegex.exec(expr)) !== null) {
229
- const innerExpr = match[1];
230
- if (!validate(innerExpr)) {
231
- return false; // Invalid sub-expression
232
- }
233
-
234
- // Replace the validated sub-expression with a placeholder that we know is valid
235
- expr = expr.replace(match[0], "π");
236
- }
237
-
238
- // Validate the remaining expression (without parentheses)
239
- const sign = "[+-]?";
240
- const number = "((\\d+(\\.\\d*)?))"; // Matches integers and decimals
241
- const pi = "(?i:π)"; // Matches π
242
- const value = `${sign}(${number}|${pi})`; // Matches a signed number or π
243
- const operator = "[+\\-*/]"; // Matches arithmetic operators
244
- const expressionRegex = new RegExp(
245
- `^${value}(\\s*${operator}\\s*${value})*$`,
246
- );
247
-
248
- return expressionRegex.test(expr);
249
- };
250
-
251
- return validateParentheses(input) && validate(input);
252
- };
253
-
254
192
  /**
255
193
  * Create a context menu item
256
194
  * @param text - The text to display in the menu item
@@ -316,12 +254,9 @@ const _createInputPrompt = (
316
254
  okButton.classList.add("prompt-button");
317
255
  okButton.textContent = "OK";
318
256
 
319
- // Function to replace "pi" with "π" (case-insensitive)
320
- const replacePiWithSymbol = (input: string) => input.replace(/pi/gi, "π");
321
-
322
257
  // Function to validate input and toggle the OK button
323
258
  const validateAndToggleOkButton = () => {
324
- const processedInput = replacePiWithSymbol(inputElem.value.trim());
259
+ const processedInput = normalizeAngleExpression(inputElem.value);
325
260
  const isValid = validateInput(processedInput);
326
261
  okButton.disabled = !isValid;
327
262
  };
@@ -337,9 +272,9 @@ const _createInputPrompt = (
337
272
  }
338
273
  });
339
274
 
340
- okButton.disabled = !validateInput(replacePiWithSymbol(defaultValue.trim()));
275
+ okButton.disabled = !validateInput(normalizeAngleExpression(defaultValue));
341
276
  okButton.addEventListener("click", () => {
342
- callback(replacePiWithSymbol(inputElem.value.trim()));
277
+ callback(normalizeAngleExpression(inputElem.value));
343
278
  document.body.removeChild(overlay);
344
279
  document.removeEventListener("keydown", handleGlobalKeyDown, true);
345
280
  });
@@ -1,7 +1,13 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
3
 
4
- import { ComponentGrid, Operation, Qubit, Unitary } from "./circuit.js";
4
+ import {
5
+ Circuit,
6
+ ComponentGrid,
7
+ Operation,
8
+ Qubit,
9
+ Unitary,
10
+ } from "./circuit.js";
5
11
  import { Sqore } from "./sqore.js";
6
12
  import { toolboxGateDictionary } from "./panel.js";
7
13
  import {
@@ -39,6 +45,7 @@ import {
39
45
  import { getOperationRegisters } from "../../src/utils.js";
40
46
 
41
47
  let events: CircuitEvents | null = null;
48
+ let currentCircuitSvg: SVGElement | null = null;
42
49
 
43
50
  /**
44
51
  * Creates and attaches the events that allow editing of the circuit.
@@ -55,6 +62,26 @@ const enableEvents = (
55
62
  events.dispose();
56
63
  }
57
64
  events = new CircuitEvents(container, sqore, useRefresh);
65
+
66
+ // Track which rendered SVG the current `events` instance is associated with.
67
+ // This lets other modules avoid reading a stale model during a re-render where
68
+ // the SVG has been replaced but `enableEvents` hasn't run yet.
69
+ currentCircuitSvg = container.querySelector("svg.qviz") as SVGElement | null;
70
+
71
+ // Signal that the circuit model (events + model snapshot) is now ready.
72
+ // The state visualization uses this to re-render without relying on polling.
73
+ try {
74
+ const CustomEventCtor = (globalThis as any).CustomEvent as
75
+ | (new (type: string, init?: CustomEventInit) => CustomEvent)
76
+ | undefined;
77
+ if (CustomEventCtor && typeof container.dispatchEvent === "function") {
78
+ container.dispatchEvent(
79
+ new CustomEventCtor("qsharp:circuit:modelReady", { bubbles: true }),
80
+ );
81
+ }
82
+ } catch {
83
+ // ignore
84
+ }
58
85
  };
59
86
 
60
87
  class CircuitEvents {
@@ -1062,3 +1089,16 @@ const _createConfirmPrompt = (
1062
1089
  };
1063
1090
 
1064
1091
  export { enableEvents, CircuitEvents };
1092
+
1093
+ // Provide access to the current circuit model, but only if it matches the
1094
+ // currently-rendered SVG element. This prevents state visualization from
1095
+ // computing against the previous render's model during a re-render.
1096
+ export function getCurrentCircuitModel(
1097
+ expectedSvg?: SVGElement | null,
1098
+ ): Circuit | null {
1099
+ if (events == null) return null;
1100
+ if (expectedSvg && currentCircuitSvg && expectedSvg !== currentCircuitSvg) {
1101
+ return null;
1102
+ }
1103
+ return { qubits: events.qubits, componentGrid: events.componentGrid };
1104
+ }