use crate::components::gate::Gate;
use crate::components::parametric::parameter::Parameter;
use std::fmt::Debug;
pub trait ParametricGate: Debug + Send + Sync {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate>;
fn box_clone(&self) -> Box<dyn ParametricGate>;
}
impl Clone for Box<dyn ParametricGate> {
fn clone(&self) -> Self {
self.box_clone()
}
}
#[derive(Debug, Clone)]
pub struct ParametricRyPhase {
pub parameter: Parameter<2>, }
impl ParametricGate for ParametricRyPhase {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::ry_phase_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
params[1],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricRyPhaseDag {
pub parameter: Parameter<2>, }
impl ParametricGate for ParametricRyPhaseDag {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::ry_phase_dag_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
params[1],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricMatchgate {
pub parameter: Parameter<3>, }
impl ParametricGate for ParametricMatchgate {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
vec![Gate::controlled_matchgate(
target_indices[0],
control_indices.to_vec(),
params[0],
params[1],
params[2],
)]
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricRx {
pub parameter: Parameter<1>, }
impl ParametricGate for ParametricRx {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::rx_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricRy {
pub parameter: Parameter<1>, }
impl ParametricGate for ParametricRy {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::ry_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricRz {
pub parameter: Parameter<1>, }
impl ParametricGate for ParametricRz {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::rz_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}
#[derive(Debug, Clone)]
pub struct ParametricP {
pub parameter: Parameter<1>, }
impl ParametricGate for ParametricP {
fn to_concrete_gates(&self, target_indices: &[usize], control_indices: &[usize]) -> Vec<Gate> {
let params = self.parameter.get();
Gate::p_controlled_gates(
target_indices.to_vec(),
control_indices.to_vec(),
params[0],
)
}
fn box_clone(&self) -> Box<dyn ParametricGate> {
Box::new(self.clone())
}
}