Esempio n. 1
0
 public void GenericsCallableCasts()
 {
     Helper.RunWithMultipleSimulators((s) =>
     {
         CCNOTCiruitsTest.Run(s).Wait();
         var stracer = s.GetTracer <string>();
         Assert.Equal(1, stracer.Log.GetNumberOfCalls(OperationFunctor.Body, ("success!")));
     });
 }
Esempio n. 2
0
        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 = CCNOTCiruitsTest.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 <Primitive.S, UpToPhaseCCNOT3>(
                    Tcount,
                    functor: Simulation.Core.OperationFunctor.ControlledAdjoint)
                + sim.GetMetric <Primitive.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 (KeyValuePair <string, string> collectedData in sim.ToCSV())
            {
                File.WriteAllText(
                    $"{directory}\\CCNOTCircuitsMetrics.{collectedData.Key}.csv",
                    collectedData.Value);
            }
        }