Crates.io | quantrs2-circuit |
lib.rs | quantrs2-circuit |
version | 0.1.0-alpha.5 |
created_at | 2025-05-13 01:55:56.715541+00 |
updated_at | 2025-06-17 11:52:11.494536+00 |
description | Quantum circuit representation and DSL for the QuantRS2 framework |
homepage | |
repository | https://github.com/cool-japan/quantrs |
max_upload_size | |
id | 1671314 |
size | 1,414,197 |
QuantRS2-Circuit is the comprehensive quantum circuit construction and optimization engine of the QuantRS2 quantum computing framework, providing advanced circuit representation, analysis, optimization, and compilation capabilities for quantum computing applications.
use quantrs2_circuit::prelude::*;
fn basic_circuit_example() -> Result<(), Box<dyn std::error::Error>> {
// Create a circuit with compile-time qubit count verification
let mut circuit = Circuit::<4>::new();
// Build a quantum Fourier transform circuit
circuit.h(0)?
.controlled_phase(0, 1, std::f64::consts::PI / 2.0)?
.controlled_phase(0, 2, std::f64::consts::PI / 4.0)?
.controlled_phase(0, 3, std::f64::consts::PI / 8.0)?
.h(1)?
.controlled_phase(1, 2, std::f64::consts::PI / 2.0)?
.controlled_phase(1, 3, std::f64::consts::PI / 4.0)?
.h(2)?
.controlled_phase(2, 3, std::f64::consts::PI / 2.0)?
.h(3)?;
// Convert to DAG for analysis
let dag = circuit_to_dag(&circuit);
println!("Circuit depth: {}, Gate count: {}", dag.depth(), dag.gate_count());
Ok(())
}
use quantrs2_circuit::prelude::*;
fn optimization_example() -> Result<(), Box<dyn std::error::Error>> {
let mut circuit = Circuit::<8>::new();
// Create a complex circuit with optimization opportunities
for i in 0..8 {
circuit.h(i)?;
}
for i in 0..7 {
circuit.cnot(i, i + 1)?;
}
for i in 0..8 {
circuit.rz(i, 0.1)?;
}
// Configure optimization pipeline
let mut pass_manager = PassManager::new();
pass_manager.add_pass(OptimizationPass::GateCancellation)?
.add_pass(OptimizationPass::RotationMerging)?
.add_pass(OptimizationPass::CommutationOptimization)?
.add_pass(OptimizationPass::TemplateMatching)?;
// Apply optimizations
let optimized_circuit = pass_manager.run(&circuit)?;
let report = pass_manager.get_report();
println!("Original gates: {}, Optimized gates: {}, Reduction: {:.1}%",
report.original_gates, report.final_gates, report.reduction_percentage());
Ok(())
}
use quantrs2_circuit::prelude::*;
fn hardware_compilation_example() -> Result<(), Box<dyn std::error::Error>> {
// Define device topology (e.g., Google Sycamore)
let coupling_map = CouplingMap::from_adjacency_list(&[
(0, 1), (1, 2), (2, 3), (3, 4),
(5, 6), (6, 7), (7, 8), (8, 9),
(0, 5), (1, 6), (2, 7), (3, 8), (4, 9),
]);
// Create logical circuit
let mut logical_circuit = Circuit::<10>::new();
logical_circuit.h(0)?
.cnot(0, 5)? // This requires routing
.cnot(5, 9)?
.cnot(9, 4)?;
// Configure router with device constraints
let router_config = SabreConfig {
max_iterations: 100,
decay: 0.001,
lookahead_depth: 3,
};
let mut router = SabreRouter::new(coupling_map, router_config);
let routed_result = router.route(&logical_circuit)?;
println!("Added {} SWAP gates for routing", routed_result.swap_count);
println!("Final circuit depth: {}", routed_result.circuit.depth());
Ok(())
}
use quantrs2_circuit::prelude::*;
fn circuit_analysis_example() -> Result<(), Box<dyn std::error::Error>> {
// Create two allegedly equivalent circuits
let mut circuit1 = Circuit::<2>::new();
circuit1.h(0)?.cnot(0, 1)?;
let mut circuit2 = Circuit::<2>::new();
circuit2.cnot(0, 1)?.h(0)?.cnot(0, 1)?.x(1)?.cnot(0, 1)?;
// Verify equivalence using multiple methods
let equivalence_checker = EquivalenceChecker::new();
let result = equivalence_checker.check_equivalence(&circuit1, &circuit2)?;
match result.equivalence_type {
EquivalenceType::Unitary => println!("Circuits are unitarily equivalent"),
EquivalenceType::Structural => println!("Circuits are structurally identical"),
EquivalenceType::None => println!("Circuits are not equivalent"),
}
// Perform detailed circuit analysis
let analyzer = CircuitAnalyzer::new();
let metrics = analyzer.analyze(&circuit1)?;
println!("Circuit metrics:");
println!(" Depth: {}", metrics.depth);
println!(" Gate count: {}", metrics.gate_count);
println!(" Two-qubit gates: {}", metrics.two_qubit_gate_count);
println!(" Entanglement measure: {:.3}", metrics.entanglement_measure);
Ok(())
}
use quantrs2_circuit::prelude::*;
fn classical_control_example() -> Result<(), Box<dyn std::error::Error>> {
// Create measurement circuit with classical control
let mut measurement_circuit = MeasurementCircuitBuilder::new(3, 3);
// Prepare a superposition state
measurement_circuit.h(0)?
.cnot(0, 1)?
.cnot(1, 2)?;
// Mid-circuit measurement with feed-forward
measurement_circuit.measure(0, 0)?; // Measure qubit 0 to classical bit 0
// Conditional operations based on measurement result
let condition = ClassicalCondition::equals(0, ClassicalValue::One);
measurement_circuit.conditional_x(1, condition)?;
// Final measurements
measurement_circuit.measure(1, 1)?
.measure(2, 2)?;
// Execute with conditional logic
let execution_result = measurement_circuit.execute_with_simulation(1000)?;
println!("Classical outcomes: {:?}", execution_result.classical_outcomes);
Ok(())
}
use quantrs2_circuit::prelude::*;
fn fault_tolerant_example() -> Result<(), Box<dyn std::error::Error>> {
// Define a surface code for error correction
let qec_code = QECCode::surface_code(3, 3)?; // 3x3 surface code
// Create logical circuit
let mut logical_circuit = Circuit::<1>::new();
logical_circuit.h(0)?
.s(0)?
.h(0)?;
// Compile to fault-tolerant version
let ft_compiler = FaultTolerantCompiler::new(qec_code);
let ft_circuit = ft_compiler.compile(&logical_circuit)?;
println!("Logical circuit gates: {}", logical_circuit.gate_count());
println!("Fault-tolerant gates: {}", ft_circuit.physical_circuit.gate_count());
println!("Resource overhead: {}x", ft_circuit.resource_overhead.total_overhead());
// Analyze magic state requirements
println!("Magic states required: {}", ft_circuit.resource_overhead.magic_states);
Ok(())
}
use quantrs2_circuit::prelude::*;
fn qasm_interoperability_example() -> Result<(), Box<dyn std::error::Error>> {
// Parse QASM circuit
let qasm_code = r#"
OPENQASM 3.0;
include "stdgates.inc";
qubit[2] q;
bit[2] c;
h q[0];
cnot q[0], q[1];
c = measure q;
"#;
let qasm_parser = QasmParser::new();
let parsed_program = qasm_parser.parse(qasm_code)?;
// Convert to QuantRS2 circuit
let circuit = parsed_program.to_quantrs2_circuit()?;
// Optimize the circuit
let optimizer = CircuitOptimizer::new();
let optimized_circuit = optimizer.optimize(&circuit, OptimizationLevel::Aggressive)?;
// Export back to QASM
let export_options = ExportOptions {
include_measurements: true,
use_custom_gates: false,
optimization_level: Some(OptimizationLevel::Basic),
};
let qasm_exporter = QasmExporter::new();
let exported_qasm = qasm_exporter.export(&optimized_circuit, &export_options)?;
println!("Exported QASM:\n{}", exported_qasm);
Ok(())
}
Circuit<N>
: Quantum circuit with const generic for qubit countSimulator
: Trait for backends that can run quantum circuitscircuit!
: Creates a new circuit with the specified number of qubitsqubits!
: Creates a set of qubits for operationsquantum!
: DSL for quantum circuit construction (in development)GateOp
traitQuantRS2Result
for error handlingSee TODO.md for planned features.
This module is designed to work seamlessly with:
This project is licensed under either:
at your option.