mod analysis;
mod greedy;
mod interaction_seed;
mod objective;
mod result;
mod sabre;
mod scoring;
mod trivial;
mod vf2;
mod vf2_engine;
pub use crate::compile::physical_target::{DistanceTable, PhysicalLayoutGraph};
pub use analysis::{
CircuitLayoutAnalysis, Interaction, InteractionGraph, analyze_circuit_for_layout,
};
pub(crate) use greedy::{GreedyCandidateOutcome, greedy_layout_candidate_prepared};
pub use greedy::{greedy_layout, greedy_layout_prepared};
pub use objective::{LayoutObjective, LayoutScore};
pub use result::{LayoutDiagnostics, LayoutResult};
pub use sabre::{
PreparedSabreCircuit, PreparedSabreTarget, prepare_sabre_circuit, prepare_sabre_device_target,
prepare_sabre_topology_target, sabre_layout, sabre_layout_prepared,
};
pub(crate) use sabre::{
PreparedSabreParetoSearch, SabreParetoCandidateId,
prepare_sabre_device_target_with_session_and_physical,
prepare_sabre_topology_target_with_prepared, sabre_route_selection_prepared,
};
pub use trivial::{trivial_layout, trivial_layout_prepared};
pub use vf2::{
Vf2EdgeRequirement, Vf2LayoutConfig, vf2_perfect_layout, vf2_perfect_layout_prepared,
};
pub(crate) use vf2::{Vf2PreparedOutcome, try_vf2_perfect_layout_prepared};
fn is_perfect_layout(
analysis: &CircuitLayoutAnalysis,
physical: &PhysicalLayoutGraph,
layout: &crate::device::Layout,
) -> bool {
analysis
.interactions
.interactions()
.iter()
.filter(|interaction| interaction.weight > 0.0)
.all(|interaction| {
let Some(left) = layout.get_physical(interaction.left) else {
return false;
};
let Some(right) = layout.get_physical(interaction.right) else {
return false;
};
physical.is_adjacent_undirected(left, right)
})
}
#[cfg(test)]
mod greedy_test;
#[cfg(test)]
mod gate_aware_test;
#[cfg(test)]
mod layout_test;
#[cfg(test)]
mod sabre_test;
#[cfg(test)]
mod vf2_test;