use crate::{
error::KetError,
ir::{block::BasicBlock, gate::QuantumGate},
};
pub mod c_api;
mod decompose;
pub mod error;
pub mod execution;
pub mod ir;
mod mapping;
mod matrix;
pub mod process;
#[cfg(test)]
mod tests;
pub fn controlled_gate(
gate: QuantumGate,
control: &[usize],
target: usize,
) -> Result<BasicBlock, KetError> {
let mut quantum_code = BasicBlock::new();
quantum_code.append_gate(gate, target);
quantum_code.control(control)
}
pub fn swap_gate(a: usize, b: usize) -> Result<BasicBlock, KetError> {
let mut quantum_code = BasicBlock::new();
quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[a], b)?, None);
quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[b], a)?, None);
quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[a], b)?, None);
Ok(quantum_code)
}
pub fn compute_action_uncompute_gate<Fc, Fa>(
mut compute: Fc,
mut action: Fa,
) -> Result<BasicBlock, KetError>
where
Fc: FnMut(BasicBlock) -> Result<BasicBlock, KetError>,
Fa: FnMut(BasicBlock) -> Result<BasicBlock, KetError>,
{
let mut quantum_code = BasicBlock::new();
let compute = compute(BasicBlock::new())?;
let uncompute = compute.inverse();
let action = action(BasicBlock::new())?;
quantum_code.append_block(compute, None);
quantum_code.append_block(action, None);
quantum_code.append_block(uncompute, None);
Ok(quantum_code)
}