qsharp-lang 1.25.3-dev → 1.25.5-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/katas-content.generated.js +1 -1
- package/dist/katas-content.generated.md.js +1 -1
- 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/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/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/lib/nodejs/qsc_wasm.cjs +2 -2
- package/lib/nodejs/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 +2 -1
- package/ux/atoms/index.css +2 -1
- package/ux/atoms/layout.ts +59 -17
- package/ux/circuit-vis/angleExpression.ts +133 -0
- package/ux/circuit-vis/contextMenu.ts +8 -73
- package/ux/circuit-vis/events.ts +41 -1
- package/ux/circuit-vis/formatters/inputFormatter.ts +14 -6
- package/ux/circuit-vis/index.ts +12 -4
- package/ux/circuit-vis/panel.ts +65 -28
- package/ux/circuit-vis/sqore.ts +30 -16
- package/ux/circuit-vis/state-viz/stateViz.ts +763 -0
- package/ux/circuit-vis/state-viz/stateVizController.ts +285 -0
- package/ux/circuit-vis/state-viz/worker/index.ts +18 -0
- package/ux/circuit-vis/state-viz/worker/stateCompute.ts +260 -0
- package/ux/circuit-vis/state-viz/worker/stateVizPrep.ts +152 -0
- package/ux/circuit.tsx +17 -28
- package/ux/data.ts +5 -3
- package/ux/histogram.tsx +11 -5
- package/ux/index.ts +2 -0
- package/ux/qdk-theme.css +15 -0
- package/ux/qsharp-circuit.css +311 -1
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.ResourceEstimation.SingleVariant
|
|
3
3
|
title: SingleVariant function
|
|
4
4
|
description: "Q# SingleVariant function: Used to specify that there's only one execution variant in `BeginEstimateCaching` function"
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: function
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.ResourceEstimation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.ResourceEstimation.TCount
|
|
3
3
|
title: TCount function
|
|
4
4
|
description: "Q# TCount function: Returns a tuple that can be passed to the `AccountForEstimates` operation to specify that the number of the T gates is equal to the `amount`."
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: function
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.ResourceEstimation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.StatePreparation.ApproximatelyPreparePureStateCP
|
|
3
3
|
title: ApproximatelyPreparePureStateCP operation
|
|
4
4
|
description: "Q# ApproximatelyPreparePureStateCP operation: Given a set of coefficients and a big-endian quantum register, prepares a state on that register described by the given coefficients, up to a given approximation tolerance."
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: operation
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.StatePreparation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.StatePreparation.PreparePureStateD
|
|
3
3
|
title: PreparePureStateD operation
|
|
4
4
|
description: "Q# PreparePureStateD operation: Given a set of coefficients and a big-endian quantum register, prepares a state on that register described by the given coefficients."
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: operation
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.StatePreparation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.StatePreparation.PrepareUniformSuperposition
|
|
3
3
|
title: PrepareUniformSuperposition operation
|
|
4
4
|
description: "Q# PrepareUniformSuperposition operation: Prepares a uniform superposition of states that represent integers 0 through `nStates - 1` in a little-endian `qubits` register."
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: operation
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.StatePreparation
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Qdk.Std.TableLookup.Select
|
|
3
3
|
title: Select operation
|
|
4
4
|
description: "Q# Select operation: Performs table lookup using a SELECT network"
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
qsharp.kind: operation
|
|
7
7
|
qsharp.package: __Std__
|
|
8
8
|
qsharp.namespace: Std.TableLookup
|
package/docs/index.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
uid: Microsoft.Quantum.apiref-toc
|
|
3
3
|
title: Q# standard libraries for the Microsoft Quantum Development Kit
|
|
4
4
|
description: Table of contents for the Q# standard libraries for Microsoft Quantum Development Kit
|
|
5
|
-
ms.date: 02/
|
|
5
|
+
ms.date: 02/19/2026
|
|
6
6
|
ms.topic: landing-page
|
|
7
7
|
---
|
|
8
8
|
|
package/lib/nodejs/qsc_wasm.cjs
CHANGED
|
@@ -1570,8 +1570,8 @@ module.exports.__wbindgen_cb_drop = function(arg0) {
|
|
|
1570
1570
|
return ret;
|
|
1571
1571
|
};
|
|
1572
1572
|
|
|
1573
|
-
module.exports.
|
|
1574
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
1573
|
+
module.exports.__wbindgen_closure_wrapper6572 = function(arg0, arg1, arg2) {
|
|
1574
|
+
const ret = makeMutClosure(arg0, arg1, 2071, __wbg_adapter_52);
|
|
1575
1575
|
return addHeapObject(ret);
|
|
1576
1576
|
};
|
|
1577
1577
|
|
|
Binary file
|
package/lib/web/qsc_wasm.js
CHANGED
|
@@ -1525,8 +1525,8 @@ function __wbg_get_imports() {
|
|
|
1525
1525
|
const ret = false;
|
|
1526
1526
|
return ret;
|
|
1527
1527
|
};
|
|
1528
|
-
imports.wbg.
|
|
1529
|
-
const ret = makeMutClosure(arg0, arg1,
|
|
1528
|
+
imports.wbg.__wbindgen_closure_wrapper6572 = function(arg0, arg1, arg2) {
|
|
1529
|
+
const ret = makeMutClosure(arg0, arg1, 2071, __wbg_adapter_52);
|
|
1530
1530
|
return addHeapObject(ret);
|
|
1531
1531
|
};
|
|
1532
1532
|
imports.wbg.__wbindgen_debug_string = function(arg0, arg1) {
|
package/lib/web/qsc_wasm_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qsharp-lang",
|
|
3
3
|
"description": "qsharp language package for quantum development",
|
|
4
|
-
"version": "1.25.
|
|
4
|
+
"version": "1.25.5-dev",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"engines": {
|
|
7
7
|
"node": ">=16.17.0"
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"./debug-service-worker": "./dist/debug-service/worker-browser.js",
|
|
23
23
|
"./katas": "./dist/katas.js",
|
|
24
24
|
"./katas-md": "./dist/katas-md.js",
|
|
25
|
+
"./state-viz": "./ux/circuit-vis/state-viz/worker/index.ts",
|
|
25
26
|
"./ux": "./ux/index.ts",
|
|
26
27
|
"./qdk-theme.css": "./ux/qdk-theme.css"
|
|
27
28
|
},
|
package/ux/atoms/index.css
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
padding: 16px;
|
|
15
15
|
display: flex;
|
|
16
16
|
flex-direction: column;
|
|
17
|
+
position: relative;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
.qs-atoms-app:focus {
|
|
@@ -165,7 +166,7 @@
|
|
|
165
166
|
position: absolute;
|
|
166
167
|
display: none;
|
|
167
168
|
left: 40px;
|
|
168
|
-
top:
|
|
169
|
+
top: 48px;
|
|
169
170
|
border: 1px solid var(--qdk-mid-gray);
|
|
170
171
|
border-radius: 8px;
|
|
171
172
|
background-color: var(--qdk-host-background);
|
package/ux/atoms/layout.ts
CHANGED
|
@@ -10,7 +10,7 @@ type ZoneDataInput = {
|
|
|
10
10
|
kind: "register" | "interaction" | "measurement";
|
|
11
11
|
} & (
|
|
12
12
|
| { rows: number; rowStart?: never; rowEnd?: never }
|
|
13
|
-
| { rowStart: number; rowEnd: number; rows?: never }
|
|
13
|
+
| { rowStart: number; rowEnd: number; skipRows?: number[]; rows?: never }
|
|
14
14
|
);
|
|
15
15
|
|
|
16
16
|
// Normalized internal format always uses rowStart/rowEnd
|
|
@@ -18,6 +18,7 @@ type ZoneData = {
|
|
|
18
18
|
title: string;
|
|
19
19
|
rowStart: number;
|
|
20
20
|
rowEnd: number;
|
|
21
|
+
skipRows?: number[];
|
|
21
22
|
kind: "register" | "interaction" | "measurement";
|
|
22
23
|
};
|
|
23
24
|
|
|
@@ -28,18 +29,31 @@ export type ZoneLayout = {
|
|
|
28
29
|
// e.g. if `skipCols: [0,9]` was provided, then a `move(0,1)` would actually move to visual column 0,
|
|
29
30
|
// and a `move(1,10)` would move to visual column 8.
|
|
30
31
|
skipCols?: number[];
|
|
32
|
+
// If renumber is true, then all rows and columns will be renumbered in the visualization to be sequential starting from 0
|
|
33
|
+
renumber?: boolean;
|
|
31
34
|
};
|
|
32
35
|
|
|
36
|
+
const TWO_QUBIT_GATES = ["CX", "CY", "CZ", "RXX", "RYY", "RZZ", "SWAP"];
|
|
37
|
+
|
|
33
38
|
// Normalize zone data to always use rowStart/rowEnd format
|
|
34
39
|
function normalizeZones(zones: ZoneDataInput[]): ZoneData[] {
|
|
35
40
|
let nextRowStart = 0;
|
|
36
41
|
return zones.map((zone) => {
|
|
37
42
|
if ("rowStart" in zone && zone.rowStart !== undefined) {
|
|
43
|
+
// Verify if skipRows are within the rowStart and rowEnd range
|
|
44
|
+
if (zone.skipRows) {
|
|
45
|
+
if (
|
|
46
|
+
!zone.skipRows.every((r) => r >= zone.rowStart && r <= zone.rowEnd)
|
|
47
|
+
) {
|
|
48
|
+
throw `Invalid skipRows in zone "${zone.title}": all skipRows must be between rowStart and rowEnd`;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
38
51
|
// New format with explicit rowStart/rowEnd
|
|
39
52
|
return {
|
|
40
53
|
title: zone.title,
|
|
41
54
|
rowStart: zone.rowStart,
|
|
42
55
|
rowEnd: zone.rowEnd,
|
|
56
|
+
skipRows: zone.skipRows,
|
|
43
57
|
kind: zone.kind,
|
|
44
58
|
};
|
|
45
59
|
} else {
|
|
@@ -97,6 +111,7 @@ export function fillQubitLocations(
|
|
|
97
111
|
normalizedZones.forEach((zone) => {
|
|
98
112
|
if (zone.kind === "register") {
|
|
99
113
|
for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
|
|
114
|
+
if (zone.skipRows && zone.skipRows.includes(row)) continue;
|
|
100
115
|
for (let col = 0; col < layout.cols; ++col) {
|
|
101
116
|
qubits.push([row, col]);
|
|
102
117
|
}
|
|
@@ -121,7 +136,7 @@ function parseMove(
|
|
|
121
136
|
op: string,
|
|
122
137
|
skipCols?: number[],
|
|
123
138
|
): { qubit: number; to: Location } | undefined {
|
|
124
|
-
const match = op.match(/move
|
|
139
|
+
const match = op.match(/move?\((\d+), (\d+)\) (\d+)/);
|
|
125
140
|
if (match) {
|
|
126
141
|
const to: Location = [
|
|
127
142
|
parseInt(match[1]),
|
|
@@ -134,15 +149,15 @@ function parseMove(
|
|
|
134
149
|
|
|
135
150
|
function parseGate(
|
|
136
151
|
op: string,
|
|
137
|
-
): { gate: string;
|
|
138
|
-
const match = op.match(/(\w+)\s*(\(.*\))? (\d+)/);
|
|
152
|
+
): { gate: string; qubits: number[]; arg?: string } | undefined {
|
|
153
|
+
const match = op.match(/(\w+)\s*(\(.*\))? ([\d,\s]+)/);
|
|
139
154
|
if (match) {
|
|
140
155
|
const gate = match[1];
|
|
141
|
-
const
|
|
156
|
+
const qubits = match[3].split(",").map((s) => parseInt(s.trim()));
|
|
142
157
|
const arg = match[2]
|
|
143
158
|
? match[2].substring(1, match[2].length - 2)
|
|
144
159
|
: undefined;
|
|
145
|
-
return { gate,
|
|
160
|
+
return { gate, qubits, arg };
|
|
146
161
|
}
|
|
147
162
|
}
|
|
148
163
|
|
|
@@ -347,7 +362,8 @@ export class Layout {
|
|
|
347
362
|
this.effectiveCols = layout.cols - (layout.skipCols?.length ?? 0);
|
|
348
363
|
|
|
349
364
|
const totalRows = this.normalizedZones.reduce(
|
|
350
|
-
(prev, curr) =>
|
|
365
|
+
(prev, curr) =>
|
|
366
|
+
prev + (curr.rowEnd - curr.rowStart + 1) - (curr.skipRows?.length ?? 0),
|
|
351
367
|
0,
|
|
352
368
|
);
|
|
353
369
|
|
|
@@ -365,11 +381,14 @@ export class Layout {
|
|
|
365
381
|
// Maps absolute row numbers to visual Y offsets
|
|
366
382
|
this.rowOffsetMap = new Map();
|
|
367
383
|
let nextOffset = zoneSpacing;
|
|
384
|
+
let globalRowIndex = 0;
|
|
368
385
|
this.normalizedZones.forEach((zone, index) => {
|
|
369
|
-
this.renderZone(index, nextOffset);
|
|
386
|
+
globalRowIndex = this.renderZone(index, nextOffset, globalRowIndex);
|
|
370
387
|
for (let row = zone.rowStart; row <= zone.rowEnd; ++row) {
|
|
371
|
-
|
|
372
|
-
|
|
388
|
+
if (!zone.skipRows?.includes(row)) {
|
|
389
|
+
this.rowOffsetMap.set(row, nextOffset);
|
|
390
|
+
nextOffset += qubitSize;
|
|
391
|
+
}
|
|
373
392
|
}
|
|
374
393
|
nextOffset += zoneSpacing; // Add spacing after each zone
|
|
375
394
|
});
|
|
@@ -419,9 +438,17 @@ export class Layout {
|
|
|
419
438
|
return this.trace.steps[step].ops;
|
|
420
439
|
}
|
|
421
440
|
|
|
422
|
-
private renderZone(
|
|
441
|
+
private renderZone(
|
|
442
|
+
zoneIndex: number,
|
|
443
|
+
offset: number,
|
|
444
|
+
globalRowIndex: number,
|
|
445
|
+
): number {
|
|
423
446
|
const zoneData = this.normalizedZones[zoneIndex];
|
|
424
|
-
const zoneRows =
|
|
447
|
+
const zoneRows =
|
|
448
|
+
zoneData.rowEnd -
|
|
449
|
+
zoneData.rowStart +
|
|
450
|
+
1 -
|
|
451
|
+
(zoneData.skipRows?.length ?? 0);
|
|
425
452
|
const g = createSvgElements("g")[0];
|
|
426
453
|
setAttributes(g, {
|
|
427
454
|
transform: `translate(0 ${offset})`,
|
|
@@ -478,16 +505,19 @@ export class Layout {
|
|
|
478
505
|
}
|
|
479
506
|
|
|
480
507
|
// Number the rows using the absolute row numbers from rowStart to rowEnd
|
|
481
|
-
|
|
482
|
-
|
|
508
|
+
let i = 0;
|
|
509
|
+
for (let rowNum = zoneData.rowStart; rowNum <= zoneData.rowEnd; ++rowNum) {
|
|
510
|
+
if (zoneData.skipRows && zoneData.skipRows.includes(rowNum)) continue;
|
|
483
511
|
const label = createSvgElements("text")[0];
|
|
484
512
|
setAttributes(label, {
|
|
485
513
|
x: `${this.effectiveCols * qubitSize + 5}`,
|
|
486
514
|
y: `${i * qubitSize + 5}`,
|
|
487
515
|
class: "qs-atoms-label",
|
|
488
516
|
});
|
|
489
|
-
label.textContent = `${rowNum}`;
|
|
517
|
+
label.textContent = `${this.layout.renumber ? globalRowIndex : rowNum}`;
|
|
490
518
|
appendChildren(g, [label]);
|
|
519
|
+
++i;
|
|
520
|
+
++globalRowIndex;
|
|
491
521
|
}
|
|
492
522
|
|
|
493
523
|
// Draw the title
|
|
@@ -501,6 +531,7 @@ export class Layout {
|
|
|
501
531
|
|
|
502
532
|
appendChildren(g, [text]);
|
|
503
533
|
appendChildren(this.container, [g]);
|
|
534
|
+
return globalRowIndex;
|
|
504
535
|
}
|
|
505
536
|
|
|
506
537
|
private renderQubits() {
|
|
@@ -547,7 +578,7 @@ export class Layout {
|
|
|
547
578
|
y: `5`,
|
|
548
579
|
class: "qs-atoms-label",
|
|
549
580
|
});
|
|
550
|
-
label.textContent = `${origCol}`;
|
|
581
|
+
label.textContent = `${this.layout.renumber ? visualCol : origCol}`;
|
|
551
582
|
appendChildren(g, [label]);
|
|
552
583
|
++visualCol;
|
|
553
584
|
}
|
|
@@ -887,7 +918,18 @@ export class Layout {
|
|
|
887
918
|
const gate = parseGate(op);
|
|
888
919
|
if (!gate) throw `Invalid gate: ${op}`;
|
|
889
920
|
const arg = gate.arg ? gate.arg.substring(0, 4) : undefined;
|
|
890
|
-
|
|
921
|
+
const isTwoQubitGate = TWO_QUBIT_GATES.includes(
|
|
922
|
+
gate.gate.toUpperCase(),
|
|
923
|
+
);
|
|
924
|
+
// Handle the case where an op is a list of qubits to apply the same op to
|
|
925
|
+
for (let i = 0; i < gate.qubits.length; i++) {
|
|
926
|
+
if (isTwoQubitGate && i % 2 !== 0) continue;
|
|
927
|
+
this.renderGateOnQubit(
|
|
928
|
+
gate.qubits[i],
|
|
929
|
+
gate.gate.toUpperCase(),
|
|
930
|
+
arg,
|
|
931
|
+
);
|
|
932
|
+
}
|
|
891
933
|
}
|
|
892
934
|
}
|
|
893
935
|
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT license.
|
|
3
|
+
|
|
4
|
+
// Normalizes "pi" (any case) to "π" and trims whitespace for
|
|
5
|
+
// consistent storage and display.
|
|
6
|
+
export function normalizeAngleExpression(expr: string): string {
|
|
7
|
+
return expr.trim().replace(/pi/gi, "π");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Evaluate a simple arithmetic expression supporting numbers, + - * /, parentheses, and π.
|
|
11
|
+
// Returns `undefined` for invalid inputs.
|
|
12
|
+
export function evaluateAngleExpression(expr: string): number | undefined {
|
|
13
|
+
if (!expr) return undefined;
|
|
14
|
+
const src = normalizeAngleExpression(expr);
|
|
15
|
+
if (!src) return undefined;
|
|
16
|
+
|
|
17
|
+
// Tokenizer
|
|
18
|
+
type Tok = { type: "num" | "pi" | "op" | "lpar" | "rpar"; value?: string };
|
|
19
|
+
const toks: Tok[] = [];
|
|
20
|
+
let i = 0;
|
|
21
|
+
while (i < src.length) {
|
|
22
|
+
const ch = src[i];
|
|
23
|
+
if (ch === " " || ch === "\t" || ch === "\n") {
|
|
24
|
+
i++;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (ch === "(" || ch === ")") {
|
|
28
|
+
toks.push({ type: ch === "(" ? "lpar" : "rpar" });
|
|
29
|
+
i++;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === "+" || ch === "-" || ch === "*" || ch === "/") {
|
|
33
|
+
toks.push({ type: "op", value: ch });
|
|
34
|
+
i++;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (ch === "π") {
|
|
38
|
+
toks.push({ type: "pi" });
|
|
39
|
+
i++;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// number: digits with optional decimal part; no leading dot
|
|
43
|
+
if (ch === "." || /\d/.test(ch)) {
|
|
44
|
+
let j = i + 1;
|
|
45
|
+
while (j < src.length && /[0-9.]/.test(src[j])) j++;
|
|
46
|
+
const numStr = src.slice(i, j);
|
|
47
|
+
const valid = /^(?:\d+(?:\.\d*)?)$/.test(numStr);
|
|
48
|
+
if (!valid) return undefined;
|
|
49
|
+
toks.push({ type: "num", value: numStr });
|
|
50
|
+
i = j;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Unknown character
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Recursive descent parser
|
|
58
|
+
let k = 0;
|
|
59
|
+
const peek = () => toks[k];
|
|
60
|
+
const consume = () => toks[k++];
|
|
61
|
+
|
|
62
|
+
const parseExpr = (): number | undefined => {
|
|
63
|
+
let lhs = parseTerm();
|
|
64
|
+
if (lhs === undefined) return undefined;
|
|
65
|
+
while (
|
|
66
|
+
peek() &&
|
|
67
|
+
peek().type === "op" &&
|
|
68
|
+
(peek().value === "+" || peek().value === "-")
|
|
69
|
+
) {
|
|
70
|
+
const op = consume().value!;
|
|
71
|
+
const rhs = parseTerm();
|
|
72
|
+
if (rhs === undefined) return undefined;
|
|
73
|
+
lhs = op === "+" ? lhs + rhs : lhs - rhs;
|
|
74
|
+
}
|
|
75
|
+
return lhs;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const parseTerm = (): number | undefined => {
|
|
79
|
+
let lhs = parseFactor();
|
|
80
|
+
if (lhs === undefined) return undefined;
|
|
81
|
+
while (
|
|
82
|
+
peek() &&
|
|
83
|
+
peek().type === "op" &&
|
|
84
|
+
(peek().value === "*" || peek().value === "/")
|
|
85
|
+
) {
|
|
86
|
+
const op = consume().value!;
|
|
87
|
+
const rhs = parseFactor();
|
|
88
|
+
if (rhs === undefined) return undefined;
|
|
89
|
+
lhs = op === "*" ? lhs * rhs : lhs / rhs;
|
|
90
|
+
}
|
|
91
|
+
return lhs;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const parseFactor = (): number | undefined => {
|
|
95
|
+
let sign = 1;
|
|
96
|
+
if (
|
|
97
|
+
peek() &&
|
|
98
|
+
peek().type === "op" &&
|
|
99
|
+
(peek().value === "+" || peek().value === "-")
|
|
100
|
+
) {
|
|
101
|
+
sign = consume().value! === "-" ? -1 : 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const t = peek();
|
|
105
|
+
if (!t) return undefined;
|
|
106
|
+
if (t.type === "num") {
|
|
107
|
+
consume();
|
|
108
|
+
return sign * parseFloat(t.value!);
|
|
109
|
+
}
|
|
110
|
+
if (t.type === "pi") {
|
|
111
|
+
consume();
|
|
112
|
+
return sign * Math.PI;
|
|
113
|
+
}
|
|
114
|
+
if (t.type === "lpar") {
|
|
115
|
+
consume();
|
|
116
|
+
const v = parseExpr();
|
|
117
|
+
if (peek() && peek().type === "rpar") consume();
|
|
118
|
+
else return undefined;
|
|
119
|
+
if (v === undefined) return undefined;
|
|
120
|
+
return sign * v;
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const result = parseExpr();
|
|
126
|
+
if (result === undefined || k !== toks.length || !isFinite(result))
|
|
127
|
+
return undefined;
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function isValidAngleExpression(expr: string): boolean {
|
|
132
|
+
return evaluateAngleExpression(expr) !== undefined;
|
|
133
|
+
}
|
|
@@ -5,6 +5,10 @@ import { Parameter } from "./circuit.js";
|
|
|
5
5
|
import { removeControl, removeOperation } from "./circuitManipulation.js";
|
|
6
6
|
import { CircuitEvents } from "./events.js";
|
|
7
7
|
import { findGateElem, findOperation } from "./utils.js";
|
|
8
|
+
import {
|
|
9
|
+
isValidAngleExpression,
|
|
10
|
+
normalizeAngleExpression,
|
|
11
|
+
} from "./angleExpression.js";
|
|
8
12
|
|
|
9
13
|
/**
|
|
10
14
|
* Adds a context menu to a host element in the circuit visualization.
|
|
@@ -176,7 +180,7 @@ const promptForArguments = (
|
|
|
176
180
|
}
|
|
177
181
|
},
|
|
178
182
|
defaultValue,
|
|
179
|
-
|
|
183
|
+
isValidAngleExpression,
|
|
180
184
|
'Examples: "2.0 * π" or "π / 2.0"',
|
|
181
185
|
);
|
|
182
186
|
};
|
|
@@ -185,72 +189,6 @@ const promptForArguments = (
|
|
|
185
189
|
});
|
|
186
190
|
};
|
|
187
191
|
|
|
188
|
-
/**
|
|
189
|
-
* Validate a mathematical expression.
|
|
190
|
-
* @param input - The input string to validate.
|
|
191
|
-
* @returns True if the expression is valid, false otherwise.
|
|
192
|
-
*/
|
|
193
|
-
const validateExpression = (input: string): boolean => {
|
|
194
|
-
// Removes outermost parentheses
|
|
195
|
-
const removeParentheses = (expr: string): string => {
|
|
196
|
-
while (expr.startsWith("(") && expr.endsWith(")")) {
|
|
197
|
-
expr = expr.slice(1, -1).trim(); // Remove outermost parentheses
|
|
198
|
-
}
|
|
199
|
-
return expr;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
// Validates parentheses balance and nesting
|
|
203
|
-
const validateParentheses = (expr: string): boolean => {
|
|
204
|
-
const stack: string[] = [];
|
|
205
|
-
for (const char of expr) {
|
|
206
|
-
if (char === "(") {
|
|
207
|
-
stack.push(char);
|
|
208
|
-
} else if (char === ")") {
|
|
209
|
-
if (stack.length === 0) {
|
|
210
|
-
return false; // Unmatched closing parenthesis
|
|
211
|
-
}
|
|
212
|
-
stack.pop();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return stack.length === 0; // Ensure no unmatched opening parentheses
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
// Validate the expression recursively
|
|
219
|
-
const validate = (expr: string): boolean => {
|
|
220
|
-
expr = expr.trim();
|
|
221
|
-
|
|
222
|
-
// Remove outermost parentheses
|
|
223
|
-
expr = removeParentheses(expr);
|
|
224
|
-
|
|
225
|
-
// Find and validate all sub-expressions within parentheses
|
|
226
|
-
const parenthesesRegex = /\(([^()]+)\)/g;
|
|
227
|
-
let match;
|
|
228
|
-
while ((match = parenthesesRegex.exec(expr)) !== null) {
|
|
229
|
-
const innerExpr = match[1];
|
|
230
|
-
if (!validate(innerExpr)) {
|
|
231
|
-
return false; // Invalid sub-expression
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Replace the validated sub-expression with a placeholder that we know is valid
|
|
235
|
-
expr = expr.replace(match[0], "π");
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Validate the remaining expression (without parentheses)
|
|
239
|
-
const sign = "[+-]?";
|
|
240
|
-
const number = "((\\d+(\\.\\d*)?))"; // Matches integers and decimals
|
|
241
|
-
const pi = "(?i:π)"; // Matches π
|
|
242
|
-
const value = `${sign}(${number}|${pi})`; // Matches a signed number or π
|
|
243
|
-
const operator = "[+\\-*/]"; // Matches arithmetic operators
|
|
244
|
-
const expressionRegex = new RegExp(
|
|
245
|
-
`^${value}(\\s*${operator}\\s*${value})*$`,
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
return expressionRegex.test(expr);
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
return validateParentheses(input) && validate(input);
|
|
252
|
-
};
|
|
253
|
-
|
|
254
192
|
/**
|
|
255
193
|
* Create a context menu item
|
|
256
194
|
* @param text - The text to display in the menu item
|
|
@@ -316,12 +254,9 @@ const _createInputPrompt = (
|
|
|
316
254
|
okButton.classList.add("prompt-button");
|
|
317
255
|
okButton.textContent = "OK";
|
|
318
256
|
|
|
319
|
-
// Function to replace "pi" with "π" (case-insensitive)
|
|
320
|
-
const replacePiWithSymbol = (input: string) => input.replace(/pi/gi, "π");
|
|
321
|
-
|
|
322
257
|
// Function to validate input and toggle the OK button
|
|
323
258
|
const validateAndToggleOkButton = () => {
|
|
324
|
-
const processedInput =
|
|
259
|
+
const processedInput = normalizeAngleExpression(inputElem.value);
|
|
325
260
|
const isValid = validateInput(processedInput);
|
|
326
261
|
okButton.disabled = !isValid;
|
|
327
262
|
};
|
|
@@ -337,9 +272,9 @@ const _createInputPrompt = (
|
|
|
337
272
|
}
|
|
338
273
|
});
|
|
339
274
|
|
|
340
|
-
okButton.disabled = !validateInput(
|
|
275
|
+
okButton.disabled = !validateInput(normalizeAngleExpression(defaultValue));
|
|
341
276
|
okButton.addEventListener("click", () => {
|
|
342
|
-
callback(
|
|
277
|
+
callback(normalizeAngleExpression(inputElem.value));
|
|
343
278
|
document.body.removeChild(overlay);
|
|
344
279
|
document.removeEventListener("keydown", handleGlobalKeyDown, true);
|
|
345
280
|
});
|
package/ux/circuit-vis/events.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
Circuit,
|
|
6
|
+
ComponentGrid,
|
|
7
|
+
Operation,
|
|
8
|
+
Qubit,
|
|
9
|
+
Unitary,
|
|
10
|
+
} from "./circuit.js";
|
|
5
11
|
import { Sqore } from "./sqore.js";
|
|
6
12
|
import { toolboxGateDictionary } from "./panel.js";
|
|
7
13
|
import {
|
|
@@ -39,6 +45,7 @@ import {
|
|
|
39
45
|
import { getOperationRegisters } from "../../src/utils.js";
|
|
40
46
|
|
|
41
47
|
let events: CircuitEvents | null = null;
|
|
48
|
+
let currentCircuitSvg: SVGElement | null = null;
|
|
42
49
|
|
|
43
50
|
/**
|
|
44
51
|
* Creates and attaches the events that allow editing of the circuit.
|
|
@@ -55,6 +62,26 @@ const enableEvents = (
|
|
|
55
62
|
events.dispose();
|
|
56
63
|
}
|
|
57
64
|
events = new CircuitEvents(container, sqore, useRefresh);
|
|
65
|
+
|
|
66
|
+
// Track which rendered SVG the current `events` instance is associated with.
|
|
67
|
+
// This lets other modules avoid reading a stale model during a re-render where
|
|
68
|
+
// the SVG has been replaced but `enableEvents` hasn't run yet.
|
|
69
|
+
currentCircuitSvg = container.querySelector("svg.qviz") as SVGElement | null;
|
|
70
|
+
|
|
71
|
+
// Signal that the circuit model (events + model snapshot) is now ready.
|
|
72
|
+
// The state visualization uses this to re-render without relying on polling.
|
|
73
|
+
try {
|
|
74
|
+
const CustomEventCtor = (globalThis as any).CustomEvent as
|
|
75
|
+
| (new (type: string, init?: CustomEventInit) => CustomEvent)
|
|
76
|
+
| undefined;
|
|
77
|
+
if (CustomEventCtor && typeof container.dispatchEvent === "function") {
|
|
78
|
+
container.dispatchEvent(
|
|
79
|
+
new CustomEventCtor("qsharp:circuit:modelReady", { bubbles: true }),
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
} catch {
|
|
83
|
+
// ignore
|
|
84
|
+
}
|
|
58
85
|
};
|
|
59
86
|
|
|
60
87
|
class CircuitEvents {
|
|
@@ -1062,3 +1089,16 @@ const _createConfirmPrompt = (
|
|
|
1062
1089
|
};
|
|
1063
1090
|
|
|
1064
1091
|
export { enableEvents, CircuitEvents };
|
|
1092
|
+
|
|
1093
|
+
// Provide access to the current circuit model, but only if it matches the
|
|
1094
|
+
// currently-rendered SVG element. This prevents state visualization from
|
|
1095
|
+
// computing against the previous render's model during a re-render.
|
|
1096
|
+
export function getCurrentCircuitModel(
|
|
1097
|
+
expectedSvg?: SVGElement | null,
|
|
1098
|
+
): Circuit | null {
|
|
1099
|
+
if (events == null) return null;
|
|
1100
|
+
if (expectedSvg && currentCircuitSvg && expectedSvg !== currentCircuitSvg) {
|
|
1101
|
+
return null;
|
|
1102
|
+
}
|
|
1103
|
+
return { qubits: events.qubits, componentGrid: events.componentGrid };
|
|
1104
|
+
}
|