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
@@ -8,6 +8,8 @@ import {
8
8
  labelFontSize,
9
9
  argsFontSize,
10
10
  } from "./constants";
11
+ import { ComponentGrid, Operation } from "./circuit";
12
+ import { Register } from "./register";
11
13
 
12
14
  /**
13
15
  * Generate a UUID using `Math.random`.
@@ -74,4 +76,270 @@ const _getStringWidth = (
74
76
  return metrics.width;
75
77
  };
76
78
 
77
- export { createUUID, getGateWidth, _getStringWidth };
79
+ /**
80
+ * Find targets of an operation's children by recursively walking
81
+ * through all of its children's controls and targets.
82
+ * Note that this intensionally ignores the direct targets of the
83
+ * operation itself.
84
+ *
85
+ * Example:
86
+ * Gate Foo contains gate H and gate RX.
87
+ * qIds of Gate H is 1
88
+ * qIds of Gate RX are 1, 2
89
+ * This should return [{qId: 1}, {qId: 2}]
90
+ *
91
+ * @param operation The operation to find targets for.
92
+ * @returns An array of registers with unique qIds.
93
+ */
94
+ const getChildTargets = (operation: Operation): Register[] | [] => {
95
+ const _recurse = (operation: Operation) => {
96
+ switch (operation.kind) {
97
+ case "measurement":
98
+ registers.push(...operation.qubits);
99
+ registers.push(...operation.results);
100
+ break;
101
+ case "unitary":
102
+ registers.push(...operation.targets);
103
+ if (operation.controls) {
104
+ registers.push(...operation.controls);
105
+ }
106
+ break;
107
+ case "ket":
108
+ registers.push(...operation.targets);
109
+ break;
110
+ }
111
+
112
+ // If there is more children, keep adding more to registers
113
+ if (operation.children) {
114
+ operation.children.forEach((col) =>
115
+ col.components.forEach((child) => {
116
+ _recurse(child);
117
+ }),
118
+ );
119
+ }
120
+ };
121
+
122
+ const registers: Register[] = [];
123
+ if (operation.children == null) return [];
124
+
125
+ // Recursively walkthrough all children to populate registers
126
+ operation.children.forEach((col) =>
127
+ col.components.forEach((child) => {
128
+ _recurse(child);
129
+ }),
130
+ );
131
+
132
+ // Extract qIds from array of object
133
+ // i.e. [{qId: 0}, {qId: 1}, {qId: 1}] -> [0, 1, 1]
134
+ const qIds = registers.map((register) => register.qubit);
135
+ const uniqueQIds = Array.from(new Set(qIds));
136
+
137
+ // Transform array of numbers into array of qId object
138
+ // i.e. [0, 1] -> [{qId: 0}, {qId: 1}]
139
+ return uniqueQIds.map((qId) => ({ qubit: qId }));
140
+ };
141
+
142
+ /**
143
+ * Split a location string into an array of index tuples.
144
+ *
145
+ * Example:
146
+ * "0,1-0,2-2,3" -> [[0,1], [0,2], [2,3]]
147
+ *
148
+ * @param location The location string to split.
149
+ * @returns An array of indexes.
150
+ */
151
+ const locationStringToIndexes = (location: string): [number, number][] => {
152
+ return location !== ""
153
+ ? location.split("-").map((segment) => {
154
+ const coords = segment.split(",");
155
+ if (coords.length !== 2) throw new Error("Invalid location");
156
+ return [parseInt(coords[0]), parseInt(coords[1])];
157
+ })
158
+ : [];
159
+ };
160
+
161
+ /**
162
+ * Gets the location of an operation, if it has one.
163
+ *
164
+ * @param operation The operation to get the location for.
165
+ * @returns The location string of the operation, or null if it doesn't have one.
166
+ */
167
+ const getGateLocationString = (operation: Operation): string | null => {
168
+ if (operation.dataAttributes == null) return null;
169
+ return operation.dataAttributes["location"];
170
+ };
171
+
172
+ /**********************
173
+ * Finder Functions *
174
+ **********************/
175
+
176
+ /**
177
+ * Find the surrounding gate element of a host element.
178
+ *
179
+ * @param hostElem The SVG element representing the host element.
180
+ * @returns The surrounding gate element or null if not found.
181
+ */
182
+ const findGateElem = (hostElem: SVGElement): SVGElement | null => {
183
+ return hostElem.closest<SVGElement>("[data-location]");
184
+ };
185
+
186
+ /**
187
+ * Find the location of the gate surrounding a host element.
188
+ *
189
+ * @param hostElem The SVG element representing the host element.
190
+ * @returns The location string of the surrounding gate or null if not found.
191
+ */
192
+ const findLocation = (hostElem: SVGElement) => {
193
+ const gateElem = findGateElem(hostElem);
194
+ return gateElem != null ? gateElem.getAttribute("data-location") : null;
195
+ };
196
+
197
+ /**
198
+ * Find the parent operation of the operation specified by location.
199
+ *
200
+ * @param componentGrid The grid of components to search through.
201
+ * @param location The location string of the operation.
202
+ * @returns The parent operation or null if not found.
203
+ */
204
+ const findParentOperation = (
205
+ componentGrid: ComponentGrid,
206
+ location: string | null,
207
+ ): Operation | null => {
208
+ if (!location) return null;
209
+
210
+ const indexes = locationStringToIndexes(location);
211
+ indexes.pop();
212
+ const lastIndex = indexes.pop();
213
+
214
+ if (lastIndex == null) return null;
215
+
216
+ let parentOperation = componentGrid;
217
+ for (const index of indexes) {
218
+ parentOperation =
219
+ parentOperation[index[0]].components[index[1]].children ||
220
+ parentOperation;
221
+ }
222
+ return parentOperation[lastIndex[0]].components[lastIndex[1]];
223
+ };
224
+
225
+ /**
226
+ * Find the parent component grid of an operation based on its location.
227
+ *
228
+ * @param componentGrid The grid of components to search through.
229
+ * @param location The location string of the operation.
230
+ * @returns The parent grid of components or null if not found.
231
+ */
232
+ const findParentArray = (
233
+ componentGrid: ComponentGrid,
234
+ location: string | null,
235
+ ): ComponentGrid | null => {
236
+ if (!location) return null;
237
+
238
+ const indexes = locationStringToIndexes(location);
239
+ indexes.pop(); // The last index refers to the operation itself, remove it so that the last index instead refers to the parent operation
240
+
241
+ let parentArray = componentGrid;
242
+ for (const index of indexes) {
243
+ parentArray =
244
+ parentArray[index[0]].components[index[1]].children || parentArray;
245
+ }
246
+ return parentArray;
247
+ };
248
+
249
+ /**
250
+ * Find an operation based on its location.
251
+ *
252
+ * @param componentGrid The grid of components to search through.
253
+ * @param location The location string of the operation.
254
+ * @returns The operation or null if not found.
255
+ */
256
+ const findOperation = (
257
+ componentGrid: ComponentGrid,
258
+ location: string | null,
259
+ ): Operation | null => {
260
+ if (!location) return null;
261
+
262
+ const index = locationStringToIndexes(location).pop();
263
+ const operationParent = findParentArray(componentGrid, location);
264
+
265
+ if (operationParent == null || index == null) return null;
266
+
267
+ return operationParent[index[0]].components[index[1]];
268
+ };
269
+
270
+ /**********************
271
+ * Getter Functions *
272
+ **********************/
273
+
274
+ /**
275
+ * Get list of y values based on circuit wires.
276
+ *
277
+ * @param container The HTML container element containing the circuit visualization.
278
+ * @returns An array of y values corresponding to the circuit wires.
279
+ */
280
+ const getWireData = (container: HTMLElement): number[] => {
281
+ const wireElems = container.querySelectorAll<SVGGElement>(".qubit-wire");
282
+ const wireData = Array.from(wireElems).map((wireElem) => {
283
+ return Number(wireElem.getAttribute("y1"));
284
+ });
285
+ return wireData;
286
+ };
287
+
288
+ /**
289
+ * Get list of toolbox items.
290
+ *
291
+ * @param container The HTML container element containing the toolbox items.
292
+ * @returns An array of SVG graphics elements representing the toolbox items.
293
+ */
294
+ const getToolboxElems = (container: HTMLElement): SVGGraphicsElement[] => {
295
+ return Array.from(
296
+ container.querySelectorAll<SVGGraphicsElement>("[toolbox-item]"),
297
+ );
298
+ };
299
+
300
+ /**
301
+ * Get list of host elements that dropzones can be attached to.
302
+ *
303
+ * @param container The HTML container element containing the circuit visualization.
304
+ * @returns An array of SVG graphics elements representing the host elements.
305
+ */
306
+ const getHostElems = (container: HTMLElement): SVGGraphicsElement[] => {
307
+ const circuitSvg = container.querySelector("svg[id]");
308
+ return circuitSvg != null
309
+ ? Array.from(
310
+ circuitSvg.querySelectorAll<SVGGraphicsElement>(
311
+ '[class^="gate-"]:not(.gate-control, .gate-swap), .control-dot, .oplus, .cross',
312
+ ),
313
+ )
314
+ : [];
315
+ };
316
+
317
+ /**
318
+ * Get list of gate elements from the circuit, but not the toolbox.
319
+ *
320
+ * @param container The HTML container element containing the circuit visualization.
321
+ * @returns An array of SVG graphics elements representing the gate elements.
322
+ */
323
+ const getGateElems = (container: HTMLElement): SVGGraphicsElement[] => {
324
+ const circuitSvg = container.querySelector("svg[id]");
325
+ return circuitSvg != null
326
+ ? Array.from(circuitSvg.querySelectorAll<SVGGraphicsElement>(".gate"))
327
+ : [];
328
+ };
329
+
330
+ export {
331
+ createUUID,
332
+ getGateWidth,
333
+ getChildTargets,
334
+ locationStringToIndexes,
335
+ getGateLocationString,
336
+ findGateElem,
337
+ findLocation,
338
+ findParentOperation,
339
+ findParentArray,
340
+ findOperation,
341
+ getWireData,
342
+ getToolboxElems,
343
+ getHostElems,
344
+ getGateElems,
345
+ };
package/ux/circuit.tsx CHANGED
@@ -5,6 +5,7 @@ import * as qviz from "./circuit-vis";
5
5
  import { useEffect, useRef, useState } from "preact/hooks";
6
6
  import { CircuitProps } from "./data.js";
7
7
  import { Spinner } from "./spinner.js";
8
+ import { toCircuitGroup } from "./circuit-vis/circuit";
8
9
 
9
10
  // For perf reasons we set a limit on how many gates/qubits
10
11
  // we attempt to render. This is still a lot higher than a human would
@@ -13,29 +14,49 @@ import { Spinner } from "./spinner.js";
13
14
  const MAX_OPERATIONS = 10000;
14
15
  const MAX_QUBITS = 1000;
15
16
 
17
+ // For now we only support one circuit at a time.
18
+ const MAX_CIRCUITS = 1;
19
+
16
20
  // This component is shared by the Python widget and the VS Code panel
17
- export function Circuit(props: { circuit: qviz.Circuit }) {
18
- const circuit = props.circuit;
21
+ export function Circuit(props: {
22
+ circuit?: qviz.CircuitGroup | qviz.Circuit;
23
+ isEditable: boolean;
24
+ editCallback?: (fileData: qviz.CircuitGroup) => void;
25
+ }) {
26
+ const circuitGroup = toCircuitGroup(props.circuit);
27
+ const circuit = circuitGroup.circuits[0];
28
+
29
+ if (circuit.componentGrid === undefined) circuit.componentGrid = [];
30
+ if (circuit.qubits === undefined) circuit.qubits = [];
31
+
32
+ if (circuit.componentGrid === undefined) circuit.componentGrid = [];
33
+ if (circuit.qubits === undefined) circuit.qubits = [];
34
+
19
35
  const unrenderable =
20
- circuit.qubits.length === 0 ||
21
- circuit.operations.length > MAX_OPERATIONS ||
36
+ circuitGroup.circuits.length > MAX_CIRCUITS ||
37
+ (!props.isEditable && circuit.qubits.length === 0) ||
38
+ circuit.componentGrid.length > MAX_OPERATIONS ||
22
39
  circuit.qubits.length > MAX_QUBITS;
23
40
 
24
41
  return (
25
42
  <div>
26
43
  {unrenderable ? (
27
44
  <Unrenderable
28
- qubits={props.circuit.qubits.length}
29
- operations={props.circuit.operations.length}
45
+ qubits={circuit.qubits.length}
46
+ operations={circuit.componentGrid.length}
30
47
  />
31
48
  ) : (
32
- <ZoomableCircuit circuit={props.circuit} />
49
+ <ZoomableCircuit {...props} circuitGroup={circuitGroup} />
33
50
  )}
34
51
  </div>
35
52
  );
36
53
  }
37
54
 
38
- function ZoomableCircuit(props: { circuit: qviz.Circuit }) {
55
+ function ZoomableCircuit(props: {
56
+ circuitGroup: qviz.CircuitGroup;
57
+ isEditable: boolean;
58
+ editCallback?: (fileData: qviz.CircuitGroup) => void;
59
+ }) {
39
60
  const circuitDiv = useRef<HTMLDivElement>(null);
40
61
  const [zoomLevel, setZoomLevel] = useState(100);
41
62
  const [rendering, setRendering] = useState(true);
@@ -46,22 +67,31 @@ function ZoomableCircuit(props: { circuit: qviz.Circuit }) {
46
67
  setRendering(true);
47
68
  const container = circuitDiv.current!;
48
69
  container.innerHTML = "";
49
- }, [props.circuit]);
70
+ }, [props.circuitGroup]);
50
71
 
51
72
  useEffect(() => {
52
73
  if (rendering) {
53
74
  const container = circuitDiv.current!;
54
- // Draw the circuit - may take a while for large circuits
55
- const svg = renderCircuit(props.circuit, container);
75
+ // Draw the circuits - may take a while for large circuits
76
+ const svg = renderCircuits(
77
+ props.circuitGroup,
78
+ container,
79
+ props.isEditable,
80
+ props.editCallback,
81
+ );
82
+
83
+ if (!props.isEditable) {
84
+ const initialZoom = calculateZoomToFit(container, svg as SVGElement);
85
+ // Set the initial zoom level
86
+ setZoomLevel(initialZoom);
87
+ // Resize the SVG to fit
88
+ updateWidth();
89
+ }
90
+
56
91
  // Calculate the initial zoom level based on the container width
57
- const initialZoom = calculateZoomToFit(container, svg as SVGElement);
58
- // Set the initial zoom level
59
- setZoomLevel(initialZoom);
60
- // Resize the SVG to fit
61
- updateWidth();
62
92
  // Disable "rendering" text
63
93
  setRendering(false);
64
- } else {
94
+ } else if (!props.isEditable) {
65
95
  // Initial drawing done, attach window resize handler
66
96
  window.addEventListener("resize", onResize);
67
97
  return () => {
@@ -77,13 +107,13 @@ function ZoomableCircuit(props: { circuit: qviz.Circuit }) {
77
107
  return (
78
108
  <div>
79
109
  <div>
80
- {rendering ? null : (
110
+ {props.isEditable || rendering ? null : (
81
111
  <ZoomControl zoom={zoomLevel} onInput={userSetZoomLevel} />
82
112
  )}
83
113
  </div>
84
114
  <div>
85
115
  {rendering
86
- ? `Rendering diagram with ${props.circuit.operations.length} gates...`
116
+ ? `Rendering diagram with ${props.circuitGroup.circuits[0].componentGrid.length} gates...`
87
117
  : ""}
88
118
  </div>
89
119
  <div class="qs-circuit" ref={circuitDiv}></div>
@@ -128,14 +158,13 @@ function ZoomableCircuit(props: { circuit: qviz.Circuit }) {
128
158
  }
129
159
  }
130
160
 
131
- function renderCircuit(circuit: qviz.Circuit, container: HTMLDivElement) {
132
- qviz.draw(circuit, container);
133
-
134
- // circuit-vis hardcodes the styles in the SVG.
135
- // Remove the style elements -- we'll define the styles in our own CSS.
136
- const styleElements = container.querySelectorAll("style");
137
- styleElements?.forEach((tag) => tag.remove());
138
-
161
+ function renderCircuits(
162
+ circuitGroup: qviz.CircuitGroup,
163
+ container: HTMLDivElement,
164
+ isEditable: boolean,
165
+ editCallback?: (fileData: qviz.CircuitGroup) => void,
166
+ ) {
167
+ qviz.draw(circuitGroup, container, 0, isEditable, editCallback);
139
168
  return container.getElementsByClassName("qviz")[0]!;
140
169
  }
141
170
 
@@ -231,15 +260,14 @@ export function CircuitPanel(props: CircuitProps) {
231
260
  {props.title} {props.simulated ? "(Trace)" : ""}
232
261
  </h1>
233
262
  </div>
234
- <div class="qs-circuit-error">{error}</div>
235
- <p>{props.targetProfile}</p>
236
- <p>
237
- {
238
- props.simulated
239
- ? "WARNING: This diagram shows the result of tracing a dynamic circuit, and may change from run to run."
240
- : "\xa0" // nbsp to keep line height consistent
241
- }
242
- </p>
263
+ {error && <div class="qs-circuit-error">{error}</div>}
264
+ {props.targetProfile && <p>{props.targetProfile}</p>}
265
+ {props.simulated && (
266
+ <p>
267
+ WARNING: This diagram shows the result of tracing a dynamic circuit,
268
+ and may change from run to run.
269
+ </p>
270
+ )}
243
271
  <p>
244
272
  Learn more at{" "}
245
273
  <a href="https://aka.ms/qdk.circuits">https://aka.ms/qdk.circuits</a>
@@ -249,7 +277,13 @@ export function CircuitPanel(props: CircuitProps) {
249
277
  <Spinner />
250
278
  </div>
251
279
  ) : null}
252
- {props.circuit ? <Circuit circuit={props.circuit}></Circuit> : null}
280
+ {props.circuit ? (
281
+ <Circuit
282
+ circuit={props.circuit}
283
+ isEditable={props.isEditable}
284
+ editCallback={props.editCallback}
285
+ ></Circuit>
286
+ ) : null}
253
287
  </div>
254
288
  );
255
289
  }
package/ux/data.ts CHANGED
@@ -66,13 +66,15 @@ export function CreateSingleEstimateResult(
66
66
 
67
67
  export type CircuitProps = {
68
68
  title: string;
69
- circuit?: CircuitData;
69
+ circuit?: CircuitGroup;
70
70
  errorHtml?: string;
71
71
  targetProfile: string;
72
72
  /** Circuit was generated by running the simulator */
73
73
  simulated: boolean;
74
74
  /** Circuit is still being generated */
75
75
  calculating: boolean;
76
+ isEditable: boolean;
77
+ editCallback?: (fileData: CircuitGroup) => void;
76
78
  };
77
79
 
78
- export type CircuitData = import("../src/shared/circuit").Circuit;
80
+ export type CircuitGroup = import("./circuit-vis/circuit").CircuitGroup;
package/ux/index.ts CHANGED
@@ -9,7 +9,7 @@ import "./qsharp-circuit.css";
9
9
  export {
10
10
  CreateSingleEstimateResult,
11
11
  type ReData,
12
- type CircuitData,
12
+ type CircuitGroup,
13
13
  type CircuitProps,
14
14
  } from "./data.js";
15
15
  export { Histogram } from "./histogram.js";