public void QrackSimVerifyPrimitivesCompleteness()
        {
            using (var sim = new QrackSimulator())
            {
                var ops =
                    from op in typeof(Intrinsic.X).Assembly.GetExportedTypes()
                    where op.IsSubclassOf(typeof(AbstractCallable))
                    where !op.IsNested
                    select op;

                var missing = new List <Type>();

                foreach (var op in ops)
                {
                    try
                    {
                        var i = sim.GetInstance(op);
                        Assert.NotNull(i);
                    }
                    catch (Exception)
                    {
                        missing.Add(op);
                    }
                }

                Assert.Empty(missing);
            }
        }
 public void QrackSimConstructor()
 {
     using (var subject = new QrackSimulator())
     {
         Assert.Equal("Qrack Simulator", subject.Name);
     }
 }
        public void Swap()
        {
            var q1       = new FreeQubit(0);
            var q2       = new FreeQubit(1);
            var op       = new QrackSimulator().Get <Intrinsic.SWAP>();
            var args     = op.__DataIn__((q1, q2));
            var expected = new RuntimeMetadata()
            {
                Label = "SWAP",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    q1, q2
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
 public void QrackSimTestTarget(TestOperation op)
 {
     using (var sim = new QrackSimulator(throwOnReleasingQubitsNotInZeroState: true))
     {
         op.TestOperationRunner(sim);
     }
 }
        public void OperationAsArgument()
        {
            var q        = new FreeQubit(0);
            var opArg    = new QrackSimulator().Get <Circuits.HOp>();
            var op       = new QrackSimulator().Get <Circuits.WrapperOp>();
            var args     = op.__DataIn__((opArg, q));
            var expected = new RuntimeMetadata()
            {
                Label = "WrapperOp",
                FormattedNonQubitArgs = "(HOp)",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    q
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void ControlledCCNOT()
        {
            Qubit           control1 = new FreeQubit(0);
            Qubit           control2 = new FreeQubit(1);
            Qubit           control3 = new FreeQubit(2);
            Qubit           target   = new FreeQubit(3);
            IQArray <Qubit> controls = new QArray <Qubit>(new[] { control1 });
            var             op       = new QrackSimulator().Get <Intrinsic.CCNOT>().Controlled;
            var             args     = op.__DataIn__((controls, (control2, control3, target)));
            var             expected = new RuntimeMetadata()
            {
                Label = "X",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = true,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                    control1, control2, control3
                },
                Targets = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void FooUDTOp()
        {
            Qubit target   = new FreeQubit(0);
            var   op       = new QrackSimulator().Get <Tests.Circuits.FooUDTOp>();
            var   args     = op.__DataIn__(new Circuits.FooUDT(("bar", (target, 2.1))));
            var   expected = new RuntimeMetadata()
            {
                Label = "FooUDTOp",
                FormattedNonQubitArgs = "(\"bar\", (" + 2.1 + "))",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void CNOT()
        {
            var control  = new FreeQubit(1);
            var target   = new FreeQubit(0);
            var op       = new QrackSimulator().Get <Intrinsic.CNOT>();
            var args     = op.__DataIn__((control, target));
            var expected = new RuntimeMetadata()
            {
                Label = "X",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = true,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                    control
                },
                Targets = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void AdjointAdjointH()
        {
            Qubit target   = new FreeQubit(0);
            var   op       = new QrackSimulator().Get <Intrinsic.H>().Adjoint.Adjoint;
            var   args     = op.__DataIn__(target);
            var   expected = new RuntimeMetadata()
            {
                Label = "H",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void PartialRy()
        {
            var target = new FreeQubit(0);
            var op     = new QrackSimulator().Get <Intrinsic.Ry>().Partial((double d) =>
                                                                           new ValueTuple <double, Qubit>(d, target));
            var args     = op.__DataIn__(2.1);
            var expected = new RuntimeMetadata()
            {
                Label = "Ry",
                FormattedNonQubitArgs = "(" + 2.1 + ")",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void ControlledAdjointAdjointH()
        {
            IQArray <Qubit> controls = new QArray <Qubit>(new[] { new FreeQubit(0) });
            Qubit           target   = new FreeQubit(1);
            var             op1      = new QrackSimulator().Get <Intrinsic.H>().Controlled.Adjoint.Adjoint;
            var             op2      = new QrackSimulator().Get <Intrinsic.H>().Adjoint.Controlled.Adjoint;
            var             op3      = new QrackSimulator().Get <Intrinsic.H>().Adjoint.Adjoint.Controlled;
            var             args     = op1.__DataIn__((controls, target));
            var             expected = new RuntimeMetadata()
            {
                Label = "H",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = true,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = controls,
                Targets  = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op1.GetRuntimeMetadata(args), expected);
            Assert.Equal(op2.GetRuntimeMetadata(args), expected);
            Assert.Equal(op3.GetRuntimeMetadata(args), expected);
        }
        public void AllocateQubit2Test()
        {
            using var sim = new QrackSimulator();
            try
            {
                IgnorableAssert.Disable();
                QVoid res = sim.Execute <AllocateQubit2, QVoid, QVoid>(QVoid.Instance);
            }
            catch (ExecutionFailException)
            {
                var stackFrames = sim.CallStack;

                // Make sure that the call stack isn't null before proceeding.
                Assert.NotNull(stackFrames);

                // The following assumes that Assert is on Q# stack.
                Assert.Equal(2, stackFrames !.Length);

                Assert.Equal("Microsoft.Quantum.Diagnostics.AssertMeasurementProbability", stackFrames[0].Callable.FullName);
                Assert.Equal(namespacePrefix + "AllocateQubit2", stackFrames[1].Callable.FullName);

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

                Assert.Equal(94, stackFrames[1].FailedLineNumber);
            }
            finally
            {
                IgnorableAssert.Enable();
            }
        }
        public async Task ReallocateQubitInGroundStateTest()
        {
            var sim = new QrackSimulator();
            var allocate = sim.Get<Intrinsic.Allocate>();
            var release = sim.Get<Intrinsic.Release>();
            var q1 = allocate.Apply(1);
            var q1Id = q1[0].Id;
            var gate = sim.Get<Intrinsic.X>();
            var measure = sim.Get<Intrinsic.M>();
            gate.Apply(q1[0]);
            var result1 = measure.Apply(q1[0]);
            //Check X operation
            Assert.Equal(result1, Result.One);
            release.Apply(q1[0]);
            var q2 = allocate.Apply(1);
            var q2Id = q2[0].Id;
            //Assert reallocated qubit has the same id as the one released
            Assert.Equal(q1Id, q2Id);
            var result2 = measure.Apply(q2[0]);
            //Assert reallocated qubit has is initialized in state |0>
            Assert.Equal(result2, Result.Zero);


            
        }
        public void PartialUDT()
        {
            var target = new FreeQubit(0);
            var op     = new QrackSimulator().Get <ICallable <(String, (Qubit, Double)), Circuits.FooUDT> >(typeof(Circuits.FooUDT))
                         .Partial <double>((double d) => (("bar", (target, d))));
            var args     = new QTuple <double>(2.1);
            var expected = new RuntimeMetadata()
            {
                Label = "FooUDT",
                FormattedNonQubitArgs = "(\"bar\", (" + 2.1 + "))",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public async Task MeasuredQubitReleaseTest()
        {
            var sim = new QrackSimulator();

            //should not throw an exception, as Measured qubits are allowed to be released, and the release aspect is handled in the C++ code
            await ReleaseMeasuredQubitCheck.Run(sim);
        }
        public void DuplicateQubitArgs()
        {
            var q        = new FreeQubit(0);
            var op       = new QrackSimulator().Get <Circuits.TwoQubitOp>();
            var args     = op.__DataIn__((q, q));
            var expected = new RuntimeMetadata()
            {
                Label = "TwoQubitOp",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    q
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void MResetZ()
        {
            var measureQubit = new FreeQubit(0);
            var op           = new QrackSimulator().Get <Measurement.MResetZ>();
            var args         = op.__DataIn__(measureQubit);
            var expected     = new RuntimeMetadata()
            {
                Label = "MResetZ",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = true,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                    measureQubit
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void AlwaysFail4Test()
        {
            using (var sim = new QrackSimulator())
            {
                try
                {
                    QVoid res = AlwaysFail4.Run(sim).Result;
                }
                catch (AggregateException ex)
                {
                    Assert.True(ex.InnerException is ExecutionFailException);

                    StackFrame[] stackFrames = sim.CallStack;

                    Assert.Equal(5, stackFrames.Length);

                    Assert.Equal(namespacePrefix + "AlwaysFail", stackFrames[0].Callable.FullName);
                    Assert.Equal(namespacePrefix + "AlwaysFail1", stackFrames[1].Callable.FullName);
                    Assert.Equal(namespacePrefix + "AlwaysFail2", stackFrames[2].Callable.FullName);
                    Assert.Equal(namespacePrefix + "AlwaysFail3", stackFrames[3].Callable.FullName);
                    Assert.Equal(namespacePrefix + "AlwaysFail4", stackFrames[4].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(OperationFunctor.Adjoint, stackFrames[3].Callable.Variant);
                    Assert.Equal(OperationFunctor.Body, stackFrames[4].Callable.Variant);

                    Assert.Equal(14, stackFrames[2].FailedLineNumber);
                    Assert.Equal(21, stackFrames[4].FailedLineNumber);

                    // For Adjoint and Controlled we expect failedLineNumber to be equal to declarationStartLineNumber
                    Assert.Equal(stackFrames[0].DeclarationStartLineNumber, stackFrames[0].FailedLineNumber);
                    Assert.Equal(stackFrames[1].DeclarationStartLineNumber, stackFrames[1].FailedLineNumber);
                    Assert.Equal(stackFrames[3].DeclarationStartLineNumber, stackFrames[3].FailedLineNumber);

                    for (int i = 0; i < stackFrames.Length; ++i)
                    {
                        Assert.StartsWith(@"https://github.com/", stackFrames[i].GetURLFromPDB());
                        Assert.EndsWith($"#L{stackFrames[i].FailedLineNumber}", stackFrames[i].GetURLFromPDB());
                    }

                    StringBuilder builder = new StringBuilder();
                    builder.Append("13 ".PadLeft(PortablePDBEmbeddedFilesCache.lineNumberPaddingWidth));
                    builder.AppendLine("    operation AlwaysFail2() : Unit is Adj + Ctl {");
                    builder.Append("14 ".PadLeft(PortablePDBEmbeddedFilesCache.lineNumberPaddingWidth) + PortablePDBEmbeddedFilesCache.lineMarkPrefix);
                    builder.AppendLine("        Controlled AlwaysFail1(new Qubit[0],());");
                    builder.Append("15 ".PadLeft(PortablePDBEmbeddedFilesCache.lineNumberPaddingWidth));
                    builder.AppendLine("    }");
                    Assert.Equal(builder.ToString(), stackFrames[2].GetOperationSourceFromPDB());

                    for (int i = 0; i < stackFrames.Length; ++i)
                    {
                        output.WriteLine($"operation:{stackFrames[i].Callable.FullName}");
                        output.WriteLine(stackFrames[i].GetOperationSourceFromPDB());
                    }
                }
            }
        }
 //[OperationDriver(TestCasePrefix = "QrackSim:", TestNamespace = "Microsoft.Quantum.Simulation.TestSuite.VeryLong")]
 private void QrackSimTestTargetVeryLong(TestOperation op)
 {
     using (var sim = new QrackSimulator(throwOnReleasingQubitsNotInZeroState: true))
     {
         sim.OnLog += (msg) => { output.WriteLine(msg); };
         op.TestOperationRunner(sim);
     }
 }
Beispiel #20
0
        public void OperationTypes()
        {
            var op = new QrackSimulator().Get <Intrinsic.H>();

            Assert.Equal("H", op.GetNonQubitArgumentsAsString());

            var op2 = new QrackSimulator().Get <Intrinsic.CNOT>();

            Assert.Equal("CNOT", op2.GetNonQubitArgumentsAsString());
        }
Beispiel #21
0
        public void TupleTypes()
        {
            Assert.Equal("(1, 2)", (1, 2).GetNonQubitArgumentsAsString());
            Assert.Equal("(\"foo\", \"bar\")", ("foo", "bar").GetNonQubitArgumentsAsString());
            Assert.Equal("(\"foo\", \"bar\", \"\")", ("foo", "bar", "").GetNonQubitArgumentsAsString());
            Assert.Equal("(\"foo\", (\"bar\", \"car\"))", ("foo", ("bar", "car")).GetNonQubitArgumentsAsString());
            Assert.Equal("((\"foo\"), (\"bar\", \"car\"))", (("foo", new FreeQubit(0)), ("bar", "car")).GetNonQubitArgumentsAsString());

            var op      = new QrackSimulator().Get <Intrinsic.H>();
            var opTuple = new QTuple <(ICallable, string)>((op, "foo"));

            Assert.Equal("(H, \"foo\")", opTuple.GetNonQubitArgumentsAsString());

            var qtuple = new QTuple <(Qubit, string)>((new FreeQubit(0), "foo"));

            Assert.Equal("(\"foo\")", qtuple.GetNonQubitArgumentsAsString());
        }
 public void QrackSimTestTargetFailures(TestOperation op)
 {
     using (var sim = new QrackSimulator(throwOnReleasingQubitsNotInZeroState: true))
     {
         sim.OnLog += (msg) => { output.WriteLine(msg); };
         Action action    = () => op.TestOperationRunner(sim);
         bool   hasThrown = false;
         try
         {
             action.IgnoreDebugAssert();
         }
         catch (ExecutionFailException)
         {
             hasThrown = true;
         }
         Assert.True(hasThrown, "The operation was known to throw. It does not throw anymore. Congratulations ! You fixed the bug.");
     }
 }
        public void QrackSimX()
        {
            using (var sim = new QrackSimulator(throwOnReleasingQubitsNotInZeroState: false))
            {
                var x       = sim.Get <Intrinsic.X>();
                var measure = sim.Get <Intrinsic.M>();
                var set     = sim.Get <Measurement.SetToBasisState>();

                var ctrlX = x.__ControlledBody__.AsAction();
                OperationsTestHelper.ctrlTestShell(sim, ctrlX, (enabled, ctrls, q) =>
                {
                    set.Apply((Result.Zero, q));
                    var result   = measure.Apply(q);
                    var expected = Result.Zero;
                    Assert.Equal(expected, result);

                    x.__ControlledBody__((ctrls, q));
                    result   = measure.Apply(q);
                    expected = (enabled) ? Result.One : Result.Zero;
                    Assert.Equal(expected, result);
                });
        public void ResetAll()
        {
            IQArray <Qubit> targets  = new QArray <Qubit>(new[] { new FreeQubit(0) });
            var             op       = new QrackSimulator().Get <Intrinsic.ResetAll>();
            var             args     = op.__DataIn__(targets);
            var             expected = new RuntimeMetadata()
            {
                Label = "ResetAll",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = true,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = targets,
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void NestedOperation()
        {
            var op       = new QrackSimulator().Get <Circuits.NestedOp>();
            var args     = op.__DataIn__(QVoid.Instance);
            var expected = new RuntimeMetadata()
            {
                Label = "NestedOp",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public void QArrayArgs()
        {
            var op = new QrackSimulator().Get <Circuits.BoolArrayOp>();
            IQArray <Boolean> bits = new QArray <Boolean>(new bool[] { false, true });
            var args     = op.__DataIn__(bits);
            var expected = new RuntimeMetadata()
            {
                Label = "BoolArrayOp",
                FormattedNonQubitArgs = "[False, True]",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        public async Task MeasuredMultipleQubitsReleaseTest()
        {
            var sim = new QrackSimulator();

            await Assert.ThrowsAsync<ReleasedQubitsAreNotInZeroState>(() => ReleaseMeasureMultipleQubitCheck.Run(sim));
        }
        public async Task ZeroStateQubitReleaseTest()
        {
            var sim = new QrackSimulator();

            await Assert.ThrowsAsync<ReleasedQubitsAreNotInZeroState>(() => UsingQubitCheck.Run(sim));
        }