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
package/ux/circuit-vis/sqore.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
36
|
+
* Defines the mapping of unique location to each operation. Used for enabling
|
|
28
37
|
* interactivity.
|
|
29
38
|
*/
|
|
30
39
|
type GateRegistry = {
|
|
31
|
-
[
|
|
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
|
|
52
|
+
* Initializes Sqore object.
|
|
44
53
|
*
|
|
45
|
-
* @param
|
|
46
|
-
* @param
|
|
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(
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
98
|
+
const _circuit: Circuit =
|
|
99
|
+
circuit ?? JSON.parse(JSON.stringify(this.circuit));
|
|
100
|
+
const renderDepth = this.renderDepth;
|
|
65
101
|
|
|
66
|
-
// Assign unique
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
72
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
|
82
|
-
|
|
125
|
+
const location: string =
|
|
126
|
+
_circuit.componentGrid[0].components[0].dataAttributes["location"];
|
|
127
|
+
this.expandOperation(_circuit.componentGrid, location);
|
|
83
128
|
}
|
|
84
129
|
|
|
85
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
*
|
|
158
|
+
* Sets the viewBox attribute of the SVG element to enable zooming and panning.
|
|
110
159
|
*
|
|
111
|
-
* @param
|
|
112
|
-
* @param circuit Circuit object to be rendered.
|
|
160
|
+
* @param svg The SVG element to set the viewBox for.
|
|
113
161
|
*/
|
|
114
|
-
private
|
|
115
|
-
//
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
|
|
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 = (
|
|
186
|
+
const flatten = (metadata: Metadata[][]): Metadata[] => {
|
|
141
187
|
const result: Metadata[] = [];
|
|
142
|
-
add(result,
|
|
188
|
+
metadata.forEach((col) => col.forEach((g) => add(result, g)));
|
|
143
189
|
return result;
|
|
144
190
|
};
|
|
145
191
|
|
|
146
|
-
const { qubits,
|
|
192
|
+
const { qubits, componentGrid } = circuit;
|
|
147
193
|
const { qubitWires, registers, svgHeight } = formatInputs(qubits);
|
|
148
|
-
const {
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
|
198
|
-
* The operation is assigned the
|
|
199
|
-
* the
|
|
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
|
|
261
|
+
* @param location: Location to assign to `operation`.
|
|
203
262
|
*
|
|
204
263
|
*/
|
|
205
|
-
private fillGateRegistry(operation: Operation,
|
|
264
|
+
private fillGateRegistry(operation: Operation, location: string): void {
|
|
206
265
|
if (operation.dataAttributes == null) operation.dataAttributes = {};
|
|
207
|
-
operation.dataAttributes["
|
|
266
|
+
operation.dataAttributes["location"] = location;
|
|
208
267
|
// By default, operations cannot be zoomed-out
|
|
209
268
|
operation.dataAttributes["zoom-out"] = "false";
|
|
210
|
-
this.gateRegistry[
|
|
211
|
-
operation.children?.forEach((
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
|
287
|
+
* @param componentGrid Circuit components.
|
|
227
288
|
* @param renderDepth Initial layer depth at which to render gates.
|
|
228
289
|
*
|
|
229
|
-
* @returns
|
|
290
|
+
* @returns Grid of components at or below specified depth.
|
|
230
291
|
*/
|
|
231
292
|
private selectOpsAtDepth(
|
|
232
|
-
|
|
293
|
+
componentGrid: ComponentGrid,
|
|
233
294
|
renderDepth: number,
|
|
234
|
-
):
|
|
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
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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-
|
|
403
|
+
ctrl.parentElement?.getAttribute("data-location");
|
|
322
404
|
if (typeof gateId == "string") {
|
|
323
405
|
if (ctrl.classList.contains("gate-collapse")) {
|
|
324
|
-
this.collapseOperation(circuit.
|
|
406
|
+
this.collapseOperation(circuit.componentGrid, gateId);
|
|
325
407
|
} else if (ctrl.classList.contains("gate-expand")) {
|
|
326
|
-
this.expandOperation(circuit.
|
|
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
|
|
340
|
-
* @param
|
|
421
|
+
* @param componentGrid Grid of circuit components.
|
|
422
|
+
* @param location Location of operation to expand.
|
|
341
423
|
*
|
|
342
424
|
*/
|
|
343
|
-
private expandOperation(
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
op.dataAttributes
|
|
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
|
|
360
|
-
* @param
|
|
446
|
+
* @param componentGrid Grid of circuit components.
|
|
447
|
+
* @param parentLoc Location of operation to collapse.
|
|
361
448
|
*
|
|
362
449
|
*/
|
|
363
|
-
private collapseOperation(
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
op.
|
|
372
|
-
|
|
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
|
}
|