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
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT license.
|
|
3
|
+
|
|
4
|
+
import { Parameter } from "./circuit";
|
|
5
|
+
import { removeControl, removeOperation } from "./circuitManipulation";
|
|
6
|
+
import { CircuitEvents } from "./events";
|
|
7
|
+
import { findGateElem, findOperation } from "./utils";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Adds a context menu to a host element in the circuit visualization.
|
|
11
|
+
*
|
|
12
|
+
* @param circuitEvents The CircuitEvents instance to handle circuit-related events.
|
|
13
|
+
* @param hostElem The SVG element representing a gate component to which the context menu will be added.
|
|
14
|
+
*/
|
|
15
|
+
const addContextMenuToHostElem = (
|
|
16
|
+
circuitEvents: CircuitEvents,
|
|
17
|
+
hostElem: SVGGraphicsElement,
|
|
18
|
+
) => {
|
|
19
|
+
hostElem?.addEventListener("contextmenu", (ev: MouseEvent) => {
|
|
20
|
+
ev.preventDefault();
|
|
21
|
+
|
|
22
|
+
// Remove any existing context menu
|
|
23
|
+
const existingContextMenu = document.querySelector(".context-menu");
|
|
24
|
+
if (existingContextMenu) {
|
|
25
|
+
document.body.removeChild(existingContextMenu);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const gateElem = findGateElem(hostElem);
|
|
29
|
+
if (!gateElem) return;
|
|
30
|
+
const selectedLocation = gateElem.getAttribute("data-location");
|
|
31
|
+
const selectedOperation = findOperation(
|
|
32
|
+
circuitEvents.componentGrid,
|
|
33
|
+
selectedLocation,
|
|
34
|
+
);
|
|
35
|
+
if (!selectedOperation || !selectedLocation) return;
|
|
36
|
+
|
|
37
|
+
const contextMenu = document.createElement("div");
|
|
38
|
+
contextMenu.classList.add("context-menu");
|
|
39
|
+
contextMenu.style.top = `${ev.clientY + window.scrollY}px`;
|
|
40
|
+
contextMenu.style.left = `${ev.clientX + window.scrollX}px`;
|
|
41
|
+
contextMenu.addEventListener("contextmenu", (e) => {
|
|
42
|
+
e.preventDefault();
|
|
43
|
+
e.stopPropagation();
|
|
44
|
+
});
|
|
45
|
+
contextMenu.addEventListener("mouseup", (e) => {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
e.stopPropagation();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const dataWireStr = hostElem.getAttribute("data-wire");
|
|
51
|
+
const dataWire = dataWireStr != null ? parseInt(dataWireStr) : null;
|
|
52
|
+
const isControl =
|
|
53
|
+
hostElem.classList.contains("control-dot") && dataWire != null;
|
|
54
|
+
|
|
55
|
+
const deleteOption = _createContextMenuItem("Delete", () => {
|
|
56
|
+
removeOperation(circuitEvents, selectedLocation);
|
|
57
|
+
circuitEvents.renderFn();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
if (
|
|
61
|
+
selectedOperation.kind === "measurement" ||
|
|
62
|
+
selectedOperation.kind === "ket"
|
|
63
|
+
) {
|
|
64
|
+
contextMenu.appendChild(deleteOption);
|
|
65
|
+
} else if (isControl) {
|
|
66
|
+
const removeControlOption = _createContextMenuItem(
|
|
67
|
+
"Remove control",
|
|
68
|
+
() => {
|
|
69
|
+
removeControl(selectedOperation, dataWire);
|
|
70
|
+
circuitEvents.renderFn();
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
contextMenu.appendChild(removeControlOption!);
|
|
74
|
+
} else {
|
|
75
|
+
const adjointOption = _createContextMenuItem("Toggle Adjoint", () => {
|
|
76
|
+
if (selectedOperation.kind !== "unitary") return;
|
|
77
|
+
selectedOperation.isAdjoint = !selectedOperation.isAdjoint;
|
|
78
|
+
circuitEvents.renderFn();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const addControlOption = _createContextMenuItem("Add control", () => {
|
|
82
|
+
if (selectedOperation.kind !== "unitary") return;
|
|
83
|
+
circuitEvents._startAddingControl(selectedOperation, selectedLocation);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
let removeControlOption: HTMLDivElement | undefined;
|
|
87
|
+
if (selectedOperation.controls && selectedOperation.controls.length > 0) {
|
|
88
|
+
removeControlOption = _createContextMenuItem("Remove control", () => {
|
|
89
|
+
circuitEvents._startRemovingControl(selectedOperation);
|
|
90
|
+
});
|
|
91
|
+
contextMenu.appendChild(removeControlOption);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const promptArgOption = _createContextMenuItem("Edit Argument", () => {
|
|
95
|
+
promptForArguments(
|
|
96
|
+
selectedOperation.params!,
|
|
97
|
+
selectedOperation.args,
|
|
98
|
+
).then((args) => {
|
|
99
|
+
if (args.length > 0) {
|
|
100
|
+
selectedOperation.args = args;
|
|
101
|
+
} else {
|
|
102
|
+
selectedOperation.args = undefined;
|
|
103
|
+
}
|
|
104
|
+
circuitEvents.renderFn();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
if (selectedOperation.gate == "X") {
|
|
109
|
+
contextMenu.appendChild(addControlOption);
|
|
110
|
+
if (removeControlOption) {
|
|
111
|
+
contextMenu.appendChild(removeControlOption);
|
|
112
|
+
}
|
|
113
|
+
contextMenu.appendChild(deleteOption);
|
|
114
|
+
} else {
|
|
115
|
+
contextMenu.appendChild(adjointOption);
|
|
116
|
+
contextMenu.appendChild(addControlOption);
|
|
117
|
+
if (removeControlOption) {
|
|
118
|
+
contextMenu.appendChild(removeControlOption);
|
|
119
|
+
}
|
|
120
|
+
if (
|
|
121
|
+
selectedOperation.params !== undefined &&
|
|
122
|
+
selectedOperation.params.length > 0
|
|
123
|
+
) {
|
|
124
|
+
contextMenu.appendChild(promptArgOption);
|
|
125
|
+
}
|
|
126
|
+
contextMenu.appendChild(deleteOption);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
document.body.appendChild(contextMenu);
|
|
131
|
+
|
|
132
|
+
document.addEventListener(
|
|
133
|
+
"click",
|
|
134
|
+
() => {
|
|
135
|
+
if (document.body.contains(contextMenu)) {
|
|
136
|
+
document.body.removeChild(contextMenu);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{ once: true },
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Prompt the user for argument values.
|
|
146
|
+
* @param params - The parameters for which the user needs to provide values.
|
|
147
|
+
* @param defaultArgs - The default values for the parameters, if any.
|
|
148
|
+
* @returns A Promise that resolves with the user-provided arguments as an array of strings.
|
|
149
|
+
*/
|
|
150
|
+
const promptForArguments = (
|
|
151
|
+
params: Parameter[],
|
|
152
|
+
defaultArgs: string[] = [],
|
|
153
|
+
): Promise<string[]> => {
|
|
154
|
+
return new Promise((resolve) => {
|
|
155
|
+
const collectedArgs: string[] = [];
|
|
156
|
+
let currentIndex = 0;
|
|
157
|
+
|
|
158
|
+
const promptNext = () => {
|
|
159
|
+
if (currentIndex >= params.length) {
|
|
160
|
+
resolve(collectedArgs);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const param = params[currentIndex];
|
|
165
|
+
const defaultValue = defaultArgs[currentIndex] || "";
|
|
166
|
+
|
|
167
|
+
_createInputPrompt(
|
|
168
|
+
`Enter value for parameter "${param.name}":`,
|
|
169
|
+
(userInput) => {
|
|
170
|
+
if (userInput !== null) {
|
|
171
|
+
collectedArgs.push(userInput);
|
|
172
|
+
currentIndex++;
|
|
173
|
+
promptNext();
|
|
174
|
+
} else {
|
|
175
|
+
resolve(defaultArgs); // User canceled the prompt
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
defaultValue,
|
|
179
|
+
validateExpression,
|
|
180
|
+
'Examples: "2.0 * π" or "π / 2.0"',
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
promptNext();
|
|
185
|
+
});
|
|
186
|
+
};
|
|
187
|
+
|
|
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:π|pi)"; // Matches π or pi
|
|
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
|
+
/**
|
|
255
|
+
* Create a context menu item
|
|
256
|
+
* @param text - The text to display in the menu item
|
|
257
|
+
* @param onClick - The function to call when the menu item is clicked
|
|
258
|
+
* @returns The created menu item element
|
|
259
|
+
*/
|
|
260
|
+
const _createContextMenuItem = (
|
|
261
|
+
text: string,
|
|
262
|
+
onClick: () => void,
|
|
263
|
+
): HTMLDivElement => {
|
|
264
|
+
const menuItem = document.createElement("div");
|
|
265
|
+
menuItem.classList.add("context-menu-option");
|
|
266
|
+
menuItem.textContent = text;
|
|
267
|
+
menuItem.addEventListener("click", onClick);
|
|
268
|
+
return menuItem;
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Create a user input prompt element
|
|
273
|
+
* @param message - The message to display in the prompt
|
|
274
|
+
* @param callback - The callback function to handle the user input
|
|
275
|
+
* @param defaultValue - The default value to display in the input element
|
|
276
|
+
* @param validateInput - A function to validate the user input
|
|
277
|
+
* @param placeholder - The placeholder text for the input element
|
|
278
|
+
*/
|
|
279
|
+
const _createInputPrompt = (
|
|
280
|
+
message: string,
|
|
281
|
+
callback: (input: string | null) => void,
|
|
282
|
+
defaultValue: string = "",
|
|
283
|
+
validateInput: (input: string) => boolean = () => true,
|
|
284
|
+
placeholder: string = "",
|
|
285
|
+
) => {
|
|
286
|
+
// Create the prompt overlay
|
|
287
|
+
const overlay = document.createElement("div");
|
|
288
|
+
overlay.classList.add("prompt-overlay");
|
|
289
|
+
overlay.addEventListener("contextmenu", (e) => {
|
|
290
|
+
e.preventDefault();
|
|
291
|
+
e.stopPropagation();
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
// Create the prompt container
|
|
295
|
+
const promptContainer = document.createElement("div");
|
|
296
|
+
promptContainer.classList.add("prompt-container");
|
|
297
|
+
|
|
298
|
+
// Create the message element
|
|
299
|
+
const messageElem = document.createElement("div");
|
|
300
|
+
messageElem.classList.add("prompt-message");
|
|
301
|
+
messageElem.textContent = message;
|
|
302
|
+
|
|
303
|
+
// Create the input element
|
|
304
|
+
const inputElem = document.createElement("input");
|
|
305
|
+
inputElem.classList.add("prompt-input");
|
|
306
|
+
inputElem.type = "text";
|
|
307
|
+
inputElem.value = defaultValue;
|
|
308
|
+
inputElem.placeholder = placeholder;
|
|
309
|
+
|
|
310
|
+
// Create the buttons container
|
|
311
|
+
const buttonsContainer = document.createElement("div");
|
|
312
|
+
buttonsContainer.classList.add("prompt-buttons");
|
|
313
|
+
|
|
314
|
+
// Create the π button
|
|
315
|
+
const piButton = document.createElement("button");
|
|
316
|
+
piButton.textContent = "π";
|
|
317
|
+
piButton.classList.add("pi-button", "prompt-button");
|
|
318
|
+
piButton.addEventListener("click", () => {
|
|
319
|
+
const cursorPosition = inputElem.selectionStart || 0;
|
|
320
|
+
const textBefore = inputElem.value.substring(0, cursorPosition);
|
|
321
|
+
const textAfter = inputElem.value.substring(cursorPosition);
|
|
322
|
+
inputElem.value = `${textBefore}π${textAfter}`;
|
|
323
|
+
inputElem.focus();
|
|
324
|
+
inputElem.setSelectionRange(cursorPosition + 1, cursorPosition + 1); // Move cursor after "π"
|
|
325
|
+
validateAndToggleOkButton();
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
// Create the OK button
|
|
329
|
+
const okButton = document.createElement("button");
|
|
330
|
+
okButton.classList.add("prompt-button");
|
|
331
|
+
okButton.textContent = "OK";
|
|
332
|
+
okButton.disabled = !validateInput(defaultValue);
|
|
333
|
+
okButton.addEventListener("click", () => {
|
|
334
|
+
callback(inputElem.value.trim());
|
|
335
|
+
document.body.removeChild(overlay);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Create the Cancel button
|
|
339
|
+
const cancelButton = document.createElement("button");
|
|
340
|
+
cancelButton.classList.add("prompt-button");
|
|
341
|
+
cancelButton.textContent = "Cancel";
|
|
342
|
+
cancelButton.addEventListener("click", () => {
|
|
343
|
+
callback(null);
|
|
344
|
+
document.body.removeChild(overlay);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// Function to validate input and toggle the OK button
|
|
348
|
+
const validateAndToggleOkButton = () => {
|
|
349
|
+
const isValid = validateInput(inputElem.value.trim());
|
|
350
|
+
okButton.disabled = !isValid;
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
// Add input event listener for validation
|
|
354
|
+
inputElem.addEventListener("input", validateAndToggleOkButton);
|
|
355
|
+
|
|
356
|
+
// Append buttons to the container
|
|
357
|
+
buttonsContainer.appendChild(piButton);
|
|
358
|
+
buttonsContainer.appendChild(okButton);
|
|
359
|
+
buttonsContainer.appendChild(cancelButton);
|
|
360
|
+
|
|
361
|
+
// Append elements to the prompt container
|
|
362
|
+
promptContainer.appendChild(messageElem);
|
|
363
|
+
promptContainer.appendChild(inputElem);
|
|
364
|
+
promptContainer.appendChild(buttonsContainer);
|
|
365
|
+
|
|
366
|
+
// Append the prompt container to the overlay
|
|
367
|
+
overlay.appendChild(promptContainer);
|
|
368
|
+
|
|
369
|
+
// Append the overlay to the document body
|
|
370
|
+
document.body.appendChild(overlay);
|
|
371
|
+
|
|
372
|
+
// Focus the input element
|
|
373
|
+
inputElem.focus();
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
export { addContextMenuToHostElem, promptForArguments };
|