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)}"); }
[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); } }