diff --git a/src/QirRuntime/test/QIR-static/qsharp/qir-gen.csproj b/src/QirRuntime/test/QIR-static/qsharp/qir-gen.csproj index dc0df356f9f..cafd2d3365a 100644 --- a/src/QirRuntime/test/QIR-static/qsharp/qir-gen.csproj +++ b/src/QirRuntime/test/QIR-static/qsharp/qir-gen.csproj @@ -3,7 +3,6 @@ Exe netcoreapp3.1 - false True false false diff --git a/src/Simulation/QSharpFoundation/ClassicalControl.qs b/src/Simulation/QSharpFoundation/ClassicalControl.qs index 38d486e8e70..1666d930aa7 100644 --- a/src/Simulation/QSharpFoundation/ClassicalControl.qs +++ b/src/Simulation/QSharpFoundation/ClassicalControl.qs @@ -3,22 +3,22 @@ namespace Microsoft.Quantum.Simulation.QuantumProcessor.Extensions //ToDo: update namespace to a more appropriate name { - operation NoOp() : Unit is Ctl + Adj {} + open Microsoft.Quantum.Canon; // Private helper operations. - operation Delay<'T>(op : ('T => Unit), arg : 'T, aux : Unit) : Unit { + internal operation Delay<'T>(op : ('T => Unit), arg : 'T, aux : Unit) : Unit { op(arg); } - operation DelayC<'T>(op : ('T => Unit is Ctl), arg : 'T, aux : Unit) : Unit is Ctl { + internal operation DelayC<'T>(op : ('T => Unit is Ctl), arg : 'T, aux : Unit) : Unit is Ctl { op(arg); } - operation DelayA<'T>(op : ('T => Unit is Adj), arg : 'T, aux : Unit) : Unit is Adj { + internal operation DelayA<'T>(op : ('T => Unit is Adj), arg : 'T, aux : Unit) : Unit is Adj { op(arg); } - operation DelayCA<'T>(op : ('T => Unit is Ctl + Adj), arg : 'T, aux : Unit) : Unit is Ctl + Adj { + internal operation DelayCA<'T>(op : ('T => Unit is Ctl + Adj), arg : 'T, aux : Unit) : Unit is Ctl + Adj { op(arg); } @@ -134,25 +134,25 @@ namespace Microsoft.Quantum.Simulation.QuantumProcessor.Extensions //ToDo: updat // if (measurementResult == Zero) {onResultZeroOp(zeroArg);} operation ApplyIfZero<'T>(measurementResult : Result, (onResultZeroOp : ('T => Unit), zeroArg : 'T)) : Unit { let zeroOp = Delay(onResultZeroOp, zeroArg, _); - let oneOp = Delay(NoOp, (), _); + let oneOp = Delay(NoOp, (), _); ApplyIfElseIntrinsic(measurementResult, zeroOp, oneOp); } operation ApplyIfZeroA<'T>(measurementResult : Result, (onResultZeroOp : ('T => Unit is Adj), zeroArg : 'T)) : Unit is Adj{ let zeroOp = DelayA(onResultZeroOp, zeroArg, _); - let oneOp = DelayA(NoOp, (), _); + let oneOp = DelayA(NoOp, (), _); ApplyIfElseIntrinsicA(measurementResult, zeroOp, oneOp); } operation ApplyIfZeroC<'T>(measurementResult : Result, (onResultZeroOp : ('T => Unit is Ctl), zeroArg : 'T)) : Unit is Ctl { let zeroOp = DelayC(onResultZeroOp, zeroArg, _); - let oneOp = DelayC(NoOp, (), _); + let oneOp = DelayC(NoOp, (), _); ApplyIfElseIntrinsicC(measurementResult, zeroOp, oneOp); } operation ApplyIfZeroCA<'T>(measurementResult : Result, (onResultZeroOp : ('T => Unit is Ctl + Adj), zeroArg : 'T)) : Unit is Ctl + Adj { let zeroOp = DelayCA(onResultZeroOp, zeroArg, _); - let oneOp = DelayCA(NoOp, (), _); + let oneOp = DelayCA(NoOp, (), _); ApplyIfElseIntrinsicCA(measurementResult, zeroOp, oneOp); } @@ -162,25 +162,25 @@ namespace Microsoft.Quantum.Simulation.QuantumProcessor.Extensions //ToDo: updat // if (measurementResult == One) {onResultOneOp(oneArg);} operation ApplyIfOne<'T>(measurementResult : Result, (onResultOneOp : ('T => Unit), oneArg : 'T)) : Unit { let oneOp = Delay(onResultOneOp, oneArg, _); - let zeroOp = Delay(NoOp, (), _); + let zeroOp = Delay(NoOp, (), _); ApplyIfElseIntrinsic(measurementResult, zeroOp, oneOp); } operation ApplyIfOneA<'T>(measurementResult : Result, (onResultOneOp : ('T => Unit is Adj), oneArg : 'T)) : Unit is Adj { let oneOp = DelayA(onResultOneOp, oneArg, _); - let zeroOp = DelayA(NoOp, (), _); + let zeroOp = DelayA(NoOp, (), _); ApplyIfElseIntrinsicA(measurementResult, zeroOp, oneOp); } operation ApplyIfOneC<'T>(measurementResult : Result, (onResultOneOp : ('T => Unit is Ctl), oneArg : 'T)) : Unit is Ctl { let oneOp = DelayC(onResultOneOp, oneArg, _); - let zeroOp = DelayC(NoOp, (), _); + let zeroOp = DelayC(NoOp, (), _); ApplyIfElseIntrinsicC(measurementResult, zeroOp, oneOp); } operation ApplyIfOneCA<'T>(measurementResult : Result, (onResultOneOp : ('T => Unit is Ctl + Adj), oneArg : 'T)) : Unit is Ctl + Adj { let oneOp = DelayCA(onResultOneOp, oneArg, _); - let zeroOp = DelayCA(NoOp, (), _); + let zeroOp = DelayCA(NoOp, (), _); ApplyIfElseIntrinsicCA(measurementResult, zeroOp, oneOp); } diff --git a/src/Simulation/Simulators/QuantumSimulator/SimulatorBase.cs b/src/Simulation/Simulators/QuantumSimulator/SimulatorBase.cs index 0d5d5b53824..eb8b27f1ee6 100644 --- a/src/Simulation/Simulators/QuantumSimulator/SimulatorBase.cs +++ b/src/Simulation/Simulators/QuantumSimulator/SimulatorBase.cs @@ -505,86 +505,6 @@ public ApplyIfElse(SimulatorBase m) : base(m) => }; } - public class ApplyIfElseA : ApplyIfElseIntrinsicA - { - protected readonly SimulatorBase sim; - public ApplyIfElseA(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(Result, IAdjointable, IAdjointable), QVoid> __Body__ => (q) => - { - (Result measurementResult, ICallable onZero, ICallable onOne) = q; - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(Result, IAdjointable, IAdjointable), QVoid> __AdjointBody__ => (q) => - { - (Result measurementResult, ICallable onZero, ICallable onOne) = q; - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, OperationFunctor.Adjoint, null); - return QVoid.Instance; - }; - } - - public class ApplyIfElseC : ApplyIfElseIntrinsicC - { - protected readonly SimulatorBase sim; - public ApplyIfElseC(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(Result, IControllable, IControllable), QVoid> __Body__ => (q) => - { - (Result measurementResult, ICallable onZero, ICallable onOne) = q; - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, (Result, IControllable, IControllable)), QVoid> __ControlledBody__ => (q) => - { - (IQArray ctrls, (Result measurementResult, ICallable onZero, ICallable onOne)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Body, null) : (OperationFunctor.Controlled, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, specKind, controls); - return QVoid.Instance; - }; - } - - public class ApplyIfElseCA : ApplyIfElseIntrinsicCA - { - protected readonly SimulatorBase sim; - public ApplyIfElseCA(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(Result, IUnitary, IUnitary), QVoid> __Body__ => (q) => - { - (Result measurementResult, ICallable onZero, ICallable onOne) = q; - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(Result, IUnitary, IUnitary), QVoid> __AdjointBody__ => (q) => - { - (Result measurementResult, ICallable onZero, ICallable onOne) = q; - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, OperationFunctor.Adjoint, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, (Result, IUnitary, IUnitary)), QVoid> __ControlledBody__ => (q) => - { - (IQArray ctrls, (Result measurementResult, ICallable onZero, ICallable onOne)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Body, null) : (OperationFunctor.Controlled, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, specKind, controls); - return QVoid.Instance; - }; - - public override Func<(IQArray, (Result, IUnitary, IUnitary)), QVoid> __ControlledAdjointBody__ => (q) => - { - (IQArray ctrls, (Result measurementResult, ICallable onZero, ICallable onOne)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Adjoint, null) : (OperationFunctor.ControlledAdjoint, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResult, Result.Zero, onZero, onOne, specKind, controls); - return QVoid.Instance; - }; - } - public class ApplyConditionally : ApplyConditionallyIntrinsic { protected readonly SimulatorBase sim; @@ -599,86 +519,6 @@ public ApplyConditionally(SimulatorBase m) : base(m) => }; } - public class ApplyConditionallyA : ApplyConditionallyIntrinsicA - { - protected readonly SimulatorBase sim; - public ApplyConditionallyA(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(IQArray, IQArray, IAdjointable, IAdjointable), QVoid> __Body__ => (q) => - { - (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp) = q; - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, IQArray, IAdjointable, IAdjointable), QVoid> __AdjointBody__ => (q) => - { - (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp) = q; - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, OperationFunctor.Adjoint, null); - return QVoid.Instance; - }; - } - - public class ApplyConditionallyC : ApplyConditionallyIntrinsicC - { - protected readonly SimulatorBase sim; - public ApplyConditionallyC(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(IQArray, IQArray, IControllable, IControllable), QVoid> __Body__ => (q) => - { - (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp) = q; - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, (IQArray, IQArray, IControllable, IControllable)), QVoid> __ControlledBody__ => (q) => - { - (IQArray ctrls, (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Body, null) : (OperationFunctor.Controlled, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, specKind, controls); - return QVoid.Instance; - }; - } - - public class ApplyConditionallyCA : ApplyConditionallyIntrinsicCA - { - protected readonly SimulatorBase sim; - public ApplyConditionallyCA(SimulatorBase m) : base(m) => - sim = m; - - public override Func<(IQArray, IQArray, IUnitary, IUnitary), QVoid> __Body__ => (q) => - { - (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp) = q; - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, OperationFunctor.Body, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, IQArray, IUnitary, IUnitary), QVoid> __AdjointBody__ => (q) => - { - (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp) = q; - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, OperationFunctor.Adjoint, null); - return QVoid.Instance; - }; - - public override Func<(IQArray, (IQArray, IQArray, IUnitary, IUnitary)), QVoid> __ControlledBody__ => (q) => - { - (IQArray ctrls, (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Body, null) : (OperationFunctor.Controlled, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, specKind, controls); - return QVoid.Instance; - }; - - public override Func<(IQArray, (IQArray, IQArray, IUnitary, IUnitary)), QVoid> __ControlledAdjointBody__ => (q) => - { - (IQArray ctrls, (IQArray measurementResults, IQArray resultsValues, ICallable onEqualOp, ICallable onNonEqualOp)) = q; - (var specKind, IQArray? controls) = ctrls?.Count == 0 ? (OperationFunctor.Adjoint, null) : (OperationFunctor.ControlledAdjoint, ctrls); - this.sim.BranchingBasedOnMeasurement(measurementResults, resultsValues, onEqualOp, onNonEqualOp, specKind, controls); - return QVoid.Instance; - }; - } - private Action BuildClause(ICallable op, OperationFunctor type, IQArray? ctrls) => type switch {