public void GenericsCallableCasts() { Helper.RunWithMultipleSimulators((s) => { CCNOTCiruitsTest.Run(s).Wait(); var stracer = s.GetTracer <string>(); Assert.Equal(1, stracer.Log.GetNumberOfCalls(OperationFunctor.Body, ("success!"))); }); }
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); } }