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.
- package/dist/browser.d.ts +1 -1
- package/dist/compiler/compiler.d.ts +1 -1
- package/dist/compiler/compiler.js +6 -1
- package/dist/debug-service/debug-service.d.ts +1 -1
- package/dist/debug-service/debug-service.js +6 -1
- package/dist/katas-content.generated.js +1 -1
- package/dist/katas-content.generated.md.js +1 -1
- package/dist/samples.generated.js +1 -1
- package/dist/shared/circuit.d.ts +86 -30
- package/dist/shared/circuit.js +4 -0
- package/dist/shared/legacyCircuitUpdate.d.ts +9 -0
- package/dist/shared/legacyCircuitUpdate.js +312 -0
- package/dist/shared/register.d.ts +3 -5
- package/dist/utils.d.ts +9 -0
- package/dist/utils.js +41 -0
- package/docs/Microsoft.Quantum.Core/Length.md +1 -1
- package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
- package/docs/Microsoft.Quantum.Core/index.md +1 -1
- package/docs/Std.Arithmetic/AddLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByI.md +1 -1
- package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByL.md +1 -1
- package/docs/Std.Arithmetic/IncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
- package/docs/Std.Arithmetic/MAJ.md +1 -1
- package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
- package/docs/Std.Arithmetic/index.md +1 -1
- package/docs/Std.Arrays/All.md +1 -1
- package/docs/Std.Arrays/Any.md +1 -1
- package/docs/Std.Arrays/Chunks.md +1 -1
- package/docs/Std.Arrays/CircularlyShifted.md +1 -1
- package/docs/Std.Arrays/ColumnAt.md +1 -1
- package/docs/Std.Arrays/Count.md +1 -1
- package/docs/Std.Arrays/Diagonal.md +1 -1
- package/docs/Std.Arrays/DrawMany.md +1 -1
- package/docs/Std.Arrays/Enumerated.md +1 -1
- package/docs/Std.Arrays/Excluding.md +1 -1
- package/docs/Std.Arrays/Filtered.md +1 -1
- package/docs/Std.Arrays/FlatMapped.md +1 -1
- package/docs/Std.Arrays/Flattened.md +1 -1
- package/docs/Std.Arrays/Fold.md +1 -1
- package/docs/Std.Arrays/ForEach.md +1 -1
- package/docs/Std.Arrays/Head.md +1 -1
- package/docs/Std.Arrays/HeadAndRest.md +1 -1
- package/docs/Std.Arrays/IndexOf.md +1 -1
- package/docs/Std.Arrays/IndexRange.md +1 -1
- package/docs/Std.Arrays/Interleaved.md +1 -1
- package/docs/Std.Arrays/IsEmpty.md +1 -1
- package/docs/Std.Arrays/IsRectangularArray.md +1 -1
- package/docs/Std.Arrays/IsSorted.md +1 -1
- package/docs/Std.Arrays/IsSquareArray.md +1 -1
- package/docs/Std.Arrays/Mapped.md +1 -1
- package/docs/Std.Arrays/MappedByIndex.md +1 -1
- package/docs/Std.Arrays/MappedOverRange.md +1 -1
- package/docs/Std.Arrays/Most.md +1 -1
- package/docs/Std.Arrays/MostAndTail.md +1 -1
- package/docs/Std.Arrays/Padded.md +1 -1
- package/docs/Std.Arrays/Partitioned.md +1 -1
- package/docs/Std.Arrays/Rest.md +1 -1
- package/docs/Std.Arrays/Reversed.md +1 -1
- package/docs/Std.Arrays/SequenceI.md +1 -1
- package/docs/Std.Arrays/SequenceL.md +1 -1
- package/docs/Std.Arrays/Sorted.md +1 -1
- package/docs/Std.Arrays/Subarray.md +1 -1
- package/docs/Std.Arrays/Swapped.md +1 -1
- package/docs/Std.Arrays/Tail.md +1 -1
- package/docs/Std.Arrays/Transposed.md +1 -1
- package/docs/Std.Arrays/Unzipped.md +1 -1
- package/docs/Std.Arrays/Where.md +1 -1
- package/docs/Std.Arrays/Windows.md +1 -1
- package/docs/Std.Arrays/Zipped.md +1 -1
- package/docs/Std.Arrays/index.md +1 -1
- package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
- package/docs/Std.Canon/ApplyP.md +1 -1
- package/docs/Std.Canon/ApplyPauli.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
- package/docs/Std.Canon/ApplyQFT.md +1 -1
- package/docs/Std.Canon/ApplyToEach.md +1 -1
- package/docs/Std.Canon/ApplyToEachA.md +1 -1
- package/docs/Std.Canon/ApplyToEachC.md +1 -1
- package/docs/Std.Canon/ApplyToEachCA.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
- package/docs/Std.Canon/CX.md +1 -1
- package/docs/Std.Canon/CY.md +1 -1
- package/docs/Std.Canon/CZ.md +1 -1
- package/docs/Std.Canon/Fst.md +1 -1
- package/docs/Std.Canon/Relabel.md +1 -1
- package/docs/Std.Canon/Snd.md +1 -1
- package/docs/Std.Canon/SwapReverseRegister.md +1 -1
- package/docs/Std.Canon/index.md +1 -1
- package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
- package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
- package/docs/Std.Convert/BoolAsResult.md +1 -1
- package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
- package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
- package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
- package/docs/Std.Convert/IntAsBigInt.md +1 -1
- package/docs/Std.Convert/IntAsBoolArray.md +1 -1
- package/docs/Std.Convert/IntAsDouble.md +1 -1
- package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
- package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
- package/docs/Std.Convert/ResultAsBool.md +1 -1
- package/docs/Std.Convert/index.md +1 -1
- package/docs/Std.Core/Length.md +1 -1
- package/docs/Std.Core/Repeated.md +1 -1
- package/docs/Std.Core/index.md +1 -1
- package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
- package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
- package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
- package/docs/Std.Diagnostics/CheckZero.md +1 -1
- package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
- package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
- package/docs/Std.Diagnostics/DumpMachine.md +1 -1
- package/docs/Std.Diagnostics/DumpOperation.md +1 -1
- package/docs/Std.Diagnostics/DumpRegister.md +1 -1
- package/docs/Std.Diagnostics/Fact.md +1 -1
- package/docs/Std.Diagnostics/NoNoise.md +1 -1
- package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/index.md +1 -1
- package/docs/Std.Intrinsic/AND.md +1 -1
- package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
- package/docs/Std.Intrinsic/CCNOT.md +1 -1
- package/docs/Std.Intrinsic/CNOT.md +1 -1
- package/docs/Std.Intrinsic/Exp.md +1 -1
- package/docs/Std.Intrinsic/H.md +1 -1
- package/docs/Std.Intrinsic/I.md +1 -1
- package/docs/Std.Intrinsic/M.md +1 -1
- package/docs/Std.Intrinsic/Measure.md +1 -1
- package/docs/Std.Intrinsic/Message.md +1 -1
- package/docs/Std.Intrinsic/R.md +1 -1
- package/docs/Std.Intrinsic/R1.md +1 -1
- package/docs/Std.Intrinsic/R1Frac.md +1 -1
- package/docs/Std.Intrinsic/RFrac.md +1 -1
- package/docs/Std.Intrinsic/Reset.md +1 -1
- package/docs/Std.Intrinsic/ResetAll.md +1 -1
- package/docs/Std.Intrinsic/Rx.md +1 -1
- package/docs/Std.Intrinsic/Rxx.md +1 -1
- package/docs/Std.Intrinsic/Ry.md +1 -1
- package/docs/Std.Intrinsic/Ryy.md +1 -1
- package/docs/Std.Intrinsic/Rz.md +1 -1
- package/docs/Std.Intrinsic/Rzz.md +1 -1
- package/docs/Std.Intrinsic/S.md +1 -1
- package/docs/Std.Intrinsic/SWAP.md +1 -1
- package/docs/Std.Intrinsic/T.md +1 -1
- package/docs/Std.Intrinsic/X.md +1 -1
- package/docs/Std.Intrinsic/Y.md +1 -1
- package/docs/Std.Intrinsic/Z.md +1 -1
- package/docs/Std.Intrinsic/index.md +1 -1
- package/docs/Std.Logical/Xor.md +1 -1
- package/docs/Std.Logical/index.md +1 -1
- package/docs/Std.Math/AbsComplex.md +1 -1
- package/docs/Std.Math/AbsComplexPolar.md +1 -1
- package/docs/Std.Math/AbsD.md +1 -1
- package/docs/Std.Math/AbsI.md +1 -1
- package/docs/Std.Math/AbsL.md +1 -1
- package/docs/Std.Math/AbsSquaredComplex.md +1 -1
- package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
- package/docs/Std.Math/ApproximateFactorial.md +1 -1
- package/docs/Std.Math/ArcCos.md +1 -1
- package/docs/Std.Math/ArcCosh.md +1 -1
- package/docs/Std.Math/ArcSin.md +1 -1
- package/docs/Std.Math/ArcSinh.md +1 -1
- package/docs/Std.Math/ArcTan.md +1 -1
- package/docs/Std.Math/ArcTan2.md +1 -1
- package/docs/Std.Math/ArcTanh.md +1 -1
- package/docs/Std.Math/ArgComplex.md +1 -1
- package/docs/Std.Math/ArgComplexPolar.md +1 -1
- package/docs/Std.Math/Binom.md +1 -1
- package/docs/Std.Math/BitSizeI.md +1 -1
- package/docs/Std.Math/BitSizeL.md +1 -1
- package/docs/Std.Math/Ceiling.md +1 -1
- package/docs/Std.Math/Complex.md +1 -1
- package/docs/Std.Math/ComplexPolar.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
- package/docs/Std.Math/Cos.md +1 -1
- package/docs/Std.Math/Cosh.md +1 -1
- package/docs/Std.Math/DivRemI.md +1 -1
- package/docs/Std.Math/DivRemL.md +1 -1
- package/docs/Std.Math/DividedByC.md +1 -1
- package/docs/Std.Math/DividedByCP.md +1 -1
- package/docs/Std.Math/E.md +1 -1
- package/docs/Std.Math/ExpModI.md +1 -1
- package/docs/Std.Math/ExpModL.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/FactorialI.md +1 -1
- package/docs/Std.Math/FactorialL.md +1 -1
- package/docs/Std.Math/Floor.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/HammingWeightI.md +1 -1
- package/docs/Std.Math/InverseModI.md +1 -1
- package/docs/Std.Math/InverseModL.md +1 -1
- package/docs/Std.Math/IsCoprimeI.md +1 -1
- package/docs/Std.Math/IsCoprimeL.md +1 -1
- package/docs/Std.Math/IsInfinite.md +1 -1
- package/docs/Std.Math/IsNaN.md +1 -1
- package/docs/Std.Math/LargestFixedPoint.md +1 -1
- package/docs/Std.Math/Lg.md +1 -1
- package/docs/Std.Math/Log.md +1 -1
- package/docs/Std.Math/Log10.md +1 -1
- package/docs/Std.Math/LogFactorialD.md +1 -1
- package/docs/Std.Math/LogGammaD.md +1 -1
- package/docs/Std.Math/LogOf2.md +1 -1
- package/docs/Std.Math/Max.md +1 -1
- package/docs/Std.Math/MaxD.md +1 -1
- package/docs/Std.Math/MaxI.md +1 -1
- package/docs/Std.Math/MaxL.md +1 -1
- package/docs/Std.Math/Min.md +1 -1
- package/docs/Std.Math/MinD.md +1 -1
- package/docs/Std.Math/MinI.md +1 -1
- package/docs/Std.Math/MinL.md +1 -1
- package/docs/Std.Math/MinusC.md +1 -1
- package/docs/Std.Math/MinusCP.md +1 -1
- package/docs/Std.Math/ModulusI.md +1 -1
- package/docs/Std.Math/ModulusL.md +1 -1
- package/docs/Std.Math/NegationC.md +1 -1
- package/docs/Std.Math/NegationCP.md +1 -1
- package/docs/Std.Math/PI.md +1 -1
- package/docs/Std.Math/PNorm.md +1 -1
- package/docs/Std.Math/PNormalized.md +1 -1
- package/docs/Std.Math/PlusC.md +1 -1
- package/docs/Std.Math/PlusCP.md +1 -1
- package/docs/Std.Math/PowC.md +1 -1
- package/docs/Std.Math/PowCP.md +1 -1
- package/docs/Std.Math/RealMod.md +1 -1
- package/docs/Std.Math/Round.md +1 -1
- package/docs/Std.Math/SignD.md +1 -1
- package/docs/Std.Math/SignI.md +1 -1
- package/docs/Std.Math/SignL.md +1 -1
- package/docs/Std.Math/Sin.md +1 -1
- package/docs/Std.Math/Sinh.md +1 -1
- package/docs/Std.Math/SmallestFixedPoint.md +1 -1
- package/docs/Std.Math/Sqrt.md +1 -1
- package/docs/Std.Math/SquaredNorm.md +1 -1
- package/docs/Std.Math/Tan.md +1 -1
- package/docs/Std.Math/Tanh.md +1 -1
- package/docs/Std.Math/TimesC.md +1 -1
- package/docs/Std.Math/TimesCP.md +1 -1
- package/docs/Std.Math/TrailingZeroCountI.md +1 -1
- package/docs/Std.Math/TrailingZeroCountL.md +1 -1
- package/docs/Std.Math/Truncate.md +1 -1
- package/docs/Std.Math/index.md +1 -1
- package/docs/Std.Measurement/MResetEachZ.md +1 -1
- package/docs/Std.Measurement/MResetX.md +1 -1
- package/docs/Std.Measurement/MResetY.md +1 -1
- package/docs/Std.Measurement/MResetZ.md +1 -1
- package/docs/Std.Measurement/MeasureAllZ.md +1 -1
- package/docs/Std.Measurement/MeasureEachZ.md +1 -1
- package/docs/Std.Measurement/MeasureInteger.md +1 -1
- package/docs/Std.Measurement/index.md +1 -1
- package/docs/Std.Random/DrawRandomBool.md +1 -1
- package/docs/Std.Random/DrawRandomDouble.md +1 -1
- package/docs/Std.Random/DrawRandomInt.md +1 -1
- package/docs/Std.Random/index.md +1 -1
- package/docs/Std.Range/IsRangeEmpty.md +1 -1
- package/docs/Std.Range/RangeEnd.md +1 -1
- package/docs/Std.Range/RangeReverse.md +1 -1
- package/docs/Std.Range/RangeStart.md +1 -1
- package/docs/Std.Range/RangeStep.md +1 -1
- package/docs/Std.Range/index.md +1 -1
- package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
- package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/CczCount.md +1 -1
- package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
- package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
- package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
- package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
- package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
- package/docs/Std.ResourceEstimation/TCount.md +1 -1
- package/docs/Std.ResourceEstimation/index.md +1 -1
- package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
- package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
- package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
- package/docs/Std.StatePreparation/index.md +1 -1
- package/docs/Std.TableLookup/Select.md +1 -1
- package/docs/Std.TableLookup/index.md +1 -1
- package/docs/index.md +1 -1
- package/lib/node/qsc_wasm.cjs +2 -2
- package/lib/node/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.js +2 -2
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/circuit-vis/circuit.ts +11 -0
- package/ux/circuit-vis/circuitManipulation.ts +549 -0
- package/ux/circuit-vis/constants.ts +7 -0
- package/ux/circuit-vis/contextMenu.ts +376 -0
- package/ux/circuit-vis/draggable.ts +352 -0
- package/ux/circuit-vis/events.ts +818 -0
- package/ux/circuit-vis/formatters/gateFormatter.ts +56 -23
- package/ux/circuit-vis/formatters/inputFormatter.ts +38 -7
- package/ux/circuit-vis/formatters/registerFormatter.ts +12 -30
- package/ux/circuit-vis/index.ts +16 -11
- package/ux/circuit-vis/metadata.ts +3 -1
- package/ux/circuit-vis/panel.ts +333 -0
- package/ux/circuit-vis/process.ts +136 -232
- package/ux/circuit-vis/sqore.ts +231 -116
- package/ux/circuit-vis/utils.ts +269 -1
- package/ux/circuit.tsx +71 -37
- package/ux/data.ts +4 -2
- package/ux/index.ts +1 -1
- package/ux/qsharp-circuit.css +260 -4
- package/ux/circuit-vis/styles.ts +0 -236
|
@@ -29,15 +29,18 @@ import {
|
|
|
29
29
|
/**
|
|
30
30
|
* Given an array of operations (in metadata format), return the SVG representation.
|
|
31
31
|
*
|
|
32
|
-
* @param opsMetadata
|
|
32
|
+
* @param opsMetadata 2D array of Metadata representation of operations.
|
|
33
33
|
* @param nestedDepth Depth of nested operations (used in classically controlled and grouped operations).
|
|
34
34
|
*
|
|
35
35
|
* @returns SVG representation of operations.
|
|
36
36
|
*/
|
|
37
|
-
const formatGates = (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
const formatGates = (
|
|
38
|
+
opsMetadata: Metadata[][],
|
|
39
|
+
nestedDepth = 0,
|
|
40
|
+
): SVGElement => {
|
|
41
|
+
const formattedGates: SVGElement[] = opsMetadata
|
|
42
|
+
.map((col) => col.map((metadata) => formatGate(metadata, nestedDepth)))
|
|
43
|
+
.flat();
|
|
41
44
|
return group(formattedGates);
|
|
42
45
|
};
|
|
43
46
|
|
|
@@ -49,7 +52,7 @@ const formatGates = (opsMetadata: Metadata[], nestedDepth = 0): SVGElement => {
|
|
|
49
52
|
*
|
|
50
53
|
* @returns SVG representation of gate.
|
|
51
54
|
*/
|
|
52
|
-
const
|
|
55
|
+
const formatGate = (metadata: Metadata, nestedDepth = 0): SVGElement => {
|
|
53
56
|
const { type, x, controlsY, targetsY, label, displayArgs, width } = metadata;
|
|
54
57
|
switch (type) {
|
|
55
58
|
case GateType.Measure:
|
|
@@ -62,6 +65,8 @@ const _formatGate = (metadata: Metadata, nestedDepth = 0): SVGElement => {
|
|
|
62
65
|
);
|
|
63
66
|
case GateType.X:
|
|
64
67
|
return _createGate([_x(metadata, nestedDepth)], metadata, nestedDepth);
|
|
68
|
+
case GateType.Ket:
|
|
69
|
+
return _createGate([_ket(label, metadata)], metadata, nestedDepth);
|
|
65
70
|
case GateType.Swap:
|
|
66
71
|
return controlsY.length > 0
|
|
67
72
|
? _controlledGate(metadata, nestedDepth)
|
|
@@ -209,12 +214,14 @@ const _measure = (x: number, y: number): SVGElement => {
|
|
|
209
214
|
"gate-measure",
|
|
210
215
|
);
|
|
211
216
|
const mArc: SVGElement = arc(x + 5, y + 2, width / 2 - 5, height / 2 - 8);
|
|
217
|
+
mArc.style.pointerEvents = "none";
|
|
212
218
|
const meter: SVGElement = line(
|
|
213
219
|
x + width / 2,
|
|
214
220
|
y + 8,
|
|
215
221
|
x + width - 8,
|
|
216
222
|
y - height / 2 + 8,
|
|
217
223
|
);
|
|
224
|
+
meter.style.pointerEvents = "none";
|
|
218
225
|
return group([mBox, mArc, meter]);
|
|
219
226
|
};
|
|
220
227
|
|
|
@@ -226,7 +233,9 @@ const _measure = (x: number, y: number): SVGElement => {
|
|
|
226
233
|
* @param y Array of y coords of registers acted upon by gate.
|
|
227
234
|
* @param width Width of gate.
|
|
228
235
|
* @param displayArgs Arguments passed in to gate.
|
|
236
|
+
* @param params Non-Qubit required parameters for the unitary gate.
|
|
229
237
|
* @param renderDashedLine If true, draw dashed lines between non-adjacent unitaries.
|
|
238
|
+
* @param cssClass Optional CSS class to apply to the unitary gate for styling.
|
|
230
239
|
*
|
|
231
240
|
* @returns SVG representation of unitary gate.
|
|
232
241
|
*/
|
|
@@ -237,6 +246,7 @@ const _unitary = (
|
|
|
237
246
|
width: number,
|
|
238
247
|
displayArgs?: string,
|
|
239
248
|
renderDashedLine = true,
|
|
249
|
+
cssClass?: string,
|
|
240
250
|
): SVGElement => {
|
|
241
251
|
if (y.length === 0)
|
|
242
252
|
throw new Error(
|
|
@@ -248,7 +258,7 @@ const _unitary = (
|
|
|
248
258
|
const maxY: number = group[group.length - 1],
|
|
249
259
|
minY: number = group[0];
|
|
250
260
|
const height: number = maxY - minY + gateHeight;
|
|
251
|
-
return _unitaryBox(label, x, minY, width, height, displayArgs);
|
|
261
|
+
return _unitaryBox(label, x, minY, width, height, displayArgs, cssClass);
|
|
252
262
|
});
|
|
253
263
|
|
|
254
264
|
// Draw dashed line between disconnected unitaries
|
|
@@ -273,6 +283,7 @@ const _unitary = (
|
|
|
273
283
|
* @param width Width of gate.
|
|
274
284
|
* @param height Height of gate.
|
|
275
285
|
* @param displayArgs Arguments passed in to gate.
|
|
286
|
+
* @param cssClass Optional CSS class to apply to the unitary gate for styling.
|
|
276
287
|
*
|
|
277
288
|
* @returns SVG representation of unitary box.
|
|
278
289
|
*/
|
|
@@ -283,16 +294,22 @@ const _unitaryBox = (
|
|
|
283
294
|
width: number,
|
|
284
295
|
height: number = gateHeight,
|
|
285
296
|
displayArgs?: string,
|
|
297
|
+
cssClass?: string,
|
|
286
298
|
): SVGElement => {
|
|
287
299
|
y -= gateHeight / 2;
|
|
288
300
|
const uBox: SVGElement = box(x - width / 2, y, width, height);
|
|
301
|
+
if (cssClass != null) {
|
|
302
|
+
uBox.setAttribute("class", cssClass);
|
|
303
|
+
}
|
|
289
304
|
const labelY = y + height / 2 - (displayArgs == null ? 0 : 7);
|
|
290
305
|
const labelText: SVGElement = text(label, x, labelY);
|
|
291
306
|
const elems = [uBox, labelText];
|
|
292
307
|
if (displayArgs != null) {
|
|
293
308
|
const argStrY = y + height / 2 + 8;
|
|
294
|
-
|
|
295
|
-
|
|
309
|
+
|
|
310
|
+
const argButton: SVGElement = text(displayArgs, x, argStrY, argsFontSize);
|
|
311
|
+
argButton.setAttribute("class", "arg-button");
|
|
312
|
+
elems.push(argButton);
|
|
296
313
|
}
|
|
297
314
|
return group(elems);
|
|
298
315
|
};
|
|
@@ -315,8 +332,10 @@ const _swap = (metadata: Metadata, nestedDepth: number): SVGElement => {
|
|
|
315
332
|
const bg: SVGElement = box(x1, y1, x2, y2, "gate-swap");
|
|
316
333
|
const crosses: SVGElement[] = ys.map((y) => _cross(x, y));
|
|
317
334
|
const vertLine: SVGElement = line(x, ys[0], x, ys[1]);
|
|
335
|
+
vertLine.style.pointerEvents = "none";
|
|
318
336
|
return group([bg, ...crosses, vertLine]);
|
|
319
337
|
};
|
|
338
|
+
|
|
320
339
|
/**
|
|
321
340
|
* Creates the SVG for an X gate
|
|
322
341
|
*
|
|
@@ -328,6 +347,30 @@ const _x = (metadata: Metadata, _: number): SVGElement => {
|
|
|
328
347
|
const ys = targetsY.flatMap((y) => y as number[]);
|
|
329
348
|
return _oplus(x, ys[0]);
|
|
330
349
|
};
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Creates the SVG for a ket notation (e.g "|0⟩" or "|1⟩") gate.
|
|
353
|
+
*
|
|
354
|
+
* @param label The label for the ket notation (e.g., "0" or "1").
|
|
355
|
+
* @param metadata The metadata object containing information about the gate's position and appearance.
|
|
356
|
+
*
|
|
357
|
+
* @returns SVG representation of the ket notation gate.
|
|
358
|
+
*/
|
|
359
|
+
const _ket = (label: string, metadata: Metadata): SVGElement => {
|
|
360
|
+
const { x, targetsY, width } = metadata;
|
|
361
|
+
const gate = _unitary(
|
|
362
|
+
`|${label}〉`,
|
|
363
|
+
x,
|
|
364
|
+
targetsY as number[][],
|
|
365
|
+
width,
|
|
366
|
+
undefined,
|
|
367
|
+
false,
|
|
368
|
+
"gate-ket",
|
|
369
|
+
);
|
|
370
|
+
gate.querySelector("text")!.setAttribute("class", "ket-text");
|
|
371
|
+
return gate;
|
|
372
|
+
};
|
|
373
|
+
|
|
331
374
|
/**
|
|
332
375
|
* Generates cross for display in SWAP gate.
|
|
333
376
|
*
|
|
@@ -396,6 +439,7 @@ const _controlledGate = (
|
|
|
396
439
|
const maxY: number = Math.max(...controlsY, ...(targetsY as number[]));
|
|
397
440
|
const minY: number = Math.min(...controlsY, ...(targetsY as number[]));
|
|
398
441
|
const vertLine: SVGElement = line(x, minY, x, maxY);
|
|
442
|
+
vertLine.style.pointerEvents = "none";
|
|
399
443
|
const svg: SVGElement = _createGate(
|
|
400
444
|
[vertLine, ...controlledDotsSvg, ...targetGateSvgs],
|
|
401
445
|
metadata,
|
|
@@ -439,7 +483,7 @@ const _groupedOperations = (
|
|
|
439
483
|
const box: SVGElement = dashedBox(x1, y1, x2, y2);
|
|
440
484
|
const elems: SVGElement[] = [box];
|
|
441
485
|
if (children != null)
|
|
442
|
-
elems.push(formatGates(children as Metadata[], nestedDepth + 1));
|
|
486
|
+
elems.push(formatGates(children as Metadata[][], nestedDepth + 1));
|
|
443
487
|
return _createGate(elems, metadata, nestedDepth);
|
|
444
488
|
};
|
|
445
489
|
|
|
@@ -457,7 +501,7 @@ const _classicalControlled = (
|
|
|
457
501
|
): SVGElement => {
|
|
458
502
|
const { controlsY, dataAttributes } = metadata;
|
|
459
503
|
const targetsY: number[] = metadata.targetsY as number[];
|
|
460
|
-
const children: Metadata[][] = metadata.children as Metadata[][];
|
|
504
|
+
const children: Metadata[][][] = metadata.children as Metadata[][][];
|
|
461
505
|
let { x, width } = metadata;
|
|
462
506
|
|
|
463
507
|
const controlY = controlsY[0];
|
|
@@ -543,15 +587,4 @@ const _controlCircle = (
|
|
|
543
587
|
class: "classically-controlled-btn",
|
|
544
588
|
});
|
|
545
589
|
|
|
546
|
-
export {
|
|
547
|
-
formatGates,
|
|
548
|
-
_formatGate,
|
|
549
|
-
_createGate,
|
|
550
|
-
_zoomButton,
|
|
551
|
-
_measure,
|
|
552
|
-
_unitary,
|
|
553
|
-
_swap,
|
|
554
|
-
_controlledGate,
|
|
555
|
-
_groupedOperations,
|
|
556
|
-
_classicalControlled,
|
|
557
|
-
};
|
|
590
|
+
export { formatGates, formatGate };
|
|
@@ -27,15 +27,15 @@ const formatInputs = (
|
|
|
27
27
|
const registers: RegisterMap = {};
|
|
28
28
|
|
|
29
29
|
let currY: number = startY;
|
|
30
|
-
qubits.forEach(({ id,
|
|
30
|
+
qubits.forEach(({ id, numResults }) => {
|
|
31
31
|
// Add qubit wire to list of qubit wires
|
|
32
|
-
qubitWires.push(_qubitInput(currY));
|
|
32
|
+
qubitWires.push(_qubitInput(currY, id.toString()));
|
|
33
33
|
|
|
34
34
|
// Create qubit register
|
|
35
35
|
registers[id] = { type: RegisterType.Qubit, y: currY };
|
|
36
36
|
|
|
37
37
|
// If there are no attached classical registers, increment y by fixed register height
|
|
38
|
-
if (
|
|
38
|
+
if (numResults == null || numResults === 0) {
|
|
39
39
|
currY += registerHeight;
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
@@ -44,7 +44,7 @@ const formatInputs = (
|
|
|
44
44
|
currY += classicalRegHeight;
|
|
45
45
|
|
|
46
46
|
// Add classical wires
|
|
47
|
-
registers[id].children = Array.from(Array(
|
|
47
|
+
registers[id].children = Array.from(Array(numResults), () => {
|
|
48
48
|
const clsReg: RegisterMetadata = {
|
|
49
49
|
type: RegisterType.Classical,
|
|
50
50
|
y: currY,
|
|
@@ -55,7 +55,7 @@ const formatInputs = (
|
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
return {
|
|
58
|
-
qubitWires: group(qubitWires),
|
|
58
|
+
qubitWires: group(qubitWires, { class: "qubit-input-states" }),
|
|
59
59
|
registers,
|
|
60
60
|
svgHeight: currY,
|
|
61
61
|
};
|
|
@@ -68,8 +68,39 @@ const formatInputs = (
|
|
|
68
68
|
*
|
|
69
69
|
* @returns SVG text component for the input register.
|
|
70
70
|
*/
|
|
71
|
-
const _qubitInput = (y: number): SVGElement => {
|
|
72
|
-
const el: SVGElement = text("
|
|
71
|
+
const _qubitInput = (y: number, subscript?: string): SVGElement => {
|
|
72
|
+
const el: SVGElement = text("", leftPadding, y, 16);
|
|
73
|
+
|
|
74
|
+
// Create the main text node
|
|
75
|
+
const mainText = document.createElementNS(
|
|
76
|
+
"http://www.w3.org/2000/svg",
|
|
77
|
+
"tspan",
|
|
78
|
+
);
|
|
79
|
+
mainText.textContent = "|𝜓";
|
|
80
|
+
|
|
81
|
+
// Create the subscript node if provided
|
|
82
|
+
if (subscript) {
|
|
83
|
+
const subscriptText = document.createElementNS(
|
|
84
|
+
"http://www.w3.org/2000/svg",
|
|
85
|
+
"tspan",
|
|
86
|
+
);
|
|
87
|
+
subscriptText.textContent = subscript;
|
|
88
|
+
subscriptText.setAttribute("baseline-shift", "sub");
|
|
89
|
+
subscriptText.setAttribute("font-size", "65%");
|
|
90
|
+
mainText.appendChild(subscriptText);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Add the closing part of the text
|
|
94
|
+
const closingText = document.createElementNS(
|
|
95
|
+
"http://www.w3.org/2000/svg",
|
|
96
|
+
"tspan",
|
|
97
|
+
);
|
|
98
|
+
closingText.textContent = "⟩";
|
|
99
|
+
|
|
100
|
+
// Append all parts to the main SVG text element
|
|
101
|
+
el.appendChild(mainText);
|
|
102
|
+
el.appendChild(closingText);
|
|
103
|
+
|
|
73
104
|
el.setAttribute("text-anchor", "start");
|
|
74
105
|
el.setAttribute("dominant-baseline", "middle");
|
|
75
106
|
return el;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { RegisterMap } from "../register";
|
|
5
5
|
import { regLineStart } from "../constants";
|
|
6
6
|
import { Metadata, GateType } from "../metadata";
|
|
7
|
-
import { group, line
|
|
7
|
+
import { group, line } from "./formatUtils";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Generate the SVG representation of the qubit register wires in `registers` and the classical wires
|
|
@@ -24,7 +24,15 @@ const formatRegisters = (
|
|
|
24
24
|
const formattedRegs: SVGElement[] = [];
|
|
25
25
|
// Render qubit wires
|
|
26
26
|
for (const qId in registers) {
|
|
27
|
-
formattedRegs.push(
|
|
27
|
+
formattedRegs.push(
|
|
28
|
+
line(
|
|
29
|
+
regLineStart,
|
|
30
|
+
registers[qId].y,
|
|
31
|
+
endX,
|
|
32
|
+
registers[qId].y,
|
|
33
|
+
"qubit-wire",
|
|
34
|
+
),
|
|
35
|
+
);
|
|
28
36
|
}
|
|
29
37
|
// Render classical wires
|
|
30
38
|
measureGates.forEach(({ type, x, targetsY, controlsY }) => {
|
|
@@ -34,7 +42,7 @@ const formatRegisters = (
|
|
|
34
42
|
formattedRegs.push(_classicalRegister(x, gateY, endX, y));
|
|
35
43
|
});
|
|
36
44
|
});
|
|
37
|
-
return group(formattedRegs);
|
|
45
|
+
return group(formattedRegs, { class: "wires" });
|
|
38
46
|
};
|
|
39
47
|
|
|
40
48
|
/**
|
|
@@ -89,30 +97,4 @@ const _classicalRegister = (
|
|
|
89
97
|
return group([vLine1, vLine2, hLine1, hLine2]);
|
|
90
98
|
};
|
|
91
99
|
|
|
92
|
-
|
|
93
|
-
* Generates the SVG representation of a qubit register.
|
|
94
|
-
*
|
|
95
|
-
* @param qId Qubit register index.
|
|
96
|
-
* @param endX End x coord.
|
|
97
|
-
* @param y y coord of wire.
|
|
98
|
-
* @param labelOffset y offset for wire label.
|
|
99
|
-
*
|
|
100
|
-
* @returns SVG representation of the given qubit register.
|
|
101
|
-
*/
|
|
102
|
-
const _qubitRegister = (
|
|
103
|
-
qId: number,
|
|
104
|
-
endX: number,
|
|
105
|
-
y: number,
|
|
106
|
-
labelOffset = 16,
|
|
107
|
-
): SVGElement => {
|
|
108
|
-
const wire: SVGElement = line(regLineStart, y, endX, y);
|
|
109
|
-
|
|
110
|
-
const label: SVGElement = text(`q${qId}`, regLineStart, y - labelOffset);
|
|
111
|
-
label.setAttribute("dominant-baseline", "hanging");
|
|
112
|
-
label.setAttribute("text-anchor", "start");
|
|
113
|
-
label.setAttribute("font-size", "75%");
|
|
114
|
-
|
|
115
|
-
return group([wire, label]);
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
export { formatRegisters, _classicalRegister, _qubitRegister };
|
|
100
|
+
export { formatRegisters };
|
package/ux/circuit-vis/index.ts
CHANGED
|
@@ -2,29 +2,34 @@
|
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
|
|
4
4
|
import { Sqore } from "./sqore";
|
|
5
|
-
import {
|
|
6
|
-
import { StyleConfig } from "./styles";
|
|
5
|
+
import { CircuitGroup } from "./circuit";
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* Render `circuit` into `container` at the specified layer depth.
|
|
10
9
|
*
|
|
11
|
-
* @param
|
|
10
|
+
* @param circuitGroup Group of circuits to be visualized.
|
|
12
11
|
* @param container HTML element for rendering visualization into.
|
|
13
|
-
* @param style Custom visualization style.
|
|
14
12
|
* @param renderDepth Initial layer depth at which to render gates.
|
|
13
|
+
* @param isEditable Whether the circuit is editable.
|
|
14
|
+
* @param editCallback Callback function to be called when the circuit is edited.
|
|
15
15
|
*/
|
|
16
16
|
export const draw = (
|
|
17
|
-
|
|
17
|
+
circuitGroup: CircuitGroup,
|
|
18
18
|
container: HTMLElement,
|
|
19
|
-
style: StyleConfig | string = {},
|
|
20
19
|
renderDepth = 0,
|
|
20
|
+
isEditable = false,
|
|
21
|
+
editCallback?: (circuitGroup: CircuitGroup) => void,
|
|
21
22
|
): void => {
|
|
22
|
-
const sqore = new Sqore(
|
|
23
|
+
const sqore = new Sqore(circuitGroup, isEditable, editCallback);
|
|
23
24
|
sqore.draw(container, renderDepth);
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
export { STYLES } from "./styles";
|
|
27
|
-
|
|
28
27
|
// Export types
|
|
29
|
-
export type {
|
|
30
|
-
|
|
28
|
+
export type {
|
|
29
|
+
CircuitGroup,
|
|
30
|
+
Circuit,
|
|
31
|
+
ComponentGrid,
|
|
32
|
+
Column,
|
|
33
|
+
Qubit,
|
|
34
|
+
Operation,
|
|
35
|
+
} from "./circuit";
|
|
@@ -15,6 +15,8 @@ export enum GateType {
|
|
|
15
15
|
Swap,
|
|
16
16
|
/** X gate. */
|
|
17
17
|
X,
|
|
18
|
+
/** |0〉 or |1〉 gate. */
|
|
19
|
+
Ket,
|
|
18
20
|
/** Single/multi qubit unitary gate. */
|
|
19
21
|
Unitary,
|
|
20
22
|
/** Single/multi controlled unitary gate. */
|
|
@@ -50,7 +52,7 @@ export interface Metadata {
|
|
|
50
52
|
/** Gate width. */
|
|
51
53
|
width: number;
|
|
52
54
|
/** Children operations as part of group. */
|
|
53
|
-
children?:
|
|
55
|
+
children?: Metadata[][] | Metadata[][][];
|
|
54
56
|
/** Custom data attributes to attach to gate element. */
|
|
55
57
|
dataAttributes?: DataAttributes;
|
|
56
58
|
}
|