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