use crate::circuit::{Circuit, Instruction};
use crate::compile::CompilerError;
use crate::compile::transform::native_optimization::{
LocalOptimizationPolicy, optimize_one_qubit_runs_with_policy,
optimize_one_qubit_runs_with_policy_and_edits,
};
use crate::compile::transform::target_basis::TargetBasisCostModel;
use crate::compile::transform::{CircuitAnalysis, RewriteEdits, TransformOutcome, Transformer};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct OptimizeOneQubitRuns {
policy: LocalOptimizationPolicy,
}
impl OptimizeOneQubitRuns {
pub const fn logical() -> Self {
Self {
policy: LocalOptimizationPolicy::Logical,
}
}
pub fn basis(target_basis: Vec<Instruction>) -> Result<Self, CompilerError> {
Ok(Self::basis_with_cost_model(Arc::new(
TargetBasisCostModel::new(target_basis)?,
)))
}
pub(crate) fn basis_with_cost_model(cost_model: Arc<TargetBasisCostModel>) -> Self {
Self {
policy: LocalOptimizationPolicy::Basis(cost_model),
}
}
pub(crate) fn transform_with_rewrite_edits(
&self,
circuit: &Circuit,
) -> Result<(TransformOutcome, RewriteEdits), CompilerError> {
optimize_one_qubit_runs_with_policy_and_edits(circuit, &self.policy)
}
}
impl Transformer for OptimizeOneQubitRuns {
fn name(&self) -> &'static str {
"optimize.one_qubit_runs"
}
fn transform(
&self,
circuit: &Circuit,
_analysis: Option<&CircuitAnalysis>,
) -> Result<TransformOutcome, CompilerError> {
optimize_one_qubit_runs_with_policy(circuit, &self.policy)
}
}
#[cfg(test)]
#[path = "one_qubit_optimization_test.rs"]
mod one_qubit_optimization_test;