qsharp-lang 1.22.3-dev → 1.22.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 (346) hide show
  1. package/dist/compiler/common.d.ts +16 -3
  2. package/dist/compiler/compiler.d.ts +3 -3
  3. package/dist/compiler/compiler.js +2 -2
  4. package/dist/data-structures/circuit.d.ts +13 -0
  5. package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
  6. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  7. package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
  8. package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
  9. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  10. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  11. package/docs/Std.Arithmetic/AddLE.md +1 -1
  12. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  13. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  14. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  15. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  16. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  17. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  18. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  19. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  22. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  23. package/docs/Std.Arithmetic/IncByI.md +1 -1
  24. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  25. package/docs/Std.Arithmetic/IncByL.md +1 -1
  26. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  27. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  28. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  29. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  30. package/docs/Std.Arithmetic/MAJ.md +1 -1
  31. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  32. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  33. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  34. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/index.md +1 -1
  36. package/docs/Std.Arrays/All.md +1 -1
  37. package/docs/Std.Arrays/Any.md +1 -1
  38. package/docs/Std.Arrays/Chunks.md +1 -1
  39. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  40. package/docs/Std.Arrays/ColumnAt.md +1 -1
  41. package/docs/Std.Arrays/Count.md +1 -1
  42. package/docs/Std.Arrays/Diagonal.md +1 -1
  43. package/docs/Std.Arrays/DrawMany.md +1 -1
  44. package/docs/Std.Arrays/Enumerated.md +1 -1
  45. package/docs/Std.Arrays/Excluding.md +1 -1
  46. package/docs/Std.Arrays/Filtered.md +1 -1
  47. package/docs/Std.Arrays/FlatMapped.md +1 -1
  48. package/docs/Std.Arrays/Flattened.md +1 -1
  49. package/docs/Std.Arrays/Fold.md +1 -1
  50. package/docs/Std.Arrays/ForEach.md +1 -1
  51. package/docs/Std.Arrays/Head.md +1 -1
  52. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  53. package/docs/Std.Arrays/IndexOf.md +1 -1
  54. package/docs/Std.Arrays/IndexRange.md +1 -1
  55. package/docs/Std.Arrays/Interleaved.md +1 -1
  56. package/docs/Std.Arrays/IsEmpty.md +1 -1
  57. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  58. package/docs/Std.Arrays/IsSorted.md +1 -1
  59. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  60. package/docs/Std.Arrays/Mapped.md +1 -1
  61. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  62. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  63. package/docs/Std.Arrays/Most.md +1 -1
  64. package/docs/Std.Arrays/MostAndTail.md +1 -1
  65. package/docs/Std.Arrays/Padded.md +1 -1
  66. package/docs/Std.Arrays/Partitioned.md +1 -1
  67. package/docs/Std.Arrays/Rest.md +1 -1
  68. package/docs/Std.Arrays/Reversed.md +1 -1
  69. package/docs/Std.Arrays/SequenceI.md +1 -1
  70. package/docs/Std.Arrays/SequenceL.md +1 -1
  71. package/docs/Std.Arrays/Sorted.md +1 -1
  72. package/docs/Std.Arrays/Subarray.md +1 -1
  73. package/docs/Std.Arrays/Swapped.md +1 -1
  74. package/docs/Std.Arrays/Tail.md +1 -1
  75. package/docs/Std.Arrays/Transposed.md +1 -1
  76. package/docs/Std.Arrays/Unzipped.md +1 -1
  77. package/docs/Std.Arrays/Where.md +1 -1
  78. package/docs/Std.Arrays/Windows.md +1 -1
  79. package/docs/Std.Arrays/Zipped.md +1 -1
  80. package/docs/Std.Arrays/index.md +1 -1
  81. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  82. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  83. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  84. package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
  85. package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
  86. package/docs/Std.Canon/ApplyP.md +1 -1
  87. package/docs/Std.Canon/ApplyPauli.md +1 -1
  88. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  89. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  90. package/docs/Std.Canon/ApplyQFT.md +1 -1
  91. package/docs/Std.Canon/ApplyQPE.md +1 -1
  92. package/docs/Std.Canon/ApplyToEach.md +1 -1
  93. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  94. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  95. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  96. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  97. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  98. package/docs/Std.Canon/CX.md +1 -1
  99. package/docs/Std.Canon/CY.md +1 -1
  100. package/docs/Std.Canon/CZ.md +1 -1
  101. package/docs/Std.Canon/Fst.md +1 -1
  102. package/docs/Std.Canon/MapPauliAxis.md +1 -1
  103. package/docs/Std.Canon/Relabel.md +1 -1
  104. package/docs/Std.Canon/Snd.md +1 -1
  105. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  106. package/docs/Std.Canon/index.md +1 -1
  107. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  108. package/docs/Std.Convert/BigIntAsInt.md +1 -1
  109. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  110. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  111. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  112. package/docs/Std.Convert/BoolAsResult.md +1 -1
  113. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  114. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  115. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  116. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  117. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  118. package/docs/Std.Convert/IntAsDouble.md +1 -1
  119. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  120. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  121. package/docs/Std.Convert/ResultAsBool.md +1 -1
  122. package/docs/Std.Convert/index.md +1 -1
  123. package/docs/Std.Core/Complex.md +1 -1
  124. package/docs/Std.Core/Length.md +1 -1
  125. package/docs/Std.Core/Repeated.md +1 -1
  126. package/docs/Std.Core/index.md +1 -1
  127. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  128. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  129. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  130. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  131. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  132. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  133. package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
  134. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  135. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  136. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  137. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  138. package/docs/Std.Diagnostics/Fact.md +1 -1
  139. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  140. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  141. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  142. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  143. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  144. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  145. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  147. package/docs/Std.Diagnostics/index.md +1 -1
  148. package/docs/Std.Intrinsic/AND.md +1 -1
  149. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  150. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  151. package/docs/Std.Intrinsic/CNOT.md +1 -1
  152. package/docs/Std.Intrinsic/Exp.md +1 -1
  153. package/docs/Std.Intrinsic/H.md +1 -1
  154. package/docs/Std.Intrinsic/I.md +1 -1
  155. package/docs/Std.Intrinsic/M.md +1 -1
  156. package/docs/Std.Intrinsic/Measure.md +1 -1
  157. package/docs/Std.Intrinsic/Message.md +1 -1
  158. package/docs/Std.Intrinsic/R.md +1 -1
  159. package/docs/Std.Intrinsic/R1.md +1 -1
  160. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  161. package/docs/Std.Intrinsic/RFrac.md +1 -1
  162. package/docs/Std.Intrinsic/Reset.md +1 -1
  163. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  164. package/docs/Std.Intrinsic/Rx.md +1 -1
  165. package/docs/Std.Intrinsic/Rxx.md +1 -1
  166. package/docs/Std.Intrinsic/Ry.md +1 -1
  167. package/docs/Std.Intrinsic/Ryy.md +1 -1
  168. package/docs/Std.Intrinsic/Rz.md +1 -1
  169. package/docs/Std.Intrinsic/Rzz.md +1 -1
  170. package/docs/Std.Intrinsic/S.md +1 -1
  171. package/docs/Std.Intrinsic/SWAP.md +1 -1
  172. package/docs/Std.Intrinsic/SX.md +1 -1
  173. package/docs/Std.Intrinsic/T.md +1 -1
  174. package/docs/Std.Intrinsic/X.md +1 -1
  175. package/docs/Std.Intrinsic/Y.md +1 -1
  176. package/docs/Std.Intrinsic/Z.md +1 -1
  177. package/docs/Std.Intrinsic/index.md +1 -1
  178. package/docs/Std.Logical/Xor.md +1 -1
  179. package/docs/Std.Logical/index.md +1 -1
  180. package/docs/Std.Math/AbsComplex.md +1 -1
  181. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  182. package/docs/Std.Math/AbsD.md +1 -1
  183. package/docs/Std.Math/AbsI.md +1 -1
  184. package/docs/Std.Math/AbsL.md +1 -1
  185. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  186. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  187. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  188. package/docs/Std.Math/ArcCos.md +1 -1
  189. package/docs/Std.Math/ArcCosh.md +1 -1
  190. package/docs/Std.Math/ArcSin.md +1 -1
  191. package/docs/Std.Math/ArcSinh.md +1 -1
  192. package/docs/Std.Math/ArcTan.md +1 -1
  193. package/docs/Std.Math/ArcTan2.md +1 -1
  194. package/docs/Std.Math/ArcTanh.md +1 -1
  195. package/docs/Std.Math/ArgComplex.md +1 -1
  196. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  197. package/docs/Std.Math/Binom.md +1 -1
  198. package/docs/Std.Math/BitSizeI.md +1 -1
  199. package/docs/Std.Math/BitSizeL.md +1 -1
  200. package/docs/Std.Math/Ceiling.md +1 -1
  201. package/docs/Std.Math/Complex.md +1 -1
  202. package/docs/Std.Math/ComplexPolar.md +1 -1
  203. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  204. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  205. package/docs/Std.Math/Cos.md +1 -1
  206. package/docs/Std.Math/Cosh.md +1 -1
  207. package/docs/Std.Math/DivRemI.md +1 -1
  208. package/docs/Std.Math/DivRemL.md +1 -1
  209. package/docs/Std.Math/DividedByC.md +1 -1
  210. package/docs/Std.Math/DividedByCP.md +1 -1
  211. package/docs/Std.Math/E.md +1 -1
  212. package/docs/Std.Math/ExpModI.md +1 -1
  213. package/docs/Std.Math/ExpModL.md +1 -1
  214. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  215. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  216. package/docs/Std.Math/FactorialI.md +1 -1
  217. package/docs/Std.Math/FactorialL.md +1 -1
  218. package/docs/Std.Math/Floor.md +1 -1
  219. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  220. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  221. package/docs/Std.Math/HammingWeightI.md +1 -1
  222. package/docs/Std.Math/InverseModI.md +1 -1
  223. package/docs/Std.Math/InverseModL.md +1 -1
  224. package/docs/Std.Math/IsCoprimeI.md +1 -1
  225. package/docs/Std.Math/IsCoprimeL.md +1 -1
  226. package/docs/Std.Math/IsInfinite.md +1 -1
  227. package/docs/Std.Math/IsNaN.md +1 -1
  228. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  229. package/docs/Std.Math/Lg.md +1 -1
  230. package/docs/Std.Math/Log.md +1 -1
  231. package/docs/Std.Math/Log10.md +1 -1
  232. package/docs/Std.Math/LogFactorialD.md +1 -1
  233. package/docs/Std.Math/LogGammaD.md +1 -1
  234. package/docs/Std.Math/LogOf2.md +1 -1
  235. package/docs/Std.Math/Max.md +1 -1
  236. package/docs/Std.Math/MaxD.md +1 -1
  237. package/docs/Std.Math/MaxI.md +1 -1
  238. package/docs/Std.Math/MaxL.md +1 -1
  239. package/docs/Std.Math/Min.md +1 -1
  240. package/docs/Std.Math/MinD.md +1 -1
  241. package/docs/Std.Math/MinI.md +1 -1
  242. package/docs/Std.Math/MinL.md +1 -1
  243. package/docs/Std.Math/MinusC.md +1 -1
  244. package/docs/Std.Math/MinusCP.md +1 -1
  245. package/docs/Std.Math/ModulusI.md +1 -1
  246. package/docs/Std.Math/ModulusL.md +1 -1
  247. package/docs/Std.Math/NegationC.md +1 -1
  248. package/docs/Std.Math/NegationCP.md +1 -1
  249. package/docs/Std.Math/PI.md +1 -1
  250. package/docs/Std.Math/PNorm.md +1 -1
  251. package/docs/Std.Math/PNormalized.md +1 -1
  252. package/docs/Std.Math/PlusC.md +1 -1
  253. package/docs/Std.Math/PlusCP.md +1 -1
  254. package/docs/Std.Math/PowC.md +1 -1
  255. package/docs/Std.Math/PowCP.md +1 -1
  256. package/docs/Std.Math/RealMod.md +1 -1
  257. package/docs/Std.Math/Round.md +1 -1
  258. package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
  259. package/docs/Std.Math/SignD.md +1 -1
  260. package/docs/Std.Math/SignI.md +1 -1
  261. package/docs/Std.Math/SignL.md +1 -1
  262. package/docs/Std.Math/Sin.md +1 -1
  263. package/docs/Std.Math/Sinh.md +1 -1
  264. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  265. package/docs/Std.Math/Sqrt.md +1 -1
  266. package/docs/Std.Math/SquaredNorm.md +1 -1
  267. package/docs/Std.Math/Tan.md +1 -1
  268. package/docs/Std.Math/Tanh.md +1 -1
  269. package/docs/Std.Math/TimesC.md +1 -1
  270. package/docs/Std.Math/TimesCP.md +1 -1
  271. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  272. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  273. package/docs/Std.Math/Truncate.md +1 -1
  274. package/docs/Std.Math/index.md +1 -1
  275. package/docs/Std.Measurement/IsLossResult.md +1 -1
  276. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  277. package/docs/Std.Measurement/MResetX.md +1 -1
  278. package/docs/Std.Measurement/MResetY.md +1 -1
  279. package/docs/Std.Measurement/MResetZ.md +1 -1
  280. package/docs/Std.Measurement/MResetZChecked.md +1 -1
  281. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  282. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  283. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  284. package/docs/Std.Measurement/index.md +1 -1
  285. package/docs/Std.Random/DrawRandomBool.md +1 -1
  286. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  287. package/docs/Std.Random/DrawRandomInt.md +1 -1
  288. package/docs/Std.Random/index.md +1 -1
  289. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  290. package/docs/Std.Range/RangeEnd.md +1 -1
  291. package/docs/Std.Range/RangeReverse.md +1 -1
  292. package/docs/Std.Range/RangeStart.md +1 -1
  293. package/docs/Std.Range/RangeStep.md +1 -1
  294. package/docs/Std.Range/index.md +1 -1
  295. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  296. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  297. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  298. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  299. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  300. package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
  301. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  302. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  303. package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
  304. package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
  305. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  306. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  307. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  308. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  309. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  310. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  311. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  312. package/docs/Std.ResourceEstimation/index.md +1 -1
  313. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  314. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  315. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  316. package/docs/Std.StatePreparation/index.md +1 -1
  317. package/docs/Std.TableLookup/Select.md +1 -1
  318. package/docs/Std.TableLookup/index.md +1 -1
  319. package/docs/index.md +1 -1
  320. package/lib/nodejs/qsc_wasm.cjs +85 -85
  321. package/lib/nodejs/qsc_wasm.d.cts +8 -1
  322. package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
  323. package/lib/web/qsc_wasm.d.ts +8 -1
  324. package/lib/web/qsc_wasm.js +78 -78
  325. package/lib/web/qsc_wasm_bg.wasm +0 -0
  326. package/package.json +1 -1
  327. package/ux/atoms/controls.ts +216 -0
  328. package/ux/atoms/index.css +226 -0
  329. package/ux/atoms/index.ts +192 -0
  330. package/ux/atoms/layout.ts +730 -0
  331. package/ux/atoms/utils.ts +32 -0
  332. package/ux/chem/index.tsx +191 -0
  333. package/ux/chem/style.css +83 -0
  334. package/ux/circuit-vis/circuit.ts +1 -0
  335. package/ux/circuit-vis/events.ts +1 -5
  336. package/ux/circuit-vis/formatters/gateFormatter.ts +67 -28
  337. package/ux/circuit-vis/formatters/inputFormatter.ts +28 -5
  338. package/ux/circuit-vis/gateRenderData.ts +2 -0
  339. package/ux/circuit-vis/index.ts +4 -7
  340. package/ux/circuit-vis/process.ts +28 -5
  341. package/ux/circuit-vis/sqore.ts +31 -22
  342. package/ux/circuit.tsx +40 -6
  343. package/ux/histogram.tsx +81 -18
  344. package/ux/index.ts +2 -0
  345. package/ux/qsharp-circuit.css +29 -1
  346. package/ux/qsharp-ux.css +8 -3
@@ -0,0 +1,32 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ // **** Helper functions for rendering SVG elements ****
5
+
6
+ type StringMap = Record<string, string>;
7
+
8
+ export function createSvgElements(...tags: string[]): SVGElement[] {
9
+ return tags.map((tag) =>
10
+ document.createElementNS("http://www.w3.org/2000/svg", tag),
11
+ );
12
+ }
13
+
14
+ export function setAttributes(el: SVGElement, attrs: StringMap) {
15
+ for (const key in attrs) el.setAttribute(key, attrs[key]);
16
+ }
17
+
18
+ export function appendChildren(parent: Element, children: Element[]) {
19
+ children.forEach((child) => parent.appendChild(child));
20
+ }
21
+
22
+ export function addChildWithClass(
23
+ parent: HTMLElement,
24
+ childTag: string,
25
+ className: string,
26
+ ): HTMLElement {
27
+ const parentDoc = parent.ownerDocument;
28
+ const child = parentDoc.createElement(childTag);
29
+ child.classList.add(className);
30
+ parent.appendChild(child);
31
+ return child;
32
+ }
@@ -0,0 +1,191 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT License.
3
+
4
+ import { useRef, useEffect, useState } from "preact/hooks";
5
+ import { createViewer, GLViewer } from "3dmol";
6
+
7
+ import "./style.css";
8
+
9
+ const themeAttribute = "data-vscode-theme-kind";
10
+
11
+ export function MoleculeViewer(props: {
12
+ moleculeData: string;
13
+ cubeData: { [key: string]: string };
14
+ isoValue?: number;
15
+ }) {
16
+ // Holds reference to the viewer div and 3Dmol viewer object.
17
+ const viewerRef = useRef<HTMLDivElement>(null);
18
+ const viewer = useRef<GLViewer | null>(null);
19
+ const activeCubeData = useRef([] as any[]);
20
+
21
+ const [viewStyle, setViewStyle] = useState("Sphere");
22
+ const [isoval, setIsoval] = useState(props.isoValue || 0.02);
23
+ const [cubeKey, setCubeKey] = useState(Object.keys(props.cubeData)[0] || "");
24
+
25
+ // Runs after the DOM has been created. Create the 3Dmol viewer and adds the model.
26
+ useEffect(() => {
27
+ if (props.moleculeData && viewerRef.current) {
28
+ const molViewer =
29
+ viewer.current ??
30
+ createViewer(viewerRef.current, {
31
+ backgroundColor: getComputedStyle(document.body).getPropertyValue(
32
+ "--vscode-editor-background",
33
+ ),
34
+ });
35
+ try {
36
+ molViewer.clear(); // If the model is being replaced, clear the old one. Perhaps should get and update instead?
37
+ molViewer.addModel(props.moleculeData.trim(), "xyz", {
38
+ assignBonds: true,
39
+ });
40
+ } catch (error) {
41
+ console.error("Error adding model:", error);
42
+ }
43
+ viewer.current = molViewer;
44
+ viewer.current.zoomTo();
45
+ }
46
+
47
+ // Respond to theme changes
48
+ const callback = (mutations: MutationRecord[]) => {
49
+ for (const mutation of mutations) {
50
+ if (mutation.attributeName === themeAttribute) {
51
+ const newBackgroundColor = getComputedStyle(
52
+ document.body,
53
+ ).getPropertyValue("--vscode-editor-background");
54
+ if (viewer.current) {
55
+ viewer.current.setBackgroundColor(newBackgroundColor, 1.0);
56
+ viewer.current.render();
57
+ }
58
+ }
59
+ }
60
+ };
61
+ const observer = new MutationObserver(callback);
62
+ observer.observe(document.body, { attributeFilter: [themeAttribute] });
63
+ }, [props.moleculeData]);
64
+
65
+ useEffect(() => {
66
+ const currViewer = viewer.current;
67
+ if (!currViewer) {
68
+ return;
69
+ }
70
+
71
+ if (cubeKey && props.cubeData[cubeKey]) {
72
+ activeCubeData.current.forEach((voldata) => {
73
+ currViewer.removeShape(voldata);
74
+ });
75
+ activeCubeData.current = [];
76
+ const cubeData = props.cubeData[cubeKey];
77
+ activeCubeData.current.push(
78
+ currViewer.addVolumetricData(cubeData.trim(), "cube", {
79
+ isoval,
80
+ opacity: 1,
81
+ color: "red",
82
+ }),
83
+ );
84
+ activeCubeData.current.push(
85
+ currViewer.addVolumetricData(cubeData.trim(), "cube", {
86
+ isoval: -1 * isoval,
87
+ opacity: 1,
88
+ color: "green",
89
+ }),
90
+ );
91
+ }
92
+
93
+ if (viewStyle === "Sphere") {
94
+ currViewer.setStyle({}, { sphere: { scale: 0.3 }, stick: {} });
95
+ } else if (viewStyle === "Stick") {
96
+ currViewer.setStyle({}, { stick: { radius: 0.2 } });
97
+ } else if (viewStyle === "Line") {
98
+ currViewer.setStyle({}, { line: { linewidth: 5.0 } });
99
+ }
100
+ currViewer.render();
101
+
102
+ // Sometimes keys are added later. If that's the case, change the cubeKey to the first available.
103
+ if (!cubeKey && Object.keys(props.cubeData).length > 0) {
104
+ setCubeKey(Object.keys(props.cubeData)[0]);
105
+ }
106
+ }, [viewStyle, isoval, cubeKey, props.moleculeData, props.cubeData]);
107
+
108
+ // React to changes in the initial isovalue prop, just in case the widget updates state in parts.
109
+ useEffect(() => {
110
+ setIsoval(props.isoValue || 0.02);
111
+ }, [props.isoValue]);
112
+
113
+ return (
114
+ <div id="viewer-container">
115
+ <div
116
+ id="viewer"
117
+ ref={viewerRef}
118
+ style="width: 640px; height: 480px;"
119
+ ></div>
120
+
121
+ <div id="view-dropdown-container" class="view-option">
122
+ <label for="viewSelector">Visualization Style:</label>
123
+ <select
124
+ id="viewSelector"
125
+ onChange={(e) => {
126
+ const style = (e.target as HTMLSelectElement).value;
127
+ setViewStyle(style);
128
+ }}
129
+ >
130
+ <option value="Sphere">Sphere</option>
131
+ <option value="Stick">Stick</option>
132
+ <option value="Line">Line</option>
133
+ </select>
134
+ </div>
135
+ {cubeKey ? (
136
+ <>
137
+ <div id="cube-dropdown-container" class="view-option">
138
+ <label for="cubeSelector">Cube selection:</label>
139
+ <select
140
+ id="cubeSelector"
141
+ onChange={(e) => {
142
+ const key = (e.target as HTMLSelectElement).value;
143
+ setCubeKey(key);
144
+ }}
145
+ >
146
+ {Object.keys(props.cubeData).map((key) => (
147
+ <option value={key} selected={key === cubeKey}>
148
+ {key}
149
+ </option>
150
+ ))}
151
+ </select>
152
+ </div>
153
+
154
+ <div id="isoval-slider-container" class="view-option">
155
+ <label for="isovalSlider">Adjust isovalue:</label>
156
+ <input
157
+ type="range"
158
+ id="isovalSlider"
159
+ min="0.005"
160
+ max="0.1"
161
+ step="0.005"
162
+ value={isoval}
163
+ onInput={(e) => {
164
+ const new_isoval = parseFloat(
165
+ (e.target as HTMLInputElement).value,
166
+ );
167
+ setIsoval(new_isoval);
168
+ }}
169
+ />
170
+ <input
171
+ type="number"
172
+ id="isovalInput"
173
+ min="0.005"
174
+ max="0.1"
175
+ step="0.001"
176
+ value={isoval}
177
+ onInput={(e) => {
178
+ const new_isoval = parseFloat(
179
+ (e.target as HTMLInputElement).value,
180
+ );
181
+ if (!isNaN(new_isoval)) {
182
+ setIsoval(new_isoval);
183
+ }
184
+ }}
185
+ />
186
+ </div>
187
+ </>
188
+ ) : null}
189
+ </div>
190
+ );
191
+ }
@@ -0,0 +1,83 @@
1
+ #viewer {
2
+ width: 100%;
3
+ height: 100%;
4
+ margin: 0;
5
+ overflow: hidden;
6
+ }
7
+
8
+ #viewer-container {
9
+ width: 100%;
10
+ height: 100%;
11
+ margin: 0;
12
+ overflow: hidden;
13
+ /* border: 1px solid gray; */
14
+ }
15
+
16
+ #viewer {
17
+ width: 100%;
18
+ height: 100%;
19
+ }
20
+
21
+ #view-dropdown-container {
22
+ position: absolute;
23
+ top: 10px; /* distance from bottom */
24
+ left: 10px; /* distance from right */
25
+ height: 20px;
26
+ padding: 10px;
27
+ border-radius: 4px;
28
+ z-index: 10;
29
+ font-family: system-ui;
30
+ }
31
+
32
+ #viewSelector {
33
+ padding-left: 4px;
34
+ }
35
+
36
+ .view-option {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 8px;
40
+ }
41
+
42
+ .view-option label {
43
+ margin-right: 0;
44
+ white-space: nowrap;
45
+ min-width: 120px;
46
+ }
47
+
48
+ .view-option select,
49
+ .view-option input[type="range"] {
50
+ color: var(--vscode-editor-foreground);
51
+ background-color: var(--vscode-editor-background);
52
+ }
53
+
54
+ #cube-dropdown-container {
55
+ position: absolute;
56
+ top: 40px; /* distance from bottom */
57
+ left: 10px; /* distance from right */
58
+ padding: 10px;
59
+ height: 20px;
60
+ border-radius: 4px;
61
+ z-index: 10;
62
+ font-family: system-ui;
63
+ }
64
+
65
+ #isoval-slider-container {
66
+ position: absolute;
67
+ top: 70px; /* distance from bottom */
68
+ left: 10px; /* distance from right */
69
+ padding: 10px;
70
+ height: 40px;
71
+ border-radius: 4px;
72
+ z-index: 10;
73
+ font-family: system-ui;
74
+ }
75
+
76
+ #isovalSlider {
77
+ width: 100px;
78
+ outline: none;
79
+ }
80
+
81
+ #isovalInput {
82
+ width: 64px;
83
+ }
@@ -15,6 +15,7 @@ export {
15
15
  type Unitary,
16
16
  type Parameter,
17
17
  type Qubit,
18
+ type SourceLocation,
18
19
  } from "../../src/data-structures/circuit.js";
19
20
 
20
21
  export { CURRENT_VERSION } from "../../src/data-structures/circuit.js";
@@ -170,11 +170,7 @@ class CircuitEvents {
170
170
  this.selectedOperation.controls != null &&
171
171
  this.selectedWire != null
172
172
  ) {
173
- const controlIndex = this.selectedOperation.controls.findIndex(
174
- (control) => control.qubit === this.selectedWire,
175
- );
176
- if (controlIndex !== -1)
177
- this.selectedOperation.controls.splice(controlIndex, 1);
173
+ removeControl(this, this.selectedOperation, this.selectedWire);
178
174
  } else {
179
175
  // Otherwise, remove the selectedOperation
180
176
  removeOperation(this, selectedLocation);
@@ -119,7 +119,27 @@ const _createGate = (
119
119
 
120
120
  const zoomBtn: SVGElement | null = _zoomButton(renderData, nestedDepth);
121
121
  if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
122
- return group(svgElems, attributes);
122
+
123
+ const gateElem = group(svgElems, attributes);
124
+
125
+ // If there's a source location, wrap the gate in an SVG <a> element to make it clickable
126
+ if (renderData.link) {
127
+ const linkElem = createSvgElement("a", {
128
+ href: renderData.link.href,
129
+ class: "qs-circuit-source-link",
130
+ });
131
+
132
+ // Add title as a child <title> element for accessibility and hover tooltip
133
+ const titleElem = createSvgElement("title");
134
+ titleElem.textContent = renderData.link.title;
135
+ linkElem.appendChild(titleElem);
136
+
137
+ // Add the gate as a child of the link
138
+ linkElem.appendChild(gateElem);
139
+ return linkElem;
140
+ }
141
+
142
+ return gateElem;
123
143
  };
124
144
 
125
145
  /**
@@ -137,14 +157,17 @@ const _zoomButton = (
137
157
  ): SVGElement | null => {
138
158
  if (renderData == undefined) return null;
139
159
 
140
- const [x1, y1] = _gatePosition(renderData, nestedDepth);
160
+ const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(
161
+ renderData,
162
+ nestedDepth,
163
+ );
141
164
  let { dataAttributes } = renderData;
142
165
  dataAttributes = dataAttributes || {};
143
166
 
144
- const expanded = "expanded" in dataAttributes;
167
+ const expanded = dataAttributes["expanded"] == "true";
145
168
 
146
- const x = x1 + 2;
147
- const y = y1 + 2;
169
+ const x = gateBoundingBoxX + 2;
170
+ const y = gateBoundingBoxY + 2;
148
171
  const circleBorder: SVGElement = circle(x, y, 10);
149
172
 
150
173
  if (expanded) {
@@ -167,45 +190,51 @@ const _zoomButton = (
167
190
  };
168
191
 
169
192
  /**
170
- * Calculate position of gate.
193
+ * Calculate the bounding box for a given operation, which
194
+ * may itself be a group of operations.
171
195
  *
172
196
  * @param renderData Operation render data.
173
197
  * @param nestedDepth Depth of nested operations.
174
198
  *
175
- * @returns Coordinates of gate: [x1, y1, x2, y2].
199
+ * @returns [x, y, width, height]
176
200
  */
177
- const _gatePosition = (
201
+ const _gateBoundingBox = (
178
202
  renderData: GateRenderData,
179
203
  nestedDepth: number,
180
204
  ): [number, number, number, number] => {
181
- const { x, width, type, targetsY } = renderData;
205
+ const {
206
+ x: xFromRenderData,
207
+ width: widthFromRenderData,
208
+ type,
209
+ targetsY,
210
+ } = renderData;
182
211
 
183
212
  const ys = targetsY?.flatMap((y) => y as number[]) || [];
184
213
  const maxY = Math.max(...ys);
185
214
  const minY = Math.min(...ys);
186
215
 
187
- let x1: number, y1: number, x2: number, y2: number;
216
+ let x: number, y: number, width: number, height: number;
188
217
 
189
218
  switch (type) {
190
219
  case GateType.Group: {
191
220
  const padding = groupBoxPadding - nestedDepth * nestedGroupPadding;
192
221
 
193
- x1 = x - 2 * padding;
194
- y1 = minY - gateHeight / 2 - padding;
195
- x2 = width + 2 * padding;
196
- y2 = maxY + +gateHeight / 2 + padding - (minY - gateHeight / 2 - padding);
222
+ x = xFromRenderData - 2 * padding;
223
+ y = minY - gateHeight / 2 - padding;
224
+ width = widthFromRenderData + 2 * padding;
225
+ height = maxY - minY + gateHeight + 2 * padding;
197
226
 
198
- return [x1, y1, x2, y2];
227
+ return [x, y, width, height];
199
228
  }
200
229
 
201
230
  default:
202
- x1 = x - width / 2;
203
- y1 = minY - gateHeight / 2;
204
- x2 = x + width;
205
- y2 = maxY + gateHeight / 2;
231
+ x = xFromRenderData - widthFromRenderData / 2;
232
+ y = minY - gateHeight / 2;
233
+ width = widthFromRenderData;
234
+ height = maxY - minY + gateHeight;
206
235
  }
207
236
 
208
- return [x1, y1, x2, y2];
237
+ return [x, y, width, height];
209
238
  };
210
239
 
211
240
  /**
@@ -236,6 +265,7 @@ const _measure = (x: number, y: number, wireYs: number[]): SVGElement => {
236
265
  y + 8,
237
266
  x + width - 8,
238
267
  y - height / 2 + 8,
268
+ "qs-line-measure",
239
269
  );
240
270
  meter.style.pointerEvents = "none";
241
271
  mBox.setAttribute("data-wire-ys", JSON.stringify(wireYs));
@@ -376,6 +406,7 @@ const _unitaryBox = (
376
406
  argButton.setAttribute("class", "arg-button");
377
407
  elems.push(argButton);
378
408
  }
409
+
379
410
  return group(elems);
380
411
  };
381
412
 
@@ -388,15 +419,23 @@ const _unitaryBox = (
388
419
  * @returns SVG representation of SWAP gate.
389
420
  */
390
421
  const _swap = (renderData: GateRenderData, nestedDepth: number): SVGElement => {
391
- const { x, targetsY } = renderData;
422
+ const { x: centerX, targetsY } = renderData;
392
423
 
393
424
  // Get SVGs of crosses
394
- const [x1, y1, x2, y2] = _gatePosition(renderData, nestedDepth);
425
+ const [boundingBoxX, boundingBoxY, width, height] = _gateBoundingBox(
426
+ renderData,
427
+ nestedDepth,
428
+ );
395
429
  const ys = targetsY?.flatMap((y) => y as number[]) || [];
396
-
397
- const bg: SVGElement = box(x1, y1, x2, y2, "gate-swap");
398
- const crosses: SVGElement[] = ys.map((y) => _cross(x, y));
399
- const vertLine: SVGElement = line(x, ys[0], x, ys[1]);
430
+ const bg: SVGElement = box(
431
+ boundingBoxX,
432
+ boundingBoxY,
433
+ width,
434
+ height,
435
+ "gate-swap",
436
+ );
437
+ const crosses: SVGElement[] = ys.map((y) => _cross(centerX, y));
438
+ const vertLine: SVGElement = line(centerX, ys[0], centerX, ys[1]);
400
439
  vertLine.style.pointerEvents = "none";
401
440
  return group([bg, ...crosses, vertLine]);
402
441
  };
@@ -549,10 +588,10 @@ const _groupedOperations = (
549
588
  nestedDepth: number,
550
589
  ): SVGElement => {
551
590
  const { children } = renderData;
552
- const [x1, y1, x2, y2] = _gatePosition(renderData, nestedDepth);
591
+ const [x, y, w, h] = _gateBoundingBox(renderData, nestedDepth);
553
592
 
554
593
  // Draw dashed box around children gates
555
- const box: SVGElement = dashedBox(x1, y1, x2, y2, "gate-unitary");
594
+ const box: SVGElement = dashedBox(x, y, w, h, "gate-unitary");
556
595
  const elems: SVGElement[] = [box];
557
596
  if (children != null)
558
597
  elems.push(formatGates(children as GateRenderData[][], nestedDepth + 1));
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
3
 
4
- import { Qubit } from "../circuit.js";
4
+ import { Qubit, SourceLocation } from "../circuit.js";
5
5
  import { RegisterType, RegisterMap, RegisterRenderData } from "../register.js";
6
6
  import {
7
7
  leftPadding,
@@ -9,7 +9,7 @@ import {
9
9
  registerHeight,
10
10
  classicalRegHeight,
11
11
  } from "../constants.js";
12
- import { group, text } from "./formatUtils.js";
12
+ import { createSvgElement, group, text } from "./formatUtils.js";
13
13
  import { mathChars } from "../utils.js";
14
14
 
15
15
  /**
@@ -23,14 +23,20 @@ import { mathChars } from "../utils.js";
23
23
  */
24
24
  const formatInputs = (
25
25
  qubits: Qubit[],
26
+ renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
26
27
  ): { qubitWires: SVGElement; registers: RegisterMap; svgHeight: number } => {
27
28
  const qubitWires: SVGElement[] = [];
28
29
  const registers: RegisterMap = {};
29
30
 
30
31
  let currY: number = startY;
31
- qubits.forEach(({ id, numResults }, wireIndex) => {
32
+ qubits.forEach(({ id, numResults, declarations }, wireIndex) => {
33
+ const link: { link?: { href: string; title: string } } = {};
34
+ if (renderLocations && declarations && declarations.length > 0) {
35
+ link.link = renderLocations(declarations);
36
+ }
37
+
32
38
  // Add qubit wire to list of qubit wires
33
- qubitWires.push(qubitInput(currY, wireIndex, id.toString()));
39
+ qubitWires.push(qubitInput(currY, wireIndex, id.toString(), link.link));
34
40
 
35
41
  // Create qubit register
36
42
  registers[id] = { type: RegisterType.Qubit, y: currY };
@@ -73,6 +79,7 @@ const qubitInput = (
73
79
  y: number,
74
80
  wireIndex: number,
75
81
  subscript?: string,
82
+ link?: { href: string; title: string },
76
83
  ): SVGElement => {
77
84
  const el: SVGElement = text("", leftPadding, y, 16);
78
85
 
@@ -85,7 +92,23 @@ const qubitInput = (
85
92
  el.setAttribute("text-anchor", "start");
86
93
  el.setAttribute("dominant-baseline", "middle");
87
94
  el.setAttribute("data-wire", wireIndex.toString());
88
- el.classList.add("qs-maintext");
95
+ el.classList.add("qs-maintext", "qs-qubit-label");
96
+
97
+ if (link) {
98
+ const linkElem = createSvgElement("a", {
99
+ href: link.href,
100
+ class: "qs-circuit-source-link",
101
+ });
102
+
103
+ // Add title as a child <title> element for accessibility and hover tooltip
104
+ const titleElem = createSvgElement("title");
105
+ titleElem.textContent = link.title;
106
+ linkElem.appendChild(titleElem);
107
+
108
+ // Add the gate as a child of the link
109
+ linkElem.appendChild(el);
110
+ return linkElem;
111
+ }
89
112
  return el;
90
113
  };
91
114
 
@@ -55,4 +55,6 @@ export interface GateRenderData {
55
55
  children?: GateRenderData[][] | GateRenderData[][][];
56
56
  /** Custom data attributes to attach to gate element. */
57
57
  dataAttributes?: DataAttributes;
58
+ /** Link href and title for clickable gate. */
59
+ link?: { href: string; title: string };
58
60
  }
@@ -1,7 +1,7 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT license.
3
3
 
4
- import { Sqore } from "./sqore.js";
4
+ import { DrawOptions, Sqore } from "./sqore.js";
5
5
  import { CircuitGroup } from "./circuit.js";
6
6
 
7
7
  /**
@@ -17,13 +17,10 @@ import { CircuitGroup } from "./circuit.js";
17
17
  export const draw = (
18
18
  circuitGroup: CircuitGroup,
19
19
  container: HTMLElement,
20
- renderDepth = 0,
21
- isEditable = false,
22
- editCallback?: (circuitGroup: CircuitGroup) => void,
23
- runCallback?: () => void,
20
+ options: DrawOptions = {},
24
21
  ): void => {
25
- const sqore = new Sqore(circuitGroup, isEditable, editCallback, runCallback);
26
- sqore.draw(container, renderDepth);
22
+ const sqore = new Sqore(circuitGroup, options);
23
+ sqore.draw(container);
27
24
  };
28
25
 
29
26
  // Export types