use crate::{
error::KetError,
ir::{block::BasicBlock, gate::GateInstruction, hamiltonian::Hamiltonian},
mapping::graph::GraphMatrix,
};
pub mod allocation;
pub mod dynamic_look_ahead;
pub mod graph;
#[allow(clippy::type_complexity)]
pub fn map_circuit(
block: &BasicBlock,
hamiltonian_list: &[Hamiltonian],
qubits_to_sample: &[usize],
qpu: &[(usize, usize)],
num_qubits: usize,
) -> Result<(Vec<GateInstruction>, Vec<Hamiltonian>, Vec<usize>), KetError> {
let mut coupling_graph = GraphMatrix::new(num_qubits);
for (i, j) in qpu {
coupling_graph.set_edge(*i, *j, 1);
}
let interaction_graph = allocation::build_interaction_graph(block, num_qubits);
let (logical_to_physical, physical_to_logical) =
allocation::initial(&interaction_graph, &coupling_graph);
let logical_circuit = block.flat_gates(None, None);
let (mapped_gates, final_mapping) = dynamic_look_ahead::map(
&logical_circuit,
logical_to_physical,
physical_to_logical,
&coupling_graph,
)?;
let mapped_gate: Vec<GateInstruction> = mapped_gates.iter().map(Into::into).collect();
let mapped_hamiltonian: Vec<_> = hamiltonian_list
.iter()
.map(|h| h.map(&final_mapping))
.collect();
let mapped_qubits_to_sample: Vec<_> = qubits_to_sample
.iter()
.map(|qubit| final_mapping[qubit])
.collect();
Ok((mapped_gate, mapped_hamiltonian, mapped_qubits_to_sample))
}