qsharp-lang 1.26.2-dev → 1.26.3-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/data-structures/circuit.d.ts +0 -15
- package/dist/data-structures/circuit.js +1 -19
- package/dist/katas-content.generated.js +1 -1
- package/dist/katas-content.generated.md.js +1 -1
- package/dist/samples.generated.js +4 -4
- package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
- package/docs/Microsoft.Quantum.Core/Length.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeStart.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/ApplyOperationPowerA.md +1 -1
- package/docs/Std.Canon/ApplyOperationPowerCA.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/ApplyQPE.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/MapPauliAxis.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/BigIntAsInt.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/Complex.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/ConfigureQubitLoss.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/PostSelectZ.md +40 -0
- 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 +2 -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/SX.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/RoundHalfAwayFromZero.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/IsLossResult.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/MResetZChecked.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/EnableMemoryComputeArchitecture.md +1 -1
- package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
- package/docs/Std.ResourceEstimation/LeastRecentlyUsed.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/docs/toc.yml +1 -0
- package/lib/nodejs/qsc_wasm.cjs +1318 -1392
- package/lib/nodejs/qsc_wasm.d.cts +313 -290
- package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.d.ts +388 -364
- package/lib/web/qsc_wasm.js +1346 -1346
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/circuit-vis/circuit.ts +0 -1
- package/ux/circuit-vis/formatters/gateFormatter.ts +111 -86
- package/ux/circuit-vis/formatters/registerFormatter.ts +2 -5
- package/ux/circuit-vis/gateRenderData.ts +10 -3
- package/ux/circuit-vis/panel.ts +1 -0
- package/ux/circuit-vis/process.ts +162 -57
- package/ux/circuit-vis/sqore.ts +34 -28
- package/ux/circuit-vis/utils.ts +2 -1
package/lib/web/qsc_wasm_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
argsFontSize,
|
|
10
10
|
controlCircleRadius,
|
|
11
11
|
controlCircleOffset,
|
|
12
|
-
groupPaddingX,
|
|
13
12
|
groupTopPadding,
|
|
14
13
|
labelPaddingX,
|
|
15
14
|
groupLabelPaddingY,
|
|
@@ -58,11 +57,26 @@ const formatGate = (renderData: GateRenderData): SVGElement => {
|
|
|
58
57
|
switch (type) {
|
|
59
58
|
case GateType.Measure:
|
|
60
59
|
return _createGate([_measure(x, controlsY[0], controlsY)], renderData);
|
|
61
|
-
case GateType.Unitary:
|
|
60
|
+
case GateType.Unitary: {
|
|
61
|
+
let bodyWidth = width;
|
|
62
|
+
let bodyX = x;
|
|
63
|
+
if (renderData.classicalControlIds != null) {
|
|
64
|
+
bodyWidth = width - controlCircleOffset;
|
|
65
|
+
bodyX = x + controlCircleOffset / 2;
|
|
66
|
+
}
|
|
62
67
|
return _createGate(
|
|
63
|
-
[
|
|
68
|
+
[
|
|
69
|
+
_unitary(
|
|
70
|
+
label,
|
|
71
|
+
bodyX,
|
|
72
|
+
targetsY as number[][],
|
|
73
|
+
bodyWidth,
|
|
74
|
+
displayArgs,
|
|
75
|
+
),
|
|
76
|
+
],
|
|
64
77
|
renderData,
|
|
65
78
|
);
|
|
79
|
+
}
|
|
66
80
|
case GateType.X:
|
|
67
81
|
return _createGate([_x(renderData)], renderData);
|
|
68
82
|
case GateType.Ket:
|
|
@@ -76,8 +90,6 @@ const formatGate = (renderData: GateRenderData): SVGElement => {
|
|
|
76
90
|
return _controlledGate(renderData);
|
|
77
91
|
case GateType.Group:
|
|
78
92
|
return _groupedOperations(renderData);
|
|
79
|
-
case GateType.ClassicalControlled:
|
|
80
|
-
return _classicalControlled(renderData);
|
|
81
93
|
default:
|
|
82
94
|
throw new Error(`ERROR: unknown gate (${label}) of type ${type}.`);
|
|
83
95
|
}
|
|
@@ -97,27 +109,38 @@ const _createGate = (
|
|
|
97
109
|
renderData: GateRenderData,
|
|
98
110
|
): SVGElement => {
|
|
99
111
|
const { dataAttributes } = renderData || {};
|
|
112
|
+
const expanded = renderData.isExpanded;
|
|
100
113
|
const attributes: { [attr: string]: string } = { class: "gate" };
|
|
101
114
|
Object.entries(dataAttributes || {}).forEach(
|
|
102
115
|
([attr, val]) => (attributes[`data-${attr}`] = val),
|
|
103
116
|
);
|
|
104
117
|
|
|
118
|
+
const hasClassicalControls =
|
|
119
|
+
renderData.classicalControlIds != null && renderData.controlsY.length > 0;
|
|
120
|
+
const classicalControlElems: SVGElement[] = hasClassicalControls
|
|
121
|
+
? _classicalControls(_gateBoundingBox(renderData).x, renderData)
|
|
122
|
+
: [];
|
|
123
|
+
|
|
105
124
|
// If there's a source location, wrap the gate in an SVG <a> element to make it clickable
|
|
106
125
|
//
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
if (renderData.link && renderData.type
|
|
126
|
+
// Expanded groups contain clickable child gates, so the group itself should not be clickable.
|
|
127
|
+
// Collapsed groups are rendered as a single summary gate and can be clickable.
|
|
128
|
+
if (renderData.link && !(renderData.type === GateType.Group && expanded)) {
|
|
110
129
|
const linkElem = createLinkElement(
|
|
111
130
|
renderData.link.href,
|
|
112
131
|
renderData.link.title,
|
|
113
132
|
);
|
|
114
133
|
|
|
115
|
-
// Add the gate elements as children of the link
|
|
134
|
+
// Add the gate elements as children of the link.
|
|
135
|
+
// If this operation is classically controlled, keep the control circles
|
|
136
|
+
// outside the link so they remain independently interactive.
|
|
116
137
|
for (const e of svgElems) {
|
|
117
138
|
linkElem.appendChild(e);
|
|
118
139
|
}
|
|
119
140
|
|
|
120
|
-
svgElems = [linkElem];
|
|
141
|
+
svgElems = classicalControlElems.concat([linkElem]);
|
|
142
|
+
} else {
|
|
143
|
+
svgElems = classicalControlElems.concat(svgElems);
|
|
121
144
|
}
|
|
122
145
|
|
|
123
146
|
// Zoom button comes last so it's on top of the <a> element if both are present
|
|
@@ -125,7 +148,12 @@ const _createGate = (
|
|
|
125
148
|
const zoomBtn: SVGElement | null = _zoomButton(renderData);
|
|
126
149
|
if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
|
|
127
150
|
|
|
128
|
-
|
|
151
|
+
const gate = group(svgElems, attributes);
|
|
152
|
+
if (hasClassicalControls) {
|
|
153
|
+
gate.classList.add("classically-controlled-group");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return gate;
|
|
129
157
|
};
|
|
130
158
|
|
|
131
159
|
/**
|
|
@@ -142,12 +170,17 @@ const _zoomButton = (renderData: GateRenderData): SVGElement | null => {
|
|
|
142
170
|
|
|
143
171
|
const { x: gateBoundingBoxX, y: gateBoundingBoxY } =
|
|
144
172
|
_gateBoundingBox(renderData);
|
|
145
|
-
|
|
146
|
-
dataAttributes = dataAttributes || {};
|
|
173
|
+
const expanded = renderData.isExpanded;
|
|
147
174
|
|
|
148
|
-
|
|
175
|
+
// If this operation has classical controls, the overall gate bounding box includes
|
|
176
|
+
// extra space on the left for the control circles. The expand/collapse button should
|
|
177
|
+
// align with the left edge of the gate *body* (dashed box / unitary box), not the
|
|
178
|
+
// outermost bounding box.
|
|
179
|
+
const hasClassicalControls =
|
|
180
|
+
renderData.classicalControlIds != null && renderData.controlsY.length > 0;
|
|
149
181
|
|
|
150
|
-
const x =
|
|
182
|
+
const x =
|
|
183
|
+
gateBoundingBoxX + 2 + (hasClassicalControls ? controlCircleOffset : 0);
|
|
151
184
|
const y = gateBoundingBoxY + 2;
|
|
152
185
|
const circleBorder: SVGElement = circle(x, y, 10);
|
|
153
186
|
|
|
@@ -158,8 +191,8 @@ const _zoomButton = (renderData: GateRenderData): SVGElement | null => {
|
|
|
158
191
|
});
|
|
159
192
|
const elements: SVGElement[] = [circleBorder, minusSign];
|
|
160
193
|
return group(elements, { class: "gate-control gate-collapse" });
|
|
161
|
-
} else if (
|
|
162
|
-
// Create expand button if operation
|
|
194
|
+
} else if (renderData.type === GateType.Group) {
|
|
195
|
+
// Create expand button if operation is a composite/group gate
|
|
163
196
|
const plusSign: SVGElement = createSvgElement("path", {
|
|
164
197
|
d: `M${x},${y - 7} v14 M${x - 7},${y} h14`,
|
|
165
198
|
});
|
|
@@ -600,18 +633,61 @@ const _oplus = (x: number, y: number, wireYs: number[]): SVGElement => {
|
|
|
600
633
|
* @returns SVG representation of gate.
|
|
601
634
|
*/
|
|
602
635
|
const _groupedOperations = (renderData: GateRenderData): SVGElement => {
|
|
603
|
-
const { children, label } = renderData;
|
|
604
|
-
const
|
|
636
|
+
const { children, label, displayArgs, x, targetsY, width } = renderData;
|
|
637
|
+
const expanded = renderData.isExpanded;
|
|
638
|
+
|
|
639
|
+
// Collapsed composite: render as a single summary gate (unitary-style), but keep
|
|
640
|
+
// the GateType as Group so the UI can still offer an expand button.
|
|
641
|
+
if (!expanded) {
|
|
642
|
+
// `targetsY` for groups is typically a flat `number[]` (not split into groups).
|
|
643
|
+
// `_unitary` expects a `number[][]` where each entry is a contiguous set of wires.
|
|
644
|
+
const normalizedTargetsY: number[][] = Array.isArray(targetsY[0])
|
|
645
|
+
? (targetsY as number[][])
|
|
646
|
+
: [targetsY as number[]];
|
|
647
|
+
|
|
648
|
+
let bodyWidth = width;
|
|
649
|
+
let bodyX = x;
|
|
650
|
+
if (renderData.classicalControlIds != null) {
|
|
651
|
+
bodyWidth = width - controlCircleOffset;
|
|
652
|
+
bodyX = x + controlCircleOffset / 2;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
return _createGate(
|
|
656
|
+
[_unitary(label, bodyX, normalizedTargetsY, bodyWidth, displayArgs)],
|
|
657
|
+
renderData,
|
|
658
|
+
);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
const boundingBox = _gateBoundingBox(renderData);
|
|
662
|
+
|
|
663
|
+
const hasClassicalControls =
|
|
664
|
+
renderData.classicalControlIds != null && renderData.controlsY.length > 0;
|
|
665
|
+
|
|
666
|
+
const elems: SVGElement[] = [];
|
|
667
|
+
|
|
668
|
+
let boxX = boundingBox.x;
|
|
669
|
+
let boxWidth = boundingBox.width;
|
|
670
|
+
|
|
671
|
+
if (hasClassicalControls) {
|
|
672
|
+
boxX += controlCircleOffset;
|
|
673
|
+
boxWidth -= controlCircleOffset;
|
|
674
|
+
}
|
|
605
675
|
|
|
606
676
|
// Draw dashed box around children gates
|
|
607
|
-
const
|
|
608
|
-
|
|
677
|
+
const boxElem: SVGElement = dashedBox(
|
|
678
|
+
boxX,
|
|
679
|
+
boundingBox.y,
|
|
680
|
+
boxWidth,
|
|
681
|
+
boundingBox.height,
|
|
682
|
+
hasClassicalControls ? "classical-container" : "gate-unitary",
|
|
683
|
+
);
|
|
684
|
+
elems.push(boxElem);
|
|
609
685
|
if (children != null) elems.push(formatGates(children as GateRenderData[][]));
|
|
610
686
|
|
|
611
687
|
const labelText = _labelText(
|
|
612
688
|
label,
|
|
613
|
-
|
|
614
|
-
y + groupTopPadding / 2 + groupLabelPaddingY,
|
|
689
|
+
boxX + labelPaddingX,
|
|
690
|
+
boundingBox.y + groupTopPadding / 2 + groupLabelPaddingY,
|
|
615
691
|
);
|
|
616
692
|
labelText.classList.add("qs-group-label");
|
|
617
693
|
|
|
@@ -628,40 +704,29 @@ const _groupedOperations = (renderData: GateRenderData): SVGElement => {
|
|
|
628
704
|
return _createGate(elems, renderData);
|
|
629
705
|
};
|
|
630
706
|
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
*
|
|
634
|
-
* @param renderData Render data of gate.
|
|
635
|
-
* @param padding Padding within dashed box.
|
|
636
|
-
*
|
|
637
|
-
* @returns SVG representation of gate.
|
|
638
|
-
*/
|
|
639
|
-
const _classicalControlled = (
|
|
707
|
+
const _classicalControls = (
|
|
708
|
+
leftX: number,
|
|
640
709
|
renderData: GateRenderData,
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
const { controlsY, dataAttributes, label, classicalControlIds, children } =
|
|
644
|
-
renderData;
|
|
645
|
-
|
|
646
|
-
const boundingBox = _gateBoundingBox(renderData);
|
|
647
|
-
let { x, width } = boundingBox;
|
|
648
|
-
const { y, height } = boundingBox;
|
|
649
|
-
|
|
710
|
+
): SVGElement[] => {
|
|
711
|
+
const { controlsY, classicalControlIds } = renderData;
|
|
650
712
|
const elems: SVGElement[] = [];
|
|
651
713
|
|
|
652
714
|
for (let i = 0; i < controlsY.length; i++) {
|
|
653
715
|
const controlY = controlsY[i];
|
|
654
716
|
const label = classicalControlIds?.[i] ?? null;
|
|
655
|
-
|
|
656
|
-
|
|
717
|
+
|
|
718
|
+
// Draw control button and attached dashed line to the gate body.
|
|
719
|
+
const controlCircleX: number = leftX + controlCircleRadius;
|
|
657
720
|
const controlCircle: SVGElement = _controlCircle(
|
|
658
721
|
controlCircleX,
|
|
659
722
|
controlY,
|
|
660
723
|
label,
|
|
661
724
|
);
|
|
725
|
+
|
|
662
726
|
const lineY1: number = controlY + controlCircleRadius;
|
|
663
727
|
const lineY2: number =
|
|
664
728
|
controlY + controlCircleRadius + groupBottomPadding / 2;
|
|
729
|
+
|
|
665
730
|
const vertLine: SVGElement = dashedLine(
|
|
666
731
|
controlCircleX,
|
|
667
732
|
lineY1,
|
|
@@ -669,7 +734,8 @@ const _classicalControlled = (
|
|
|
669
734
|
lineY2,
|
|
670
735
|
"classical-line",
|
|
671
736
|
);
|
|
672
|
-
|
|
737
|
+
|
|
738
|
+
const lineEndX = leftX + controlCircleOffset;
|
|
673
739
|
const horLine: SVGElement = dashedLine(
|
|
674
740
|
controlCircleX,
|
|
675
741
|
lineY2,
|
|
@@ -681,48 +747,7 @@ const _classicalControlled = (
|
|
|
681
747
|
elems.push(horLine, vertLine, controlCircle);
|
|
682
748
|
}
|
|
683
749
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
width = width - controlCircleOffset + (padding - groupPaddingX) * 2;
|
|
687
|
-
x += groupPaddingX - padding;
|
|
688
|
-
|
|
689
|
-
// Draw dashed box around children gates
|
|
690
|
-
const box: SVGElement = dashedBox(x, y, width, height, "classical-container");
|
|
691
|
-
|
|
692
|
-
elems.push(box);
|
|
693
|
-
|
|
694
|
-
const labelText = _labelText(
|
|
695
|
-
label,
|
|
696
|
-
x + labelPaddingX,
|
|
697
|
-
y + groupTopPadding / 2 + groupLabelPaddingY,
|
|
698
|
-
);
|
|
699
|
-
labelText.classList.add("qs-group-label");
|
|
700
|
-
|
|
701
|
-
if (renderData.link) {
|
|
702
|
-
const link = createLinkElement(renderData.link.href, renderData.link.title);
|
|
703
|
-
// Make the text element clickable
|
|
704
|
-
labelText.style.pointerEvents = "all";
|
|
705
|
-
link.appendChild(labelText);
|
|
706
|
-
elems.push(link);
|
|
707
|
-
} else {
|
|
708
|
-
elems.push(labelText);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
if (children != null) {
|
|
712
|
-
// Get SVG for gates controlled on 0
|
|
713
|
-
const childrenSvg: SVGElement = formatGates(children);
|
|
714
|
-
elems.push(childrenSvg);
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
const attributes: { [attr: string]: string } = {
|
|
718
|
-
class: `classically-controlled-group`,
|
|
719
|
-
};
|
|
720
|
-
if (dataAttributes != null)
|
|
721
|
-
Object.entries(dataAttributes).forEach(
|
|
722
|
-
([attr, val]) => (attributes[`data-${attr}`] = val),
|
|
723
|
-
);
|
|
724
|
-
|
|
725
|
-
return group(elems, attributes);
|
|
750
|
+
return elems;
|
|
726
751
|
};
|
|
727
752
|
|
|
728
753
|
/**
|
|
@@ -40,13 +40,10 @@ const formatRegisters = (
|
|
|
40
40
|
for (const classical of registers[qId].children || []) {
|
|
41
41
|
const ys: number[] = [];
|
|
42
42
|
for (const gate of allGates.flat()) {
|
|
43
|
-
if (
|
|
44
|
-
gate.type === GateType.Group ||
|
|
45
|
-
gate.type === GateType.ClassicalControlled
|
|
46
|
-
) {
|
|
43
|
+
if (gate.type === GateType.Group) {
|
|
47
44
|
// Don't render classical wires for a group that is expanded - the wires
|
|
48
45
|
// will be coming out of the measurement operations *inside* the group.
|
|
49
|
-
continue;
|
|
46
|
+
if (gate.isExpanded) continue;
|
|
50
47
|
}
|
|
51
48
|
|
|
52
49
|
for (const y of gate.targetsY.flat().filter((y) => y === classical.y)) {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
|
|
4
4
|
import { DataAttributes } from "./circuit.js";
|
|
5
|
+
import { Register } from "./register.js";
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Enum for the various gate operations handled.
|
|
@@ -21,8 +22,6 @@ export enum GateType {
|
|
|
21
22
|
Unitary,
|
|
22
23
|
/** Single/multi controlled unitary gate. */
|
|
23
24
|
ControlledUnitary,
|
|
24
|
-
/** Nested group of classically-controlled gates. */
|
|
25
|
-
ClassicalControlled,
|
|
26
25
|
/** Group of nested gates */
|
|
27
26
|
Group,
|
|
28
27
|
/** Invalid gate. */
|
|
@@ -36,6 +35,8 @@ export enum GateType {
|
|
|
36
35
|
export interface GateRenderData {
|
|
37
36
|
/** Gate type. */
|
|
38
37
|
type: GateType;
|
|
38
|
+
/** Whether this group gate is currently expanded. Always false for non-group gates. */
|
|
39
|
+
isExpanded: boolean;
|
|
39
40
|
/** Centre x coord for gate position. */
|
|
40
41
|
x: number;
|
|
41
42
|
/** Array of y coords of control registers. */
|
|
@@ -61,6 +62,12 @@ export interface GateRenderData {
|
|
|
61
62
|
dataAttributes?: DataAttributes;
|
|
62
63
|
/** Link href and title for clickable gate. */
|
|
63
64
|
link?: { href: string; title: string };
|
|
64
|
-
/** Labels for the classical control registers (
|
|
65
|
+
/** Labels for the classical control registers (when present, this group is rendered with classical controls). */
|
|
65
66
|
classicalControlIds?: (number | null)[];
|
|
67
|
+
/**
|
|
68
|
+
* Classical control registers used by this operation or any descendant.
|
|
69
|
+
* Used by processOperations to decide which classical wires may pass through
|
|
70
|
+
* this gate body without forcing a split.
|
|
71
|
+
*/
|
|
72
|
+
classicalControlRegs?: Register[];
|
|
66
73
|
}
|
package/ux/circuit-vis/panel.ts
CHANGED
|
@@ -285,6 +285,7 @@ const toRenderData = (
|
|
|
285
285
|
const target = y + 1 + gateHeight / 2; // offset by 1 for top padding
|
|
286
286
|
const renderData: GateRenderData = {
|
|
287
287
|
type: GateType.Invalid,
|
|
288
|
+
isExpanded: false,
|
|
288
289
|
x: x + 1 + minGateWidth / 2, // offset by 1 for left padding
|
|
289
290
|
controlsY: [],
|
|
290
291
|
targetsY: [target],
|