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
|
@@ -8,222 +8,118 @@ import {
|
|
|
8
8
|
controlBtnOffset,
|
|
9
9
|
groupBoxPadding,
|
|
10
10
|
} from "./constants";
|
|
11
|
-
import { Operation, ConditionalRender } from "./circuit";
|
|
11
|
+
import { ComponentGrid, Operation, ConditionalRender } from "./circuit";
|
|
12
12
|
import { Metadata, GateType } from "./metadata";
|
|
13
|
-
import { Register, RegisterMap
|
|
13
|
+
import { Register, RegisterMap } from "./register";
|
|
14
14
|
import { getGateWidth } from "./utils";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* Takes in a
|
|
17
|
+
* Takes in a component grid and maps the operations to `metadata` objects which
|
|
18
18
|
* contains information for formatting the corresponding SVG.
|
|
19
19
|
*
|
|
20
|
-
* @param
|
|
20
|
+
* @param componentGrid Grid of circuit components.
|
|
21
21
|
* @param registers Mapping from qubit IDs to register metadata.
|
|
22
22
|
*
|
|
23
|
-
* @returns An object containing `
|
|
23
|
+
* @returns An object containing `metadataArray` (2D Array of Metadata objects) and
|
|
24
24
|
* `svgWidth` which is the width of the entire SVG.
|
|
25
25
|
*/
|
|
26
26
|
const processOperations = (
|
|
27
|
-
|
|
27
|
+
componentGrid: ComponentGrid,
|
|
28
28
|
registers: RegisterMap,
|
|
29
|
-
): {
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const groupedOps: number[][] = _groupOperations(operations, registers);
|
|
34
|
-
|
|
35
|
-
// Align operations on multiple registers
|
|
36
|
-
const alignedOps: (number | null)[][] = _alignOps(groupedOps);
|
|
37
|
-
|
|
38
|
-
// Maintain widths of each column to account for variable-sized gates
|
|
39
|
-
const numColumns: number = Math.max(
|
|
40
|
-
0,
|
|
41
|
-
...alignedOps.map((ops) => ops.length),
|
|
42
|
-
);
|
|
29
|
+
): { metadataArray: Metadata[][]; svgWidth: number } => {
|
|
30
|
+
if (componentGrid.length === 0)
|
|
31
|
+
return { metadataArray: [], svgWidth: startX };
|
|
32
|
+
const numColumns: number = componentGrid.length;
|
|
43
33
|
const columnsWidths: number[] = new Array(numColumns).fill(minGateWidth);
|
|
44
34
|
|
|
45
35
|
// Get classical registers and their starting column index
|
|
46
|
-
const classicalRegs: [number, Register][] =
|
|
47
|
-
|
|
48
|
-
alignedOps,
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
// Keep track of which ops are already seen to avoid duplicate rendering
|
|
52
|
-
const visited: { [opIdx: number]: boolean } = {};
|
|
36
|
+
const classicalRegs: [number, Register][] =
|
|
37
|
+
_getClassicalRegStart(componentGrid);
|
|
53
38
|
|
|
54
39
|
// Map operation index to gate metadata for formatting later
|
|
55
|
-
const opsMetadata: Metadata[][] =
|
|
56
|
-
|
|
57
|
-
let op: Operation | null = null;
|
|
58
|
-
|
|
59
|
-
// eslint-disable-next-line no-prototype-builtins
|
|
60
|
-
if (opIdx != null && !visited.hasOwnProperty(opIdx)) {
|
|
61
|
-
op = operations[opIdx];
|
|
62
|
-
visited[opIdx] = true;
|
|
63
|
-
}
|
|
64
|
-
|
|
40
|
+
const opsMetadata: Metadata[][] = componentGrid.map((col, colIndex) =>
|
|
41
|
+
col.components.map((op) => {
|
|
65
42
|
const metadata: Metadata = _opToMetadata(op, registers);
|
|
66
43
|
|
|
67
44
|
if (
|
|
68
45
|
op != null &&
|
|
69
|
-
[GateType.Unitary, GateType.ControlledUnitary].includes(
|
|
46
|
+
[GateType.Unitary, GateType.Ket, GateType.ControlledUnitary].includes(
|
|
47
|
+
metadata.type,
|
|
48
|
+
)
|
|
70
49
|
) {
|
|
71
50
|
// If gate is a unitary type, split targetsY into groups if there
|
|
72
51
|
// is a classical register between them for rendering
|
|
73
52
|
|
|
74
53
|
// Get y coordinates of classical registers in the same column as this operation
|
|
75
54
|
const classicalRegY: number[] = classicalRegs
|
|
76
|
-
|
|
77
|
-
.
|
|
78
|
-
|
|
79
|
-
.map(([_, reg]) => {
|
|
80
|
-
if (reg.cId == null)
|
|
55
|
+
.filter(([regCol]) => regCol <= colIndex)
|
|
56
|
+
.map(([, reg]) => {
|
|
57
|
+
if (reg.result == null)
|
|
81
58
|
throw new Error("Could not find cId for classical register.");
|
|
82
|
-
const { children } = registers[reg.
|
|
59
|
+
const { children } = registers[reg.qubit];
|
|
83
60
|
if (children == null)
|
|
84
61
|
throw new Error(
|
|
85
|
-
`Failed to find classical registers for qubit ID ${reg.
|
|
62
|
+
`Failed to find classical registers for qubit ID ${reg.qubit}.`,
|
|
86
63
|
);
|
|
87
|
-
return children[reg.
|
|
64
|
+
return children[reg.result].y;
|
|
88
65
|
});
|
|
89
66
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
67
|
+
let qubits: Register[];
|
|
68
|
+
switch (op.kind) {
|
|
69
|
+
case "unitary":
|
|
70
|
+
qubits = op.targets;
|
|
71
|
+
break;
|
|
72
|
+
case "measurement":
|
|
73
|
+
qubits = op.qubits;
|
|
74
|
+
break;
|
|
75
|
+
case "ket":
|
|
76
|
+
qubits = op.targets;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
metadata.targetsY = _splitTargetsY(qubits, classicalRegY, registers);
|
|
95
81
|
}
|
|
96
82
|
|
|
97
83
|
// Expand column size, if needed
|
|
98
|
-
if (metadata.width > columnsWidths[
|
|
99
|
-
columnsWidths[
|
|
84
|
+
if (metadata.width > columnsWidths[colIndex]) {
|
|
85
|
+
columnsWidths[colIndex] = metadata.width;
|
|
100
86
|
}
|
|
101
87
|
|
|
102
88
|
return metadata;
|
|
103
89
|
}),
|
|
104
90
|
);
|
|
105
91
|
|
|
106
|
-
//
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const metadataList: Metadata[] = opsMetadata
|
|
111
|
-
.flat()
|
|
112
|
-
.filter(({ type }) => type != GateType.Invalid);
|
|
92
|
+
// Filter out invalid gates
|
|
93
|
+
const metadataArray: Metadata[][] = opsMetadata
|
|
94
|
+
.map((col) => col.filter(({ type }) => type != GateType.Invalid))
|
|
95
|
+
.filter((col) => col.length > 0);
|
|
113
96
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Group gates provided by operations into their respective registers.
|
|
119
|
-
*
|
|
120
|
-
* @param operations Array of operations.
|
|
121
|
-
* @param numRegs Total number of registers.
|
|
122
|
-
*
|
|
123
|
-
* @returns 2D array of indices where `groupedOps[i][j]` is the index of the operations
|
|
124
|
-
* at register `i` and column `j` (not yet aligned/padded).
|
|
125
|
-
*/
|
|
126
|
-
const _groupOperations = (
|
|
127
|
-
operations: Operation[],
|
|
128
|
-
registers: RegisterMap,
|
|
129
|
-
): number[][] => {
|
|
130
|
-
// NOTE: We get the max ID instead of just number of keys because there can be a qubit ID that
|
|
131
|
-
// isn't acted upon and thus does not show up as a key in registers.
|
|
132
|
-
const numRegs: number =
|
|
133
|
-
Math.max(-1, ...Object.keys(registers).map(Number)) + 1;
|
|
134
|
-
const groupedOps: number[][] = Array.from(Array(numRegs), () => new Array(0));
|
|
135
|
-
operations.forEach(({ targets, controls }, instrIdx) => {
|
|
136
|
-
const ctrls: Register[] = controls || [];
|
|
137
|
-
const qRegs: Register[] = [...ctrls, ...targets].filter(
|
|
138
|
-
({ type }) => (type || RegisterType.Qubit) === RegisterType.Qubit,
|
|
139
|
-
);
|
|
140
|
-
const qRegIdxList: number[] = qRegs.map(({ qId }) => qId);
|
|
141
|
-
const clsControls: Register[] = ctrls.filter(
|
|
142
|
-
({ type }) => (type || RegisterType.Qubit) === RegisterType.Classical,
|
|
143
|
-
);
|
|
144
|
-
const isClassicallyControlled: boolean = clsControls.length > 0;
|
|
145
|
-
if (!isClassicallyControlled && qRegs.length === 0) return;
|
|
146
|
-
// If operation is classically-controlled, pad all qubit registers. Otherwise, only pad
|
|
147
|
-
// the contiguous range of registers that it covers.
|
|
148
|
-
const minRegIdx: number = isClassicallyControlled
|
|
149
|
-
? 0
|
|
150
|
-
: Math.min(...qRegIdxList);
|
|
151
|
-
const maxRegIdx: number = isClassicallyControlled
|
|
152
|
-
? numRegs - 1
|
|
153
|
-
: Math.max(...qRegIdxList);
|
|
154
|
-
// Add operation also to registers that are in-between target registers
|
|
155
|
-
// so that other gates won't render in the middle.
|
|
156
|
-
for (let i = minRegIdx; i <= maxRegIdx; i++) {
|
|
157
|
-
groupedOps[i].push(instrIdx);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
return groupedOps;
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Aligns operations by padding registers with `null`s to make sure that multiqubit
|
|
165
|
-
* gates are in the same column.
|
|
166
|
-
* e.g. ---[x]---[x]--
|
|
167
|
-
* ----------|---
|
|
168
|
-
*
|
|
169
|
-
* @param ops 2D array of operations. Each row represents a register
|
|
170
|
-
* and the operations acting on it (in-order).
|
|
171
|
-
*
|
|
172
|
-
* @returns 2D array of aligned operations padded with `null`s.
|
|
173
|
-
*/
|
|
174
|
-
const _alignOps = (ops: number[][]): (number | null)[][] => {
|
|
175
|
-
let maxNumOps: number = Math.max(0, ...ops.map((regOps) => regOps.length));
|
|
176
|
-
let col = 0;
|
|
177
|
-
// Deep copy ops to be returned as paddedOps
|
|
178
|
-
const paddedOps: (number | null)[][] = JSON.parse(JSON.stringify(ops));
|
|
179
|
-
while (col < maxNumOps) {
|
|
180
|
-
for (let regIdx = 0; regIdx < paddedOps.length; regIdx++) {
|
|
181
|
-
const reg: (number | null)[] = paddedOps[regIdx];
|
|
182
|
-
if (reg.length <= col) continue;
|
|
183
|
-
|
|
184
|
-
// Should never be null (nulls are only padded to previous columns)
|
|
185
|
-
const opIdx: number | null = reg[col];
|
|
186
|
-
|
|
187
|
-
// Get position of gate
|
|
188
|
-
const targetsPos: number[] = paddedOps.map((regOps) =>
|
|
189
|
-
regOps.indexOf(opIdx),
|
|
190
|
-
);
|
|
191
|
-
const gatePos: number = Math.max(-1, ...targetsPos);
|
|
97
|
+
// Fill in x coord of each gate
|
|
98
|
+
const endX: number = _fillMetadataX(metadataArray, columnsWidths);
|
|
192
99
|
|
|
193
|
-
|
|
194
|
-
if (col < gatePos) {
|
|
195
|
-
paddedOps[regIdx].splice(col, 0, null);
|
|
196
|
-
maxNumOps = Math.max(maxNumOps, paddedOps[regIdx].length);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
col++;
|
|
200
|
-
}
|
|
201
|
-
return paddedOps;
|
|
100
|
+
return { metadataArray, svgWidth: endX };
|
|
202
101
|
};
|
|
203
102
|
|
|
204
103
|
/**
|
|
205
104
|
* Retrieves the starting index of each classical register.
|
|
206
105
|
*
|
|
207
|
-
* @param
|
|
208
|
-
* @param idxList 2D array of aligned operation indices.
|
|
106
|
+
* @param componentGrid Grid of circuit components.
|
|
209
107
|
*
|
|
210
108
|
* @returns Array of classical register and their starting column indices in the form [[column, register]].
|
|
211
109
|
*/
|
|
212
110
|
const _getClassicalRegStart = (
|
|
213
|
-
|
|
214
|
-
idxList: (number | null)[][],
|
|
111
|
+
componentGrid: ComponentGrid,
|
|
215
112
|
): [number, Register][] => {
|
|
216
113
|
const clsRegs: [number, Register][] = [];
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
(reg) => reg.type === RegisterType.Classical,
|
|
114
|
+
componentGrid.forEach((col, colIndex) => {
|
|
115
|
+
col.components.forEach((op) => {
|
|
116
|
+
if (op.kind === "measurement") {
|
|
117
|
+
const resultRegs: Register[] = op.results.filter(
|
|
118
|
+
({ result }) => result !== undefined,
|
|
223
119
|
);
|
|
224
|
-
|
|
120
|
+
resultRegs.forEach((reg) => clsRegs.push([colIndex, reg]));
|
|
225
121
|
}
|
|
226
|
-
}
|
|
122
|
+
});
|
|
227
123
|
});
|
|
228
124
|
return clsRegs;
|
|
229
125
|
};
|
|
@@ -252,17 +148,33 @@ const _opToMetadata = (
|
|
|
252
148
|
|
|
253
149
|
if (op == null) return metadata;
|
|
254
150
|
|
|
151
|
+
let isAdjoint: boolean;
|
|
152
|
+
let controls: Register[] | undefined;
|
|
153
|
+
let targets: Register[];
|
|
154
|
+
switch (op.kind) {
|
|
155
|
+
case "measurement":
|
|
156
|
+
isAdjoint = false;
|
|
157
|
+
controls = op.qubits;
|
|
158
|
+
targets = op.results;
|
|
159
|
+
break;
|
|
160
|
+
case "unitary":
|
|
161
|
+
isAdjoint = op.isAdjoint ?? false;
|
|
162
|
+
controls = op.controls;
|
|
163
|
+
targets = op.targets;
|
|
164
|
+
break;
|
|
165
|
+
case "ket":
|
|
166
|
+
isAdjoint = false;
|
|
167
|
+
controls = [];
|
|
168
|
+
targets = op.targets;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
|
|
255
172
|
const {
|
|
256
173
|
gate,
|
|
174
|
+
args,
|
|
175
|
+
children,
|
|
257
176
|
dataAttributes,
|
|
258
|
-
displayArgs,
|
|
259
|
-
isMeasurement,
|
|
260
177
|
isConditional,
|
|
261
|
-
isControlled,
|
|
262
|
-
isAdjoint,
|
|
263
|
-
controls,
|
|
264
|
-
targets,
|
|
265
|
-
children,
|
|
266
178
|
conditionalRender,
|
|
267
179
|
} = op;
|
|
268
180
|
|
|
@@ -278,19 +190,27 @@ const _opToMetadata = (
|
|
|
278
190
|
);
|
|
279
191
|
|
|
280
192
|
// Gates to display when classical bit is 0.
|
|
281
|
-
const onZeroOps:
|
|
282
|
-
(
|
|
283
|
-
|
|
193
|
+
const onZeroOps: ComponentGrid = children
|
|
194
|
+
.map((col) => ({
|
|
195
|
+
components: col.components.filter(
|
|
196
|
+
(op) => op.conditionalRender === ConditionalRender.OnZero,
|
|
197
|
+
),
|
|
198
|
+
}))
|
|
199
|
+
.filter((col) => col.components.length > 0);
|
|
284
200
|
let childrenInstrs = processOperations(onZeroOps, registers);
|
|
285
|
-
const zeroGates: Metadata[] = childrenInstrs.
|
|
201
|
+
const zeroGates: Metadata[][] = childrenInstrs.metadataArray;
|
|
286
202
|
const zeroChildWidth: number = childrenInstrs.svgWidth;
|
|
287
203
|
|
|
288
204
|
// Gates to display when classical bit is 1.
|
|
289
|
-
const onOneOps:
|
|
290
|
-
(
|
|
291
|
-
|
|
205
|
+
const onOneOps: ComponentGrid = children
|
|
206
|
+
.map((col) => ({
|
|
207
|
+
components: col.components.filter(
|
|
208
|
+
(op) => op.conditionalRender !== ConditionalRender.OnZero,
|
|
209
|
+
),
|
|
210
|
+
}))
|
|
211
|
+
.filter((col) => col.components.length > 0);
|
|
292
212
|
childrenInstrs = processOperations(onOneOps, registers);
|
|
293
|
-
const oneGates: Metadata[] = childrenInstrs.
|
|
213
|
+
const oneGates: Metadata[][] = childrenInstrs.metadataArray;
|
|
294
214
|
const oneChildWidth: number = childrenInstrs.svgWidth;
|
|
295
215
|
|
|
296
216
|
// Subtract startX (left-side) and 2*gatePadding (right-side) from nested child gates width
|
|
@@ -311,23 +231,23 @@ const _opToMetadata = (
|
|
|
311
231
|
conditionalRender == ConditionalRender.AsGroup &&
|
|
312
232
|
(children?.length || 0) > 0
|
|
313
233
|
) {
|
|
314
|
-
const childrenInstrs = processOperations(
|
|
315
|
-
children as Operation[],
|
|
316
|
-
registers,
|
|
317
|
-
);
|
|
234
|
+
const childrenInstrs = processOperations(children!, registers);
|
|
318
235
|
metadata.type = GateType.Group;
|
|
319
|
-
metadata.children = childrenInstrs.
|
|
236
|
+
metadata.children = childrenInstrs.metadataArray;
|
|
320
237
|
// _zoomButton function in gateFormatter.ts relies on
|
|
321
238
|
// 'expanded' attribute to render zoom button
|
|
322
239
|
metadata.dataAttributes = { expanded: "true" };
|
|
323
240
|
// Subtract startX (left-side) and add inner box padding (minus nested gate padding) for dashed box
|
|
324
241
|
metadata.width =
|
|
325
242
|
childrenInstrs.svgWidth - startX + (groupBoxPadding - gatePadding) * 2;
|
|
326
|
-
} else if (
|
|
243
|
+
} else if (op.kind === "measurement") {
|
|
327
244
|
metadata.type = GateType.Measure;
|
|
245
|
+
} else if (op.kind === "ket") {
|
|
246
|
+
metadata.type = GateType.Ket;
|
|
247
|
+
metadata.label = gate;
|
|
328
248
|
} else if (gate === "SWAP") {
|
|
329
249
|
metadata.type = GateType.Swap;
|
|
330
|
-
} else if (
|
|
250
|
+
} else if (controls && controls.length > 0) {
|
|
331
251
|
metadata.type = gate === "X" ? GateType.Cnot : GateType.ControlledUnitary;
|
|
332
252
|
metadata.label = gate;
|
|
333
253
|
} else if (gate === "X") {
|
|
@@ -343,7 +263,8 @@ const _opToMetadata = (
|
|
|
343
263
|
if (isAdjoint && metadata.label.length > 0) metadata.label += "'";
|
|
344
264
|
|
|
345
265
|
// If gate has extra arguments, display them
|
|
346
|
-
|
|
266
|
+
// For now, we only display the first argument
|
|
267
|
+
if (args !== undefined && args.length > 0) metadata.displayArgs = args[0];
|
|
347
268
|
|
|
348
269
|
// Set gate width
|
|
349
270
|
metadata.width = getGateWidth(metadata);
|
|
@@ -364,30 +285,22 @@ const _opToMetadata = (
|
|
|
364
285
|
* @returns The y coord of give register.
|
|
365
286
|
*/
|
|
366
287
|
const _getRegY = (reg: Register, registers: RegisterMap): number => {
|
|
367
|
-
const {
|
|
288
|
+
const { qubit: qId, result } = reg;
|
|
368
289
|
if (!Object.prototype.hasOwnProperty.call(registers, qId))
|
|
369
290
|
throw new Error(`ERROR: Qubit register with ID ${qId} not found.`);
|
|
370
291
|
const { y, children } = registers[qId];
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
);
|
|
384
|
-
if (children.length <= cId)
|
|
385
|
-
throw new Error(
|
|
386
|
-
`ERROR: Classical register ID ${cId} invalid for qubit ID ${qId} with ${children.length} classical register(s).`,
|
|
387
|
-
);
|
|
388
|
-
return children[cId].y;
|
|
389
|
-
default:
|
|
390
|
-
throw new Error(`ERROR: Unknown register type ${type}.`);
|
|
292
|
+
if (result == null) {
|
|
293
|
+
return y;
|
|
294
|
+
} else {
|
|
295
|
+
if (children == null)
|
|
296
|
+
throw new Error(
|
|
297
|
+
`ERROR: No classical registers found for qubit ID ${qId}.`,
|
|
298
|
+
);
|
|
299
|
+
if (children.length <= result)
|
|
300
|
+
throw new Error(
|
|
301
|
+
`ERROR: Classical register ID ${result} invalid for qubit ID ${qId} with ${children.length} classical register(s).`,
|
|
302
|
+
);
|
|
303
|
+
return children[result].y;
|
|
391
304
|
}
|
|
392
305
|
};
|
|
393
306
|
|
|
@@ -416,8 +329,9 @@ const _splitTargetsY = (
|
|
|
416
329
|
// Sort targets and classicalRegY by ascending y value
|
|
417
330
|
targets = targets.slice();
|
|
418
331
|
targets.sort((a, b) => {
|
|
419
|
-
const posDiff: number = qIdPosition[a.
|
|
420
|
-
if (posDiff === 0 && a.
|
|
332
|
+
const posDiff: number = qIdPosition[a.qubit] - qIdPosition[b.qubit];
|
|
333
|
+
if (posDiff === 0 && a.result != null && b.result != null)
|
|
334
|
+
return a.result - b.result;
|
|
421
335
|
else return posDiff;
|
|
422
336
|
});
|
|
423
337
|
classicalRegY = classicalRegY.slice();
|
|
@@ -428,7 +342,7 @@ const _splitTargetsY = (
|
|
|
428
342
|
|
|
429
343
|
return targets.reduce((groups: number[][], target: Register) => {
|
|
430
344
|
const y = _getRegY(target, registers);
|
|
431
|
-
const pos = qIdPosition[target.
|
|
345
|
+
const pos = qIdPosition[target.qubit];
|
|
432
346
|
|
|
433
347
|
// Split into new group if one of the following holds:
|
|
434
348
|
// 1. First target register
|
|
@@ -465,19 +379,17 @@ const _fillMetadataX = (
|
|
|
465
379
|
opsMetadata: Metadata[][],
|
|
466
380
|
columnWidths: number[],
|
|
467
381
|
): number => {
|
|
468
|
-
let
|
|
382
|
+
let endX: number = startX;
|
|
469
383
|
|
|
470
384
|
const colStartX: number[] = columnWidths.map((width) => {
|
|
471
|
-
const x: number =
|
|
472
|
-
|
|
385
|
+
const x: number = endX;
|
|
386
|
+
endX += width + gatePadding * 2;
|
|
473
387
|
return x;
|
|
474
388
|
});
|
|
475
389
|
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
regOps.forEach((metadata, col) => {
|
|
480
|
-
const x = colStartX[col];
|
|
390
|
+
opsMetadata.forEach((col, colIndex) =>
|
|
391
|
+
col.forEach((metadata) => {
|
|
392
|
+
const x = colStartX[colIndex];
|
|
481
393
|
switch (metadata.type) {
|
|
482
394
|
case GateType.ClassicalControlled:
|
|
483
395
|
case GateType.Group:
|
|
@@ -497,40 +409,32 @@ const _fillMetadataX = (
|
|
|
497
409
|
break;
|
|
498
410
|
|
|
499
411
|
default:
|
|
500
|
-
metadata.x = x + columnWidths[
|
|
412
|
+
metadata.x = x + columnWidths[colIndex] / 2;
|
|
501
413
|
break;
|
|
502
414
|
}
|
|
503
415
|
}),
|
|
504
416
|
);
|
|
505
417
|
|
|
506
|
-
return endX;
|
|
418
|
+
return endX + gatePadding;
|
|
507
419
|
};
|
|
508
420
|
|
|
509
421
|
/**
|
|
510
422
|
* Offset x coords of nested children operations.
|
|
511
423
|
*
|
|
512
|
-
* @param children 2D array of children metadata.
|
|
424
|
+
* @param children 2D or 3D array of children metadata.
|
|
513
425
|
* @param offset x coord offset.
|
|
514
426
|
*/
|
|
515
427
|
const _offsetChildrenX = (
|
|
516
|
-
children:
|
|
428
|
+
children: Metadata[][] | Metadata[][][] | undefined,
|
|
517
429
|
offset: number,
|
|
518
430
|
): void => {
|
|
519
431
|
if (children == null) return;
|
|
520
|
-
children.
|
|
521
|
-
child
|
|
522
|
-
|
|
432
|
+
children.forEach((col) => {
|
|
433
|
+
col.flat().forEach((child) => {
|
|
434
|
+
child.x += offset;
|
|
435
|
+
_offsetChildrenX(child.children, offset);
|
|
436
|
+
});
|
|
523
437
|
});
|
|
524
438
|
};
|
|
525
439
|
|
|
526
|
-
export {
|
|
527
|
-
processOperations,
|
|
528
|
-
_groupOperations,
|
|
529
|
-
_alignOps,
|
|
530
|
-
_getClassicalRegStart,
|
|
531
|
-
_opToMetadata,
|
|
532
|
-
_getRegY,
|
|
533
|
-
_splitTargetsY,
|
|
534
|
-
_fillMetadataX,
|
|
535
|
-
_offsetChildrenX,
|
|
536
|
-
};
|
|
440
|
+
export { processOperations };
|