public void ToffoliMeasure()
        {
            var sim     = new ToffoliSimulator();
            var measure = sim.Get <Intrinsic.M>();

            var allocate = sim.Get <Intrinsic.Allocate>();
            var release  = sim.Get <Intrinsic.Release>();

            var qubits = allocate.Apply(1);

            Assert.Single(qubits);

            var q      = qubits[0];
            var result = measure.Apply(q);

            Assert.Equal(Result.Zero, result);

            sim.State[q.Id] = true;
            result          = measure.Apply(q);
            Assert.Equal(Result.One, result);
            sim.State[q.Id] = false; // Make it safe to release

            release.Apply(qubits);
            sim.CheckNoQubitLeak();
        }
        public void RecursionFail1Test()
        {
            ToffoliSimulator sim = new ToffoliSimulator();

            {
                StackTraceCollector sc = new StackTraceCollector(sim);
                ICallable           op = sim.Get <ICallable, RecursionFail1>();
                try
                {
                    QVoid res = op.Apply <QVoid>(QVoid.Instance);
                }
                catch (ExecutionFailException)
                {
                    StackFrame[] stackFrames = sc.CallStack;

                    Assert.Equal(4, stackFrames.Length);

                    Assert.Equal(namespacePrefix + "RecursionFail", stackFrames[0].Callable.FullName);
                    Assert.Equal(namespacePrefix + "RecursionFail", stackFrames[1].Callable.FullName);
                    Assert.Equal(namespacePrefix + "RecursionFail", stackFrames[2].Callable.FullName);
                    Assert.Equal(namespacePrefix + "RecursionFail1", stackFrames[3].Callable.FullName);

                    Assert.Equal(OperationFunctor.Body, stackFrames[0].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[1].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[2].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[3].Callable.Variant);

                    Assert.Equal(70, stackFrames[0].FailedLineNumber);
                    Assert.Equal(66, stackFrames[1].FailedLineNumber);
                    Assert.Equal(66, stackFrames[2].FailedLineNumber);
                    Assert.Equal(75, stackFrames[3].FailedLineNumber);
                }
            }
        }
        public void ToffoliConstructor()
        {
            var subject = new ToffoliSimulator();

            Assert.Equal((int)ToffoliSimulator.DEFAULT_QUBIT_COUNT, subject.State.Length);
            Assert.Equal("Toffoli Simulator", subject.Name);
        }
示例#4
0
        static void Main(string[] args)
        {
            var rng = new Random(5);

            var collectTofCount   = true;
            var collectQubitCount = true;
            var useSchoolbook     = false;
            var cases             = new[] {
                32,
                64, 96,
                128, 128 + 32,
                256, 256 + 32,
                512, 512 + 32,
                1024, 1024 + 32,
                2048, 2048 + 32,
                4096, 4096 + 32
            };

            foreach (var i in cases)
            {
                var a       = rng.NextBigInt(i);
                var b       = rng.NextBigInt(i);
                var tof_sim = new ToffoliSimulator();
                var config  = new QCTraceSimulatorConfiguration();
                config.usePrimitiveOperationsCounter = collectTofCount;
                config.useWidthCounter = collectQubitCount;
                var trace_sim = new QCTraceSimulator(config);

                BigInteger result = 0, result2 = 0;
                if (useSchoolbook)
                {
                    result  = RunSchoolbookMultiplicationCircuit.Run(tof_sim, a, b).Result;
                    result2 = RunSchoolbookMultiplicationCircuit.Run(trace_sim, a, b).Result;
                }
                else
                {
                    result  = RunKaratsubaMultiplicationCircuit.Run(tof_sim, a, b).Result;
                    result2 = RunKaratsubaMultiplicationCircuit.Run(trace_sim, a, b).Result;
                }
                if (result != a * b || result2 != result)
                {
                    throw new ArithmeticException($"Wrong result. {a}*{b} != {result}, {result==result2}.");
                }

                double tofCount, qubitCount;
                if (useSchoolbook)
                {
                    tofCount   = collectTofCount ? trace_sim.GetMetric <RunSchoolbookMultiplicationCircuit>(PrimitiveOperationsGroupsNames.T) / 7 : -1;
                    qubitCount = collectQubitCount ? trace_sim.GetMetric <RunSchoolbookMultiplicationCircuit>(MetricsNames.WidthCounter.ExtraWidth) : -1;
                }
                else
                {
                    tofCount   = collectTofCount ? trace_sim.GetMetric <RunKaratsubaMultiplicationCircuit>(PrimitiveOperationsGroupsNames.T) / 7 : -1;
                    qubitCount = collectQubitCount ? trace_sim.GetMetric <RunKaratsubaMultiplicationCircuit>(MetricsNames.WidthCounter.ExtraWidth) : -1;
                }
                Console.WriteLine($"{i},{tofCount},{qubitCount}");
            }
        }
        static DriverParameters()
        {
            var qsim = new ToffoliSimulator();

            DriverParameters.IsTestable = IsMinimizeDepthCostMetric.Run(qsim).Result;
            DriverParameters.MinimizeDepthCostMetric = IsMinimizeDepthCostMetric.Run(qsim).Result;
            DriverParameters.MinimizeTCostMetric     = IsMinimizeTCostMetric.Run(qsim).Result;
            DriverParameters.MinimizeWidthCostMetric = IsMinimizeWidthCostMetric.Run(qsim).Result;
        }
        public void AllGoodTest()
        {
            ToffoliSimulator sim = new ToffoliSimulator();

            QVoid res = sim.Execute <AllGood1, QVoid, QVoid>(QVoid.Instance);

            StackFrame[] stackFrames = sim.CallStack;
            Assert.Null(stackFrames);
        }
        public void TestTarget(TestOperation op)
        {
            var sim = new ToffoliSimulator();

            // OnLog defines action(s) performed when Q# test calls function Message
            sim.OnLog += (msg) => { this.output.WriteLine(msg); };
            sim.OnLog += (msg) => { Debug.WriteLine(msg); };
            op.TestOperationRunner(sim);
        }
        static DriverParameters()
        {
            // Turn off IsTestable to run the resource estimator
            Microsoft.Quantum.Crypto.Basics.IsTestable.Testable = false;
            DriverParameters.IsTestable = false;

            var qsim = new ToffoliSimulator();

            DriverParameters.MinimizeDepthCostMetric = IsMinimizeDepthCostMetric.Run(qsim).Result;
            DriverParameters.MinimizeTCostMetric     = IsMinimizeTCostMetric.Run(qsim).Result;
            DriverParameters.MinimizeWidthCostMetric = IsMinimizeWidthCostMetric.Run(qsim).Result;
        }
        public void DivideByZeroTest()
        {
            ToffoliSimulator sim = new ToffoliSimulator();

            try
            {
                sim.Execute <DivideBy0, QVoid, long>(QVoid.Instance);
            }
            catch (Exception)
            {
                StackFrame[] stackFrames = sim.CallStack;

                Assert.Single(stackFrames);
                Assert.Equal(namespacePrefix + "DivideBy0", stackFrames[0].Callable.FullName);
            }
        }
示例#10
0
        static void Main(string[] args)
        {
            var sim     = new ToffoliSimulator();
            var inputs1 = new long[] { 3, 5, 3, 4, 5 };
            var inputs2 = new long[] { 5, 4, 6, 4, 1 };
            var modulus = 7;
            int numBits = 4;

            var res = CustomModAdd.Run(sim, new QArray <long>(inputs1), new QArray <long>(inputs2),
                                       modulus, numBits).Result;

            for (int i = 0; i < res.Length; ++i)
            {
                System.Console.WriteLine($"{inputs1[i]} + {inputs2[i]} " +
                                         $"mod {modulus} = {res[i]}.");
            }
        }
示例#11
0
 public void TestTarget(TestOperation op)
 {
     Console.WriteLine(op.className);
     if (op.className.Contains("ToffoliSim"))
     {
         var sim = new ToffoliSimulator();
         sim.OnLog += (msg) => { output.WriteLine(msg); };
         sim.OnLog += (msg) => { Debug.WriteLine(msg); };
         op.TestOperationRunner(sim);
     }
     else
     {
         using (var sim = new QuantumSimulator()) {
             sim.OnLog += (msg) => { output.WriteLine(msg); };
             sim.OnLog += (msg) => { Debug.WriteLine(msg); };
             op.TestOperationRunner(sim);
         }
     }
 }
示例#12
0
        /// <summary>
        /// Simulates a function/operation using the ToffoliSimulator as target machine.
        /// It expects a single input: the name of the function/operation to simulate.
        /// </summary>
        public async Task <ExecutionResult> RunAsync(string input, IChannel channel)
        {
            var(name, args) = ParseInput(input);

            var symbol = SymbolResolver.Resolve(name) as IQSharpSymbol;

            if (symbol == null)
            {
                throw new InvalidOperationException($"Invalid operation name: {name}");
            }

            var qsim = new ToffoliSimulator();

            qsim.DisableLogToConsole();
            qsim.OnLog += channel.Stdout;

            var value = await symbol.Operation.RunAsync(qsim, args);

            return(value.ToExecutionResult());
        }
示例#13
0
        static void Main(string[] args)
        {
            // using (var qsim = new QuantumSimulator())
            // {
            //     //HelloQ.Run(qsim, int.MaxValue, int.MaxValue).Wait();
            //     TooManyQubits.Run(qsim).Wait();
            // }

            var tsim = new ToffoliSimulator(qubitCount: 500000);

            TooManyQubits.Run(tsim).Wait();

            var estimator = new ResourcesEstimator();

            TeleportClassicalMessage.Run(estimator, false).Wait();

            var data = estimator.Data;

            Console.WriteLine(estimator.ToTSV());
        }
示例#14
0
        /// <summary>
        /// Simulates a function/operation using the ToffoliSimulator as target machine.
        /// It expects a single input: the name of the function/operation to simulate.
        /// </summary>
        public async Task <ExecutionResult> RunAsync(string input, IChannel channel)
        {
            var inputParameters = ParseInputParameters(input, firstParameterInferredName: ParameterNameOperationName);

            var name   = inputParameters.DecodeParameter <string>(ParameterNameOperationName);
            var symbol = SymbolResolver.Resolve(name) as IQSharpSymbol;

            if (symbol == null)
            {
                throw new InvalidOperationException($"Invalid operation name: {name}");
            }

            var qsim = new ToffoliSimulator().WithStackTraceDisplay(channel);

            qsim.DisableLogToConsole();
            qsim.OnLog += channel.Stdout;

            var value = await symbol.Operation.RunAsync(qsim, inputParameters);

            return(value.ToExecutionResult());
        }
        public void ToffoliX()
        {
            var sim = new ToffoliSimulator();
            var x   = sim.Get <Intrinsic.X>();

            OperationsTestHelper.applyTestShell(sim, x, (q) =>
            {
                var measure = sim.Get <Intrinsic.M>();
                var set     = sim.Get <SetQubit>();

                set.Apply((Result.Zero, q));

                x.Apply(q);
                var result = measure.Apply(q);
                Assert.Equal(Result.One, result);

                x.Apply(q);
                result = measure.Apply(q);
                Assert.Equal(Result.Zero, result);

                x.Apply(q); // The test helper is going to apply another X before releasing
            });
示例#16
0
        public void ErrorLogTest()
        {
            ToffoliSimulator sim = new ToffoliSimulator();

            var logs = new List <string>();

            sim.OnLog += (msg) => logs.Add(msg);
            try
            {
                QVoid res = sim.Execute <AlwaysFail4, QVoid, QVoid>(QVoid.Instance);
            }
            catch (ExecutionFailException)
            {
                Assert.Equal(7, logs.Count);
                Assert.StartsWith("Unhandled exception. Microsoft.Quantum.Simulation.Core.ExecutionFailException: Always fail", logs[0]);
                Assert.StartsWith(" ---> Microsoft.Quantum.Simulation.Simulators.Tests.Circuits.AlwaysFail", logs[1]);
                Assert.StartsWith("   at Microsoft.Quantum.Simulation.Simulators.Tests.Circuits.AlwaysFail1 on", logs[2]);
                Assert.StartsWith("   at Microsoft.Quantum.Simulation.Simulators.Tests.Circuits.AlwaysFail2 on", logs[3]);
                Assert.StartsWith("   at Microsoft.Quantum.Simulation.Simulators.Tests.Circuits.AlwaysFail3 on", logs[4]);
                Assert.StartsWith("   at Microsoft.Quantum.Simulation.Simulators.Tests.Circuits.AlwaysFail4 on", logs[5]);
                Assert.Equal("", logs[6]);
            }
        }
示例#17
0
        static void Main(string[] args)
        {
            var sim = new ToffoliSimulator();
            var evaluationPoints = new QArray <double>(
                new double[] { 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6 }
                );
            var polynomialCoefficients = new QArray <double>(
                new double[] { 0.9992759725166501, -0.16566707016968898,
                               0.007958079331694682, -0.0001450780334861007 }
                );
            var odd  = true;
            var even = false;

            Debug.Assert(!(odd && even));
            System.Console.Write($"Evaluating P(x) = {polynomialCoefficients[0]}");
            if (odd)
            {
                System.Console.Write("*x");
            }
            for (int d = 1; d < polynomialCoefficients.Length; ++d)
            {
                System.Console.Write($" + {polynomialCoefficients[d]}*" +
                                     $"x^{d + (odd ? d+1 : 0) + (even ? d : 0)}");
            }
            System.Console.Write(".\n");
            int pointPos = 3;
            int numBits  = 64;
            var res      = EvaluatePolynomial.Run(sim, polynomialCoefficients,
                                                  evaluationPoints, numBits, pointPos,
                                                  odd, even).Result;

            for (int i = 0; i < res.Length; ++i)
            {
                System.Console.WriteLine($"P({evaluationPoints[i]}) = {res[i]}.  " +
                                         $"[sin(x) = {System.Math.Sin(evaluationPoints[i])}]");
            }
        }
示例#18
0
        public void CanSimulateWithAlternativeSimulator()
        {
            var sim = new ToffoliSimulator();

            TestQuantumSwap.Run(sim).Wait();
        }
        public void PartialFail1Test()
        {
            ToffoliSimulator sim = new ToffoliSimulator();

            {
                try
                {
                    QVoid res = PartialFail1.Run(sim).Result;
                }
                catch (AggregateException ex)
                {
                    Assert.True(ex.InnerException is ExecutionFailException);
                    StackFrame[] stackFrames = sim.CallStack;

                    Assert.Equal(3, stackFrames.Length);

                    Assert.Equal(namespacePrefix + "AlwaysFail", stackFrames[0].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialFail", stackFrames[1].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialFail1", stackFrames[2].Callable.FullName);

                    Assert.Equal(OperationFunctor.Body, stackFrames[0].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[1].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[2].Callable.Variant);

                    Assert.Equal(7, stackFrames[0].FailedLineNumber);
                    Assert.Equal(33, stackFrames[1].FailedLineNumber);
                    Assert.Equal(38, stackFrames[2].FailedLineNumber);
                }
            }

            {
                try
                {
                    QVoid res = PartialAdjFail1.Run(sim).Result;
                }
                catch (AggregateException ex)
                {
                    Assert.True(ex.InnerException is ExecutionFailException);
                    StackFrame[] stackFrames = sim.CallStack;

                    Assert.Equal(3, stackFrames.Length);

                    Assert.Equal(namespacePrefix + "AlwaysFail", stackFrames[0].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialFail", stackFrames[1].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialAdjFail1", stackFrames[2].Callable.FullName);

                    Assert.Equal(OperationFunctor.Adjoint, stackFrames[0].Callable.Variant);
                    Assert.Equal(OperationFunctor.Adjoint, stackFrames[1].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[2].Callable.Variant);

                    Assert.Equal(6, stackFrames[0].FailedLineNumber);
                    Assert.Equal(32, stackFrames[1].FailedLineNumber);
                    Assert.Equal(43, stackFrames[2].FailedLineNumber);
                }
            }

            {
                try
                {
                    QVoid res = PartialCtlFail1.Run(sim).Result;
                }
                catch (AggregateException ex)
                {
                    Assert.True(ex.InnerException is ExecutionFailException);
                    StackFrame[] stackFrames = sim.CallStack;

                    Assert.Equal(3, stackFrames.Length);

                    Assert.Equal(namespacePrefix + "AlwaysFail", stackFrames[0].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialFail", stackFrames[1].Callable.FullName);
                    Assert.Equal(namespacePrefix + "PartialCtlFail1", stackFrames[2].Callable.FullName);

                    Assert.Equal(OperationFunctor.Controlled, stackFrames[0].Callable.Variant);
                    Assert.Equal(OperationFunctor.Controlled, stackFrames[1].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[2].Callable.Variant);

                    Assert.Equal(6, stackFrames[0].FailedLineNumber);
                    Assert.Equal(32, stackFrames[1].FailedLineNumber);
                    Assert.Equal(48, stackFrames[2].FailedLineNumber);
                }
            }
        }
示例#20
0
        static void Main(string[] args)
        {
            var rng = new Random(5);

            // Binary integers of the form 1XXX0000000...
            var cases = new List <int>();

            for (var i = 8; i <= 2048; i <<= 1)
            {
                for (var j = 0; j < 8; j++)
                {
                    cases.Add(i + (i >> 3) * j);
                }
            }

            // Header column.
            Console.WriteLine($"{String.Join(", ", cases)}");
            var methods = new[] {
                "window",
                "legacy",
                "karatsuba"
            };
            var columns = new List <String>();

            columns.Add("n");
            foreach (var method in methods)
            {
                columns.Add(method + " " + "toffolis");
                columns.Add(method + " " + "qubits");
                columns.Add(method + " " + "depth");
            }
            Console.WriteLine(String.Join(", ", columns));

            // Collect data.
            foreach (var n in cases)
            {
                var tofCounts   = new double[methods.Length];
                var qubitCounts = new double[methods.Length];
                var depthCounts = new double[methods.Length];
                var reps        = Math.Max(1, Math.Min(10, 128 / n));

                for (int r = 0; r < reps; r++)
                {
                    for (int i = 0; i < methods.Length; i++)
                    {
                        var a = rng.NextBigInt(2 * n);
                        var b = rng.NextBigInt(n);
                        var c = rng.NextBigInt(n);

                        var tof_sim    = new ToffoliSimulator();
                        var tof_output = RunPlusEqualProductMethod.Run(tof_sim, a, b, c, methods[i]).Result;

                        var config = new QCTraceSimulatorConfiguration();
                        config.usePrimitiveOperationsCounter = true;
                        config.useWidthCounter = true;
                        config.useDepthCounter = true;
                        var trace_sim    = new QCTraceSimulator(config);
                        var trace_output = RunPlusEqualProductMethod.Run(trace_sim, a, b, c, methods[i]).Result;

                        if (tof_output != a + b * c || trace_output != tof_output)
                        {
                            throw new ArithmeticException($"Wrong result using {methods[i]}. {a}+{b}*{c} == {a+b*c} != {tof_output} or {trace_output}.");
                        }

                        tofCounts[i]   += trace_sim.GetMetric <RunPlusEqualProductMethod>(PrimitiveOperationsGroupsNames.T) / 7;
                        qubitCounts[i] += trace_sim.GetMetric <RunPlusEqualProductMethod>(MetricsNames.WidthCounter.ExtraWidth);
                        depthCounts[i] += trace_sim.GetMetric <RunPlusEqualProductMethod>(MetricsNames.DepthCounter.Depth);
                    }
                }

                // Output row of results.
                var data = new List <double>();
                data.Add(n);
                for (var i = 0; i < methods.Length; i++)
                {
                    data.Add(tofCounts[i] / reps);
                    data.Add(qubitCounts[i] / reps);
                    data.Add(depthCounts[i] / reps);
                }
                Console.WriteLine(String.Join(", ", data));
            }
        }