コード例 #1
0
        /// <summary>
        /// Transform the given circuit for the given architecture with given mapping.
        /// </summary>
        /// <param name="circuit"> The dependency graph of the circuit to transform. </param>
        /// <param name="architecture"> The architecture to be used. </param>
        /// <param name="mapping"> The initial mapping to use during transformation. </param>
        /// <returns>
        /// A physical circuit which is equivalent to the given logical circuit
        /// and fits on the given architecture using the given mapping.
        /// </returns>
        public PhysicalCircuit Execute(LogicalCircuit circuit, Architecture architecture, Mapping mapping)
        {
            LogicalCircuit  = circuit;
            Architecture    = architecture;
            Mapping         = mapping;
            PhysicalCircuit = new PhysicalCircuit(architecture);

            SetUp();
            Execute();
            return(PhysicalCircuit);
        }
 /// <summary>
 /// Execute this naive transformation algorithm.
 /// </summary>
 protected override void Execute()
 {
     // TODO naive transformation
     foreach (Gate g in LogicalCircuit.Gates)
     {
         if (!g.CanBeExecutedOn(Architecture, Mapping))
         {
             List <int> path = Architecture.GetShortestPath(g.GetQubits()[0], g.GetQubits()[1]); // Is always a cnot gate normally
             for (int i = path.Count - 1; i >= 1; i--)
             {
                 AddSwapToCircuit(Mapping.Map[path[i]], Mapping.Map[path[i - 1]]);
             }
         }
         PhysicalCircuit.AddGate(g.Map(Mapping));
     }
 }
 /// <summary>
 /// See <see cref="Architecture.AddSwapGates(PhysicalCircuit, Swap)"/>.
 /// </summary>
 public override void AddSwapGates(PhysicalCircuit circuit, Swap swap)
 {
     if (HasConnection(swap.Qubit1, swap.Qubit2))
     {
         circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit2));
         circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit2));
         circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2));
     }
     else
     {
         circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit2));
         circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit1));
         circuit.AddGate(U3.GetHadamardGate(swap.Qubit2));
         circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1));
     }
 }
コード例 #4
0
 /// <summary>
 /// Adds the gates needed to execute the given swap on the given circuit.
 /// </summary>
 /// <param name="circuit"> The circuit to execute the swap on. </param>
 /// <param name="swap"> The swap to execute on the circuit. </param>
 public abstract void AddSwapGates(PhysicalCircuit circuit, Swap swap);
コード例 #5
0
 /// <summary>
 /// See <see cref="Architecture.AddSwapGates(PhysicalCircuit, Swap)"/>.
 /// </summary>
 public override void AddSwapGates(PhysicalCircuit circuit, Swap swap)
 {
     circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2));
     circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1));
     circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2));
 }