qsharp-lang 1.14.5-dev → 1.15.1-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/dist/browser.d.ts +1 -1
  2. package/dist/compiler/compiler.d.ts +1 -1
  3. package/dist/compiler/compiler.js +6 -1
  4. package/dist/debug-service/debug-service.d.ts +1 -1
  5. package/dist/debug-service/debug-service.js +6 -1
  6. package/dist/katas-content.generated.js +1 -1
  7. package/dist/katas-content.generated.md.js +1 -1
  8. package/dist/samples.generated.js +1 -1
  9. package/dist/shared/circuit.d.ts +86 -30
  10. package/dist/shared/circuit.js +4 -0
  11. package/dist/shared/legacyCircuitUpdate.d.ts +9 -0
  12. package/dist/shared/legacyCircuitUpdate.js +312 -0
  13. package/dist/shared/register.d.ts +3 -5
  14. package/dist/utils.d.ts +9 -0
  15. package/dist/utils.js +41 -0
  16. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  17. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  18. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  19. package/docs/Std.Arithmetic/AddLE.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  22. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  23. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  24. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  25. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  26. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  27. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  28. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  29. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  30. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  31. package/docs/Std.Arithmetic/IncByI.md +1 -1
  32. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  33. package/docs/Std.Arithmetic/IncByL.md +1 -1
  34. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  36. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  37. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  38. package/docs/Std.Arithmetic/MAJ.md +1 -1
  39. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  40. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  41. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  42. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  43. package/docs/Std.Arithmetic/index.md +1 -1
  44. package/docs/Std.Arrays/All.md +1 -1
  45. package/docs/Std.Arrays/Any.md +1 -1
  46. package/docs/Std.Arrays/Chunks.md +1 -1
  47. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  48. package/docs/Std.Arrays/ColumnAt.md +1 -1
  49. package/docs/Std.Arrays/Count.md +1 -1
  50. package/docs/Std.Arrays/Diagonal.md +1 -1
  51. package/docs/Std.Arrays/DrawMany.md +1 -1
  52. package/docs/Std.Arrays/Enumerated.md +1 -1
  53. package/docs/Std.Arrays/Excluding.md +1 -1
  54. package/docs/Std.Arrays/Filtered.md +1 -1
  55. package/docs/Std.Arrays/FlatMapped.md +1 -1
  56. package/docs/Std.Arrays/Flattened.md +1 -1
  57. package/docs/Std.Arrays/Fold.md +1 -1
  58. package/docs/Std.Arrays/ForEach.md +1 -1
  59. package/docs/Std.Arrays/Head.md +1 -1
  60. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  61. package/docs/Std.Arrays/IndexOf.md +1 -1
  62. package/docs/Std.Arrays/IndexRange.md +1 -1
  63. package/docs/Std.Arrays/Interleaved.md +1 -1
  64. package/docs/Std.Arrays/IsEmpty.md +1 -1
  65. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  66. package/docs/Std.Arrays/IsSorted.md +1 -1
  67. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  68. package/docs/Std.Arrays/Mapped.md +1 -1
  69. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  70. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  71. package/docs/Std.Arrays/Most.md +1 -1
  72. package/docs/Std.Arrays/MostAndTail.md +1 -1
  73. package/docs/Std.Arrays/Padded.md +1 -1
  74. package/docs/Std.Arrays/Partitioned.md +1 -1
  75. package/docs/Std.Arrays/Rest.md +1 -1
  76. package/docs/Std.Arrays/Reversed.md +1 -1
  77. package/docs/Std.Arrays/SequenceI.md +1 -1
  78. package/docs/Std.Arrays/SequenceL.md +1 -1
  79. package/docs/Std.Arrays/Sorted.md +1 -1
  80. package/docs/Std.Arrays/Subarray.md +1 -1
  81. package/docs/Std.Arrays/Swapped.md +1 -1
  82. package/docs/Std.Arrays/Tail.md +1 -1
  83. package/docs/Std.Arrays/Transposed.md +1 -1
  84. package/docs/Std.Arrays/Unzipped.md +1 -1
  85. package/docs/Std.Arrays/Where.md +1 -1
  86. package/docs/Std.Arrays/Windows.md +1 -1
  87. package/docs/Std.Arrays/Zipped.md +1 -1
  88. package/docs/Std.Arrays/index.md +1 -1
  89. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  90. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  91. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  92. package/docs/Std.Canon/ApplyP.md +1 -1
  93. package/docs/Std.Canon/ApplyPauli.md +1 -1
  94. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  95. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  96. package/docs/Std.Canon/ApplyQFT.md +1 -1
  97. package/docs/Std.Canon/ApplyToEach.md +1 -1
  98. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  99. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  100. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  101. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  102. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  103. package/docs/Std.Canon/CX.md +1 -1
  104. package/docs/Std.Canon/CY.md +1 -1
  105. package/docs/Std.Canon/CZ.md +1 -1
  106. package/docs/Std.Canon/Fst.md +1 -1
  107. package/docs/Std.Canon/Relabel.md +1 -1
  108. package/docs/Std.Canon/Snd.md +1 -1
  109. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  110. package/docs/Std.Canon/index.md +1 -1
  111. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  112. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  113. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  114. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  115. package/docs/Std.Convert/BoolAsResult.md +1 -1
  116. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  117. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  118. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  119. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  120. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  121. package/docs/Std.Convert/IntAsDouble.md +1 -1
  122. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  123. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  124. package/docs/Std.Convert/ResultAsBool.md +1 -1
  125. package/docs/Std.Convert/index.md +1 -1
  126. package/docs/Std.Core/Length.md +1 -1
  127. package/docs/Std.Core/Repeated.md +1 -1
  128. package/docs/Std.Core/index.md +1 -1
  129. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  130. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  131. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  132. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  133. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  134. package/docs/Std.Diagnostics/ConfigurePauliNoise.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/StartCountingFunction.md +1 -1
  143. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  144. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  145. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  147. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  148. package/docs/Std.Diagnostics/index.md +1 -1
  149. package/docs/Std.Intrinsic/AND.md +1 -1
  150. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  151. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  152. package/docs/Std.Intrinsic/CNOT.md +1 -1
  153. package/docs/Std.Intrinsic/Exp.md +1 -1
  154. package/docs/Std.Intrinsic/H.md +1 -1
  155. package/docs/Std.Intrinsic/I.md +1 -1
  156. package/docs/Std.Intrinsic/M.md +1 -1
  157. package/docs/Std.Intrinsic/Measure.md +1 -1
  158. package/docs/Std.Intrinsic/Message.md +1 -1
  159. package/docs/Std.Intrinsic/R.md +1 -1
  160. package/docs/Std.Intrinsic/R1.md +1 -1
  161. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  162. package/docs/Std.Intrinsic/RFrac.md +1 -1
  163. package/docs/Std.Intrinsic/Reset.md +1 -1
  164. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  165. package/docs/Std.Intrinsic/Rx.md +1 -1
  166. package/docs/Std.Intrinsic/Rxx.md +1 -1
  167. package/docs/Std.Intrinsic/Ry.md +1 -1
  168. package/docs/Std.Intrinsic/Ryy.md +1 -1
  169. package/docs/Std.Intrinsic/Rz.md +1 -1
  170. package/docs/Std.Intrinsic/Rzz.md +1 -1
  171. package/docs/Std.Intrinsic/S.md +1 -1
  172. package/docs/Std.Intrinsic/SWAP.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/SignD.md +1 -1
  259. package/docs/Std.Math/SignI.md +1 -1
  260. package/docs/Std.Math/SignL.md +1 -1
  261. package/docs/Std.Math/Sin.md +1 -1
  262. package/docs/Std.Math/Sinh.md +1 -1
  263. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  264. package/docs/Std.Math/Sqrt.md +1 -1
  265. package/docs/Std.Math/SquaredNorm.md +1 -1
  266. package/docs/Std.Math/Tan.md +1 -1
  267. package/docs/Std.Math/Tanh.md +1 -1
  268. package/docs/Std.Math/TimesC.md +1 -1
  269. package/docs/Std.Math/TimesCP.md +1 -1
  270. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  271. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  272. package/docs/Std.Math/Truncate.md +1 -1
  273. package/docs/Std.Math/index.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/MeasureAllZ.md +1 -1
  279. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  280. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  281. package/docs/Std.Measurement/index.md +1 -1
  282. package/docs/Std.Random/DrawRandomBool.md +1 -1
  283. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  284. package/docs/Std.Random/DrawRandomInt.md +1 -1
  285. package/docs/Std.Random/index.md +1 -1
  286. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  287. package/docs/Std.Range/RangeEnd.md +1 -1
  288. package/docs/Std.Range/RangeReverse.md +1 -1
  289. package/docs/Std.Range/RangeStart.md +1 -1
  290. package/docs/Std.Range/RangeStep.md +1 -1
  291. package/docs/Std.Range/index.md +1 -1
  292. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  293. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  294. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  295. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  296. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  297. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  298. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  299. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  300. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  301. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  302. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  303. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  304. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  305. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  306. package/docs/Std.ResourceEstimation/index.md +1 -1
  307. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  308. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  309. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  310. package/docs/Std.StatePreparation/index.md +1 -1
  311. package/docs/Std.TableLookup/Select.md +1 -1
  312. package/docs/Std.TableLookup/index.md +1 -1
  313. package/docs/index.md +1 -1
  314. package/lib/node/qsc_wasm.cjs +2 -2
  315. package/lib/node/qsc_wasm_bg.wasm +0 -0
  316. package/lib/web/qsc_wasm.js +2 -2
  317. package/lib/web/qsc_wasm_bg.wasm +0 -0
  318. package/package.json +1 -1
  319. package/ux/circuit-vis/circuit.ts +11 -0
  320. package/ux/circuit-vis/circuitManipulation.ts +549 -0
  321. package/ux/circuit-vis/constants.ts +7 -0
  322. package/ux/circuit-vis/contextMenu.ts +376 -0
  323. package/ux/circuit-vis/draggable.ts +352 -0
  324. package/ux/circuit-vis/events.ts +818 -0
  325. package/ux/circuit-vis/formatters/gateFormatter.ts +56 -23
  326. package/ux/circuit-vis/formatters/inputFormatter.ts +38 -7
  327. package/ux/circuit-vis/formatters/registerFormatter.ts +12 -30
  328. package/ux/circuit-vis/index.ts +16 -11
  329. package/ux/circuit-vis/metadata.ts +3 -1
  330. package/ux/circuit-vis/panel.ts +333 -0
  331. package/ux/circuit-vis/process.ts +136 -232
  332. package/ux/circuit-vis/sqore.ts +231 -116
  333. package/ux/circuit-vis/utils.ts +269 -1
  334. package/ux/circuit.tsx +71 -37
  335. package/ux/data.ts +4 -2
  336. package/ux/index.ts +1 -1
  337. package/ux/qsharp-circuit.css +260 -4
  338. package/ux/circuit-vis/styles.ts +0 -236
@@ -5,11 +5,20 @@ import { formatInputs } from "./formatters/inputFormatter";
5
5
  import { formatGates } from "./formatters/gateFormatter";
6
6
  import { formatRegisters } from "./formatters/registerFormatter";
7
7
  import { processOperations } from "./process";
8
- import { ConditionalRender, Circuit, Operation } from "./circuit";
8
+ import {
9
+ ConditionalRender,
10
+ Circuit,
11
+ CircuitGroup,
12
+ ComponentGrid,
13
+ Operation,
14
+ Column,
15
+ } from "./circuit";
9
16
  import { Metadata, GateType } from "./metadata";
10
- import { StyleConfig, style, STYLES } from "./styles";
11
17
  import { createUUID } from "./utils";
12
- import { svgNS } from "./constants";
18
+ import { gateHeight, minGateWidth, minToolboxHeight, svgNS } from "./constants";
19
+ import { createDragzones } from "./draggable";
20
+ import { enableEvents } from "./events";
21
+ import { createPanel } from "./panel";
13
22
 
14
23
  /**
15
24
  * Contains metadata for visualization.
@@ -24,11 +33,11 @@ interface ComposedSqore {
24
33
  }
25
34
 
26
35
  /**
27
- * Defines the mapping of unique ID to each operation. Used for enabling
36
+ * Defines the mapping of unique location to each operation. Used for enabling
28
37
  * interactivity.
29
38
  */
30
39
  type GateRegistry = {
31
- [id: string]: Operation;
40
+ [location: string]: Operation;
32
41
  };
33
42
 
34
43
  /**
@@ -36,18 +45,32 @@ type GateRegistry = {
36
45
  */
37
46
  export class Sqore {
38
47
  circuit: Circuit;
39
- style: StyleConfig = {};
40
48
  gateRegistry: GateRegistry = {};
49
+ renderDepth = 0;
41
50
 
42
51
  /**
43
- * Initializes Sqore object with custom styles.
52
+ * Initializes Sqore object.
44
53
  *
45
- * @param circuit Circuit to be visualized.
46
- * @param style Custom visualization style.
54
+ * @param circuitGroup Group of circuits to be visualized.
55
+ * @param isEditable Whether the circuit is editable.
56
+ * @param editCallback Callback function to be called when the circuit is edited.
47
57
  */
48
- constructor(circuit: Circuit, style: StyleConfig | string = {}) {
49
- this.circuit = circuit;
50
- this.style = this.getStyle(style);
58
+ constructor(
59
+ public circuitGroup: CircuitGroup,
60
+ readonly isEditable = false,
61
+ private editCallback?: (circuitGroup: CircuitGroup) => void,
62
+ ) {
63
+ if (
64
+ this.circuitGroup == null ||
65
+ this.circuitGroup.circuits == null ||
66
+ this.circuitGroup.circuits.length === 0
67
+ ) {
68
+ throw new Error(
69
+ `No circuit found in file. Please provide a valid circuit.`,
70
+ );
71
+ }
72
+ // For now we only visualize the first circuit in the group
73
+ this.circuit = this.circuitGroup.circuits[0];
51
74
  }
52
75
 
53
76
  /**
@@ -60,64 +83,87 @@ export class Sqore {
60
83
  // Inject into container
61
84
  if (container == null) throw new Error(`Container not provided.`);
62
85
 
86
+ this.renderDepth = renderDepth;
87
+ this.renderCircuit(container);
88
+ }
89
+
90
+ /**
91
+ * Render circuit into `container`.
92
+ *
93
+ * @param container HTML element for rendering visualization into.
94
+ * @param circuit Circuit object to be rendered.
95
+ */
96
+ private renderCircuit(container: HTMLElement, circuit?: Circuit): void {
63
97
  // Create copy of circuit to prevent mutation
64
- const circuit: Circuit = JSON.parse(JSON.stringify(this.circuit));
98
+ const _circuit: Circuit =
99
+ circuit ?? JSON.parse(JSON.stringify(this.circuit));
100
+ const renderDepth = this.renderDepth;
65
101
 
66
- // Assign unique IDs to each operation
67
- circuit.operations.forEach((op, i) =>
68
- this.fillGateRegistry(op, i.toString()),
102
+ // Assign unique locations to each operation
103
+ _circuit.componentGrid.forEach((col, colIndex) =>
104
+ col.components.forEach((op, i) =>
105
+ this.fillGateRegistry(op, `${colIndex},${i}`),
106
+ ),
69
107
  );
70
108
 
71
- // Render operations at starting at given depth
72
- circuit.operations = this.selectOpsAtDepth(circuit.operations, renderDepth);
109
+ // Render operations starting at given depth
110
+ _circuit.componentGrid = this.selectOpsAtDepth(
111
+ _circuit.componentGrid,
112
+ renderDepth,
113
+ );
73
114
 
74
115
  // If only one top-level operation, expand automatically:
75
116
  if (
76
- circuit.operations.length == 1 &&
77
- circuit.operations[0].dataAttributes != null &&
78
- // eslint-disable-next-line no-prototype-builtins
79
- circuit.operations[0].dataAttributes.hasOwnProperty("id")
117
+ _circuit.componentGrid.length == 1 &&
118
+ _circuit.componentGrid[0].components.length == 1 &&
119
+ _circuit.componentGrid[0].components[0].dataAttributes != null &&
120
+ Object.prototype.hasOwnProperty.call(
121
+ _circuit.componentGrid[0].components[0].dataAttributes,
122
+ "location",
123
+ )
80
124
  ) {
81
- const id: string = circuit.operations[0].dataAttributes["id"];
82
- this.expandOperation(circuit.operations, id);
125
+ const location: string =
126
+ _circuit.componentGrid[0].components[0].dataAttributes["location"];
127
+ this.expandOperation(_circuit.componentGrid, location);
83
128
  }
84
129
 
85
- this.renderCircuit(container, circuit);
86
- }
130
+ // Create visualization components
131
+ const composedSqore: ComposedSqore = this.compose(_circuit);
132
+ const svg: SVGElement = this.generateSvg(composedSqore);
133
+ this.setViewBox(svg);
134
+ const previousSvg = container.querySelector("svg[id]");
135
+ if (previousSvg == null) {
136
+ container.appendChild(svg);
137
+ } else {
138
+ const wrapper = previousSvg.parentElement;
139
+ if (wrapper) {
140
+ wrapper.replaceChild(svg, previousSvg);
141
+ } else {
142
+ container.replaceChild(svg, previousSvg);
143
+ }
144
+ }
145
+ this.addGateClickHandlers(container, _circuit);
87
146
 
88
- /**
89
- * Retrieve style for visualization.
90
- *
91
- * @param style Custom style or style name.
92
- *
93
- * @returns Custom style.
94
- */
95
- private getStyle(style: StyleConfig | string = {}): StyleConfig {
96
- if (typeof style === "string" || style instanceof String) {
97
- const styleName: string = style as string;
98
- // eslint-disable-next-line no-prototype-builtins
99
- if (!STYLES.hasOwnProperty(styleName)) {
100
- console.error(`No style ${styleName} found in STYLES.`);
101
- return {};
147
+ if (this.isEditable) {
148
+ createDragzones(container, this);
149
+ createPanel(container);
150
+ enableEvents(container, this, () => this.renderCircuit(container));
151
+ if (this.editCallback != undefined) {
152
+ this.editCallback(this.minimizeCircuits(this.circuitGroup));
102
153
  }
103
- style = STYLES[styleName];
104
154
  }
105
- return style;
106
155
  }
107
156
 
108
157
  /**
109
- * Render circuit into `container`.
158
+ * Sets the viewBox attribute of the SVG element to enable zooming and panning.
110
159
  *
111
- * @param container HTML element for rendering visualization into.
112
- * @param circuit Circuit object to be rendered.
160
+ * @param svg The SVG element to set the viewBox for.
113
161
  */
114
- private renderCircuit(container: HTMLElement, circuit: Circuit): void {
115
- // Create visualization components
116
- const composedSqore: ComposedSqore = this.compose(circuit);
117
- const svg: SVGElement = this.generateSvg(composedSqore);
118
- container.innerHTML = "";
119
- container.appendChild(svg);
120
- this.addGateClickHandlers(container, circuit);
162
+ private setViewBox(svg: SVGElement) {
163
+ // width and height are the true dimensions generated by qviz
164
+ const width = parseInt(svg.getAttribute("width")!);
165
+ const height = parseInt(svg.getAttribute("height")!);
166
+ svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
121
167
  }
122
168
 
123
169
  /**
@@ -133,21 +179,24 @@ export class Sqore {
133
179
  gate.forEach((g) => add(acc, g));
134
180
  } else {
135
181
  acc.push(gate);
136
- gate.children?.forEach((g) => add(acc, g));
182
+ gate.children?.forEach((col) => col.forEach((g) => add(acc, g)));
137
183
  }
138
184
  };
139
185
 
140
- const flatten = (gates: Metadata[]): Metadata[] => {
186
+ const flatten = (metadata: Metadata[][]): Metadata[] => {
141
187
  const result: Metadata[] = [];
142
- add(result, gates);
188
+ metadata.forEach((col) => col.forEach((g) => add(result, g)));
143
189
  return result;
144
190
  };
145
191
 
146
- const { qubits, operations } = circuit;
192
+ const { qubits, componentGrid } = circuit;
147
193
  const { qubitWires, registers, svgHeight } = formatInputs(qubits);
148
- const { metadataList, svgWidth } = processOperations(operations, registers);
149
- const formattedGates: SVGElement = formatGates(metadataList);
150
- const measureGates: Metadata[] = flatten(metadataList).filter(
194
+ const { metadataArray, svgWidth } = processOperations(
195
+ componentGrid,
196
+ registers,
197
+ );
198
+ const formattedGates: SVGElement = formatGates(metadataArray);
199
+ const measureGates: Metadata[] = flatten(metadataArray).filter(
151
200
  ({ type }) => type === GateType.Measure,
152
201
  );
153
202
  const formattedRegs: SVGElement = formatRegisters(
@@ -183,9 +232,18 @@ export class Sqore {
183
232
  svg.style.setProperty("max-width", "fit-content");
184
233
 
185
234
  // Add styles
186
- const css = document.createElement("style");
187
- css.innerHTML = style(this.style);
188
- svg.appendChild(css);
235
+ document.documentElement.style.setProperty(
236
+ "--minToolboxHeight",
237
+ `${minToolboxHeight}px`,
238
+ );
239
+ document.documentElement.style.setProperty(
240
+ "--minGateWidth",
241
+ `${minGateWidth}px`,
242
+ );
243
+ document.documentElement.style.setProperty(
244
+ "--gateHeight",
245
+ `${gateHeight}px`,
246
+ );
189
247
 
190
248
  // Add body elements
191
249
  elements.forEach((element: SVGElement) => svg.appendChild(element));
@@ -194,26 +252,29 @@ export class Sqore {
194
252
  }
195
253
 
196
254
  /**
197
- * Depth-first traversal to assign unique ID to `operation`.
198
- * The operation is assigned the id `id` and its `i`th child is recursively given
199
- * the id `${id}-${i}`.
255
+ * Depth-first traversal to assign unique location string to `operation`.
256
+ * The operation is assigned the location `location` and its `i`th child
257
+ * in its `colIndex` column is recursively given the location
258
+ * `${location}-${colIndex},${i}`.
200
259
  *
201
260
  * @param operation Operation to be assigned.
202
- * @param id: ID to assign to `operation`.
261
+ * @param location: Location to assign to `operation`.
203
262
  *
204
263
  */
205
- private fillGateRegistry(operation: Operation, id: string): void {
264
+ private fillGateRegistry(operation: Operation, location: string): void {
206
265
  if (operation.dataAttributes == null) operation.dataAttributes = {};
207
- operation.dataAttributes["id"] = id;
266
+ operation.dataAttributes["location"] = location;
208
267
  // By default, operations cannot be zoomed-out
209
268
  operation.dataAttributes["zoom-out"] = "false";
210
- this.gateRegistry[id] = operation;
211
- operation.children?.forEach((childOp, i) => {
212
- this.fillGateRegistry(childOp, `${id}-${i}`);
213
- if (childOp.dataAttributes == null) childOp.dataAttributes = {};
214
- // Children operations can be zoomed out
215
- childOp.dataAttributes["zoom-out"] = "true";
216
- });
269
+ this.gateRegistry[location] = operation;
270
+ operation.children?.forEach((col, colIndex) =>
271
+ col.components.forEach((childOp, i) => {
272
+ this.fillGateRegistry(childOp, `${location}-${colIndex},${i}`);
273
+ if (childOp.dataAttributes == null) childOp.dataAttributes = {};
274
+ // Children operations can be zoomed out
275
+ childOp.dataAttributes["zoom-out"] = "true";
276
+ }),
277
+ );
217
278
  // Composite operations can be zoomed in
218
279
  operation.dataAttributes["zoom-in"] = (
219
280
  operation.children != null
@@ -223,27 +284,48 @@ export class Sqore {
223
284
  /**
224
285
  * Pick out operations that are at or below `renderDepth`.
225
286
  *
226
- * @param operations List of circuit operations.
287
+ * @param componentGrid Circuit components.
227
288
  * @param renderDepth Initial layer depth at which to render gates.
228
289
  *
229
- * @returns List of operations at or below specifed depth.
290
+ * @returns Grid of components at or below specified depth.
230
291
  */
231
292
  private selectOpsAtDepth(
232
- operations: Operation[],
293
+ componentGrid: ComponentGrid,
233
294
  renderDepth: number,
234
- ): Operation[] {
295
+ ): ComponentGrid {
235
296
  if (renderDepth < 0)
236
297
  throw new Error(
237
298
  `Invalid renderDepth of ${renderDepth}. Needs to be >= 0.`,
238
299
  );
239
- if (renderDepth === 0) return operations;
240
- return operations
241
- .map((op) =>
242
- op.children != null
243
- ? this.selectOpsAtDepth(op.children, renderDepth - 1)
244
- : op,
245
- )
246
- .flat();
300
+ if (renderDepth === 0) return componentGrid;
301
+ const selectedOps: ComponentGrid = [];
302
+ componentGrid.forEach((col) => {
303
+ const selectedCol: Operation[] = [];
304
+ const extraCols: Column[] = [];
305
+ col.components.forEach((op) => {
306
+ if (op.children != null) {
307
+ const selectedChildren = this.selectOpsAtDepth(
308
+ op.children,
309
+ renderDepth - 1,
310
+ );
311
+ if (selectedChildren.length > 0) {
312
+ selectedCol.push(...selectedChildren[0].components);
313
+ selectedChildren.slice(1).forEach((col, colIndex) => {
314
+ if (extraCols[colIndex] == null) extraCols[colIndex] = col;
315
+ // NOTE: I'm unsure if this is a safe way to combine column arrays
316
+ else extraCols[colIndex].components.push(...col.components);
317
+ });
318
+ }
319
+ } else {
320
+ selectedCol.push(op);
321
+ }
322
+ selectedOps.push({ components: selectedCol });
323
+ if (extraCols.length > 0) {
324
+ selectedOps.push(...extraCols);
325
+ }
326
+ });
327
+ });
328
+ return selectedOps;
247
329
  }
248
330
 
249
331
  /**
@@ -318,12 +400,12 @@ export class Sqore {
318
400
  // Zoom in on clicked gate
319
401
  ctrl.addEventListener("click", (ev: Event) => {
320
402
  const gateId: string | null | undefined =
321
- ctrl.parentElement?.getAttribute("data-id");
403
+ ctrl.parentElement?.getAttribute("data-location");
322
404
  if (typeof gateId == "string") {
323
405
  if (ctrl.classList.contains("gate-collapse")) {
324
- this.collapseOperation(circuit.operations, gateId);
406
+ this.collapseOperation(circuit.componentGrid, gateId);
325
407
  } else if (ctrl.classList.contains("gate-expand")) {
326
- this.expandOperation(circuit.operations, gateId);
408
+ this.expandOperation(circuit.componentGrid, gateId);
327
409
  }
328
410
  this.renderCircuit(container, circuit);
329
411
 
@@ -336,41 +418,74 @@ export class Sqore {
336
418
  /**
337
419
  * Expand selected operation for zoom-in interaction.
338
420
  *
339
- * @param operations List of circuit operations.
340
- * @param id ID of operation to expand.
421
+ * @param componentGrid Grid of circuit components.
422
+ * @param location Location of operation to expand.
341
423
  *
342
424
  */
343
- private expandOperation(operations: Operation[], id: string): void {
344
- operations.forEach((op) => {
345
- if (op.conditionalRender === ConditionalRender.AsGroup)
346
- this.expandOperation(op.children || [], id);
347
- if (op.dataAttributes == null) return op;
348
- const opId: string = op.dataAttributes["id"];
349
- if (opId === id && op.children != null) {
350
- op.conditionalRender = ConditionalRender.AsGroup;
351
- op.dataAttributes["expanded"] = "true";
352
- }
353
- });
425
+ private expandOperation(
426
+ componentGrid: ComponentGrid,
427
+ location: string,
428
+ ): void {
429
+ componentGrid.forEach((col) =>
430
+ col.components.forEach((op) => {
431
+ if (op.conditionalRender === ConditionalRender.AsGroup)
432
+ this.expandOperation(op.children || [], location);
433
+ if (op.dataAttributes == null) return op;
434
+ const opId: string = op.dataAttributes["location"];
435
+ if (opId === location && op.children != null) {
436
+ op.conditionalRender = ConditionalRender.AsGroup;
437
+ op.dataAttributes["expanded"] = "true";
438
+ }
439
+ }),
440
+ );
354
441
  }
355
442
 
356
443
  /**
357
444
  * Collapse selected operation for zoom-out interaction.
358
445
  *
359
- * @param operations List of circuit operations.
360
- * @param id ID of operation to collapse.
446
+ * @param componentGrid Grid of circuit components.
447
+ * @param parentLoc Location of operation to collapse.
361
448
  *
362
449
  */
363
- private collapseOperation(operations: Operation[], parentId: string): void {
364
- operations.forEach((op) => {
365
- if (op.conditionalRender === ConditionalRender.AsGroup)
366
- this.collapseOperation(op.children || [], parentId);
367
- if (op.dataAttributes == null) return op;
368
- const opId: string = op.dataAttributes["id"];
369
- // Collapse parent gate and its children
370
- if (opId.startsWith(parentId)) {
371
- op.conditionalRender = ConditionalRender.Always;
372
- delete op.dataAttributes["expanded"];
373
- }
450
+ private collapseOperation(
451
+ componentGrid: ComponentGrid,
452
+ parentLoc: string,
453
+ ): void {
454
+ componentGrid.forEach((col) =>
455
+ col.components.forEach((op) => {
456
+ if (op.conditionalRender === ConditionalRender.AsGroup)
457
+ this.collapseOperation(op.children || [], parentLoc);
458
+ if (op.dataAttributes == null) return op;
459
+ const opId: string = op.dataAttributes["location"];
460
+ // Collapse parent gate and its children
461
+ if (opId.startsWith(parentLoc)) {
462
+ op.conditionalRender = ConditionalRender.Always;
463
+ delete op.dataAttributes["expanded"];
464
+ }
465
+ }),
466
+ );
467
+ }
468
+
469
+ // Minimize the circuits in a circuit group to remove dataAttributes
470
+ minimizeCircuits(circuitGroup: CircuitGroup): CircuitGroup {
471
+ const minimizedCircuits: CircuitGroup = JSON.parse(
472
+ JSON.stringify(circuitGroup),
473
+ );
474
+ minimizedCircuits.circuits.forEach((circuit) => {
475
+ circuit.componentGrid.forEach((col) => {
476
+ col.components.forEach(this.minimizeOperation);
477
+ });
374
478
  });
479
+ return minimizedCircuits;
375
480
  }
481
+
482
+ // Minimize the operation to remove dataAttributes
483
+ minimizeOperation = (operation: Operation): void => {
484
+ if (operation.children !== undefined) {
485
+ operation.children.forEach((col) =>
486
+ col.components.forEach(this.minimizeOperation),
487
+ );
488
+ }
489
+ operation.dataAttributes = undefined;
490
+ };
376
491
  }