Exemple #1
0
        public void ControlledSWAPMetricsTest()
        {
            // Get an instance of the appropriately configured QCTraceSimulator
            QCTraceSimulator sim = MetricCalculationUtils.GetSimulatorForMetricsCalculation();

            // Run tests against trace simulator to collect metrics
            var result = ControlledSWAPTest.Run(sim).Result;

            // Let us check that number of T gates in all the circuits is as expected
            string Tcount = PrimitiveOperationsGroupsNames.T;

            Assert.Equal(7, sim.GetMetric <ControlledSWAP1, CollectMetrics>(Tcount));
            Assert.Equal(7, sim.GetMetric <ControlledSWAPUsingCCNOT, CollectMetrics>(Tcount));

            // Let us check the number of CNOT gates
            Assert.Equal(8, sim.GetMetric <ControlledSWAP1, CollectMetrics>(
                             PrimitiveOperationsGroupsNames.CNOT));
            // Number of single qubit Clifford gates
            Assert.Equal(2, sim.GetMetric <ControlledSWAP1, CollectMetrics>(
                             PrimitiveOperationsGroupsNames.QubitClifford));

            // And T depth
            Assert.Equal(4, sim.GetMetric <ControlledSWAP1, CollectMetrics>(
                             MetricsNames.DepthCounter.Depth));
        }
        public void RepeatUntilSuccessCircuitsMetricsTest()
        {
            // Get an instance of the appropriately configured QCTraceSimulator
            QCTraceSimulator sim = MetricCalculationUtils.GetSimulatorForMetricsCalculation();

            // Run tests against trace simulator to collect metrics
            var result = RepeatUntilSuccessCircuitsTest.Run(sim).Result;

            string TCount      = PrimitiveOperationsGroupsNames.T;
            string extraQubits = MetricsNames.WidthCounter.ExtraWidth;
            string min         = StatisticsNames.Min;
            string max         = StatisticsNames.Max;
            string avg         = StatisticsNames.Average;

            // Let us check how many ancillas we used
            // 4 for Nielsen & Chuang
            // version because we used CCNOT3 which itself required 2 ancillas
            Assert.Equal(4, sim.GetMetric <ExpIZArcTan2NC, caller>(extraQubits));
            // 2 for Paetznick & Svore version
            Assert.Equal(2, sim.GetMetric <ExpIZArcTan2PS, caller>(extraQubits));

            // One trial of ExpIZArcTan2NC requires at least 8 T gates
            Assert.True(8 <= sim.GetMetricStatistic <ExpIZArcTan2NC, caller>(TCount, min));

            // One trial of ExpIZArcTan2NC requires at least 3 T gates
            Assert.True(3 <= sim.GetMetricStatistic <ExpIZArcTan2PS, caller>(TCount, min));

            // The rest of the statistical information we print into test output
            // For ExpIZArcTan2NC:
            output.WriteLine($"Statistics collected for{nameof(ExpIZArcTan2NC)}");
            output.WriteLine($"Average number of T-gates:" +
                             $" {sim.GetMetricStatistic<ExpIZArcTan2NC, caller>(TCount, avg)}");
            output.WriteLine($"Minimal number of T-gates: " +
                             $"{sim.GetMetricStatistic<ExpIZArcTan2NC, caller>(TCount, min)}");
            output.WriteLine($"Maximal number of T-gates: " +
                             $"{sim.GetMetricStatistic<ExpIZArcTan2NC, caller>(TCount, max)}");

            // And for ExpIZArcTan2PS
            output.WriteLine($"Statistics collected for{nameof(ExpIZArcTan2PS)}");
            output.WriteLine($"Average number of T-gates:" +
                             $" {sim.GetMetricStatistic<ExpIZArcTan2PS, caller>(TCount, avg)}");
            output.WriteLine($"Minimal number of T-gates: " +
                             $"{sim.GetMetricStatistic<ExpIZArcTan2PS, caller>(TCount, min)}");
            output.WriteLine($"Maximal number of T-gates: " +
                             $"{sim.GetMetricStatistic<ExpIZArcTan2PS, caller>(TCount, max)}");
        }
Exemple #3
0
        [InlineData(2017L)] // numberOfControlQubits = 4,5,2017
        public void MultiControlledNOTMetricsTest(long numberOfControlQubits)
        {
            // Get an instance of the appropriately configured QCTraceSimulator
            QCTraceSimulator sim = MetricCalculationUtils.GetSimulatorForMetricsCalculation();

            // Run tests against trace simulator to collect metrics
            var result =
                MultiControlledNotWithDirtyQubitsMetrics.Run(sim, numberOfControlQubits).Result;

            string borrowedQubits  = MetricsNames.WidthCounter.BorrowedWith;
            string allocatedQubits = MetricsNames.WidthCounter.ExtraWidth;

            // Get the number of qubits borrowed by the MultiControlledXBorrow
            double numBorowed1 =
                sim.GetMetric <MultiControlledXBorrow, MultiControlledNotWithDirtyQubitsMetrics>(
                    borrowedQubits);

            // Get the number of qubits allocated by the MultiControlledXBorrow
            double numAllocated1 =
                sim.GetMetric <MultiControlledXBorrow, MultiControlledNotWithDirtyQubitsMetrics>(
                    allocatedQubits);

            Assert.Equal(numberOfControlQubits - 2, numBorowed1);
            Assert.Equal(0, numAllocated1);

            // Get the number of qubits borrowed by the MultiControlledXClean
            double numBorowed2 =
                sim.GetMetric <MultiControlledXClean, MultiControlledNotWithDirtyQubitsMetrics>(
                    borrowedQubits);

            // Get the number of qubits allocated by the MultiControlledXClean
            double numAllocated2 =
                sim.GetMetric <MultiControlledXClean, MultiControlledNotWithDirtyQubitsMetrics>(
                    allocatedQubits);

            Assert.Equal(numberOfControlQubits - 2, numAllocated2);
            Assert.Equal(0, numBorowed2);
        }
        public void CCNOTCircuitsMetricsTest()
        {
            // Get an instance of the appropriately configured QCTraceSimulator
            QCTraceSimulator sim = MetricCalculationUtils.GetSimulatorForMetricsCalculation();

            // Run tests against trace simulator to collect metrics
            var result1 = CCNOTCircuitsTest.Run(sim).Result;

            // Let us check that number of T gates in all the circuits is as expected
            string Tcount = PrimitiveOperationsGroupsNames.T;

            // group of circuits with 7 T gates
            Assert.Equal(7, sim.GetMetric <TDepthOneCCNOT, CollectMetrics>(Tcount));
            Assert.Equal(7, sim.GetMetric <CCNOT1, CollectMetrics>(Tcount));
            Assert.Equal(7, sim.GetMetric <CCNOT2, CollectMetrics>(Tcount));
            Assert.Equal(7, sim.GetMetric <CCNOT4, CollectMetrics>(Tcount));

            // group of circuits with 4 T gates
            Assert.Equal(4, sim.GetMetric <CCNOT3, CollectMetrics>(Tcount));
            Assert.Equal(4, sim.GetMetric <UpToPhaseCCNOT1, CollectMetrics>(Tcount));
            Assert.Equal(4, sim.GetMetric <UpToPhaseCCNOT2, CollectMetrics>(Tcount));

            // For UpToPhaseCCNOT3 the number of T gates in it is the number of T
            // gates used in CCNOT plus the number of T gates in Controlled-S
            double expectedTcount =
                sim.GetMetric <Intrinsic.S, UpToPhaseCCNOT3>(
                    Tcount,
                    functor: Simulation.Core.OperationFunctor.ControlledAdjoint)
                + sim.GetMetric <Intrinsic.CCNOT, UpToPhaseCCNOT3>(Tcount);

            Assert.Equal(
                expectedTcount,
                sim.GetMetric <UpToPhaseCCNOT3, CollectMetrics>(Tcount));

            // The number of extra qubits used by the circuits
            string extraQubits = MetricsNames.WidthCounter.ExtraWidth;

            Assert.Equal(4, sim.GetMetric <TDepthOneCCNOT, CollectMetrics>(extraQubits));

            Assert.Equal(0, sim.GetMetric <CCNOT1, CollectMetrics>(extraQubits));
            Assert.Equal(0, sim.GetMetric <CCNOT2, CollectMetrics>(extraQubits));
            Assert.Equal(0, sim.GetMetric <CCNOT4, CollectMetrics>(extraQubits));
            Assert.Equal(0, sim.GetMetric <UpToPhaseCCNOT1, CollectMetrics>(extraQubits));

            Assert.Equal(2, sim.GetMetric <CCNOT3, CollectMetrics>(extraQubits));
            Assert.Equal(1, sim.GetMetric <UpToPhaseCCNOT2, CollectMetrics>(extraQubits));

            // All of the CCNOT circuit take 3 qubits as an input
            string inputQubits = MetricsNames.WidthCounter.InputWidth;

            Assert.Equal(3, sim.GetMetric <TDepthOneCCNOT, CollectMetrics>(inputQubits));
            Assert.Equal(3, sim.GetMetric <CCNOT1, CollectMetrics>(inputQubits));
            Assert.Equal(3, sim.GetMetric <CCNOT2, CollectMetrics>(inputQubits));
            Assert.Equal(3, sim.GetMetric <UpToPhaseCCNOT1, CollectMetrics>(inputQubits));
            Assert.Equal(3, sim.GetMetric <CCNOT3, CollectMetrics>(inputQubits));
            Assert.Equal(3, sim.GetMetric <UpToPhaseCCNOT2, CollectMetrics>(inputQubits));

            // CCNOT3 uses one measurement
            Assert.Equal(
                1,
                sim.GetMetric <CCNOT3, CollectMetrics>(PrimitiveOperationsGroupsNames.Measure));

            // Finally, let us check T depth of various CCNOT circuits:
            string tDepth = MetricsNames.DepthCounter.Depth;

            Assert.Equal(1, sim.GetMetric <TDepthOneCCNOT, CollectMetrics>(tDepth));
            Assert.Equal(1, sim.GetMetric <CCNOT3, CollectMetrics>(tDepth));
            Assert.Equal(1, sim.GetMetric <UpToPhaseCCNOT2, CollectMetrics>(tDepth));
            Assert.Equal(4, sim.GetMetric <CCNOT2, CollectMetrics>(tDepth));
            Assert.Equal(5, sim.GetMetric <CCNOT4, CollectMetrics>(tDepth));
            Assert.Equal(5, sim.GetMetric <CCNOT1, CollectMetrics>(tDepth));

            // Finally we write all the collected statistics into CSV files
            string directory = Directory.GetCurrentDirectory();

            output.WriteLine($"Writing all collected metrics result to" +
                             $" {directory}");

            foreach (var collectedData in sim.ToCSV())
            {
                File.WriteAllText(
                    Path.Combine(directory, "CCNOTCircuitsMetrics.{collectedData.Key}.csv"),
                    collectedData.Value);
            }
        }