public void ControlledCNOT()
        {
            IQArray <Qubit> controls = new QArray <Qubit>(new[] { new FreeQubit(0) });
            Qubit           control  = new FreeQubit(1);
            Qubit           target   = new FreeQubit(2);
            var             op       = new QuantumSimulator().Get <Intrinsic.CNOT>().Controlled;
            var             args     = op.__dataIn((controls, (control, target)));
            var             expected = new RuntimeMetadata()
            {
                Label = "X",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = true,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = controls.Append(control),
                Targets  = new List <Qubit>()
                {
                    target
                },
            };

            Assert.Equal(op.GetRuntimeMetadata(args), expected);
        }
        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 void Reset()
        {
            var target   = new FreeQubit(0);
            var op       = new QuantumSimulator().Get <Intrinsic.Reset>();
            var args     = op.__dataIn(target);
            var expected = new RuntimeMetadata()
            {
                Label = "Reset",
                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 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 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);
        }
Example #6
0
        public void CZ()
        {
            var control  = new MockQubit(1);
            var target   = new MockQubit(0);
            var op       = new Microsoft.Quantum.Canon.CZ(new QuantumSimulator());
            var args     = op.__DataIn__((control, target));
            var expected = new RuntimeMetadata()
            {
                Label = "Z",
                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 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 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 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 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 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 TargetsEquality()
        {
            var a = new RuntimeMetadata()
            {
                Targets = new List <Qubit>()
                {
                },
            };
            var b = new RuntimeMetadata()
            {
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(a, b);
            Assert.Equal(a.GetHashCode(), b.GetHashCode());

            b.Targets = new List <Qubit>()
            {
                new FreeQubit(1)
            };
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());

            a.Targets = new List <Qubit>()
            {
                new FreeQubit(1)
            };
            Assert.Equal(a, b);
            Assert.Equal(a.GetHashCode(), b.GetHashCode());
        }
        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 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 WrongType()
        {
            var a = new RuntimeMetadata {
            };
            var i = 5;

            Assert.False(a.Equals(i));
        }
        public void NullEquality()
        {
            var a             = new RuntimeMetadata {
            };
            RuntimeMetadata?b = null;

            Assert.NotEqual(a, b);
            Assert.NotEqual(b, a);
        }
        public void ApplyToEachCA()
        {
            var             op       = new Microsoft.Quantum.Canon.ApplyToEachCA <Qubit>(new QuantumSimulator());
            var             baseOp   = new Microsoft.Quantum.Intrinsic.I(new QuantumSimulator());
            IQArray <Qubit> targets  = new QArray <Qubit>(new Qubit[] { });
            var             args     = op.__DataIn__((baseOp, targets));
            var             expected = new RuntimeMetadata()
            {
                Label = "ApplyToEachCA",
                FormattedNonQubitArgs = "(I)",
                IsComposite           = true,
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(expected, op.GetRuntimeMetadata(args));
        }
Example #19
0
        public void ForEach()
        {
            var             op       = new Microsoft.Quantum.Arrays.ForEach <Qubit, Result>(new QuantumSimulator());
            var             baseOp   = new Microsoft.Quantum.Intrinsic.M(new QuantumSimulator());
            IQArray <Qubit> targets  = new QArray <Qubit>(new Qubit[] { });
            var             args     = op.__dataIn((baseOp, targets));
            var             expected = new RuntimeMetadata()
            {
                Label = "ForEach",
                FormattedNonQubitArgs = "(M)",
                IsComposite           = true,
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(expected, op.GetRuntimeMetadata(args));
        }
        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 EmptyOperation()
        {
            var measureQubit = new FreeQubit(0);
            var op           = new QuantumSimulator().Get <Circuits.Empty>();
            var args         = op.__dataIn(QVoid.Instance);
            var expected     = new RuntimeMetadata()
            {
                Label = "Empty",
                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 void CheckEquality()
        {
            var a = new RuntimeMetadata()
            {
                Label = "H",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                },
            };
            var b = new RuntimeMetadata()
            {
                Label = "H",
                FormattedNonQubitArgs = "",
                IsAdjoint             = false,
                IsControlled          = false,
                IsMeasurement         = false,
                IsComposite           = false,
                Children = null,
                Controls = new List <Qubit>()
                {
                },
                Targets = new List <Qubit>()
                {
                },
            };

            Assert.Equal(a, b);
            Assert.Equal(a.GetHashCode(), b.GetHashCode());

            b.Label = "X";
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.Label = "H";

            b.FormattedNonQubitArgs = "(1)";
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.FormattedNonQubitArgs = "";

            b.IsAdjoint = true;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.IsAdjoint = false;

            b.IsControlled = true;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.IsControlled = false;

            b.IsMeasurement = true;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.IsMeasurement = false;

            b.IsComposite = true;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
            b.IsComposite = false;
        }
        public void ChildrenEquality()
        {
            var a = new RuntimeMetadata()
            {
                Children = new[]
                {
                    new List <RuntimeMetadata>(),
                    new List <RuntimeMetadata>(),
                },
            };
            var b = new RuntimeMetadata()
            {
                Children = new[]
                {
                    new List <RuntimeMetadata>(),
                    new List <RuntimeMetadata>(),
                },
            };

            Assert.Equal(a, b);
            Assert.Equal(a.GetHashCode(), b.GetHashCode());

            var aChildren = a.Children.ToList();

            aChildren[0] = new List <RuntimeMetadata>()
            {
                new RuntimeMetadata()
                {
                    Label = "H"
                }
            };
            a.Children = aChildren;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());

            var bChildren = b.Children.ToList();

            bChildren[0] = new List <RuntimeMetadata>()
            {
                new RuntimeMetadata()
                {
                    Label = "X"
                }
            };
            b.Children = bChildren;
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());

            bChildren[0] = new List <RuntimeMetadata>()
            {
                new RuntimeMetadata()
                {
                    Label = "H"
                }
            };
            Assert.Equal(a, b);
            Assert.Equal(a.GetHashCode(), b.GetHashCode());

            b.Children = b.Children.SkipLast(1);
            Assert.NotEqual(a, b);
            Assert.NotEqual(a.GetHashCode(), b.GetHashCode());
        }