/// <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) { circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1)); circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); }
/// <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)); } }