pub struct GateCommutation { /* private fields */ }
Expand description
Gate commutation pass - reorders gates to enable other optimizations
Implementations§
Source§impl GateCommutation
impl GateCommutation
Sourcepub fn new(max_lookahead: usize) -> Self
pub fn new(max_lookahead: usize) -> Self
Examples found in repository?
examples/optimization_demo.rs (line 150)
131fn demo_custom_optimization(circuit: &Circuit<4>) {
132 println!("\nDemo 3: Custom Optimization Pipeline");
133 println!("------------------------------------");
134
135 // Create a custom pass manager
136 let mut pass_manager = PassManager::new();
137
138 // Configure with specific passes
139 let config = PassConfig {
140 max_iterations: 5,
141 aggressive: true,
142 level: OptimizationLevel::Custom,
143 ..Default::default()
144 };
145 pass_manager.configure(config.clone());
146
147 // Add specific passes in a custom order
148 pass_manager.add_pass(Box::new(GateCancellation::new(true)));
149 pass_manager.add_pass(Box::new(RotationMerging::new(1e-10)));
150 pass_manager.add_pass(Box::new(GateCommutation::new(10)));
151 pass_manager.add_pass(Box::new(TemplateMatching::new()));
152
153 // Create optimizer with custom configuration
154 let mut optimizer = CircuitOptimizer2::<4>::new();
155 optimizer.configure(config);
156
157 match optimizer.optimize(circuit) {
158 Ok(report) => {
159 println!("Custom optimization results:");
160 report.print_summary();
161 }
162 Err(e) => {
163 println!("Custom optimization failed: {:?}", e);
164 }
165 }
166}
167
168fn demo_gate_properties() {
169 println!("\nDemo 4: Gate Properties");
170 println!("-----------------------");
171
172 // Show properties of various gates
173 let gates = vec!["H", "X", "CNOT", "Toffoli"];
174
175 for gate_name in gates {
176 let props = match gate_name {
177 "H" | "X" => GateProperties::single_qubit(gate_name),
178 "CNOT" => GateProperties::two_qubit(gate_name),
179 "Toffoli" => GateProperties::multi_qubit(gate_name, 3),
180 _ => continue,
181 };
182
183 println!("\n{} Gate Properties:", gate_name);
184 println!(" Native: {}", props.is_native);
185 println!(" Duration: {:.1} ns", props.cost.duration_ns);
186 println!(" Error rate: {:.6}", props.error.error_rate);
187 println!(" Self-inverse: {}", props.is_self_inverse);
188 println!(" Diagonal: {}", props.is_diagonal);
189 println!(" Decompositions: {}", props.decompositions.len());
190 }
191
192 // Show commutation relations
193 println!("\nCommutation Relations:");
194 let comm_table = CommutationTable::new();
195
196 let gate_pairs = vec![
197 ("X", "Y"),
198 ("X", "Z"),
199 ("Z", "Z"),
200 ("Z", "RZ"),
201 ("CNOT", "CNOT"),
202 ];
203
204 for (g1, g2) in gate_pairs {
205 println!(
206 " {} ↔ {}: {}",
207 g1,
208 g2,
209 if comm_table.commutes(g1, g2) {
210 "✓"
211 } else {
212 "✗"
213 }
214 );
215 }
216 println!();
217}
218
219fn benchmark_optimization_passes(circuit: &Circuit<4>) {
220 println!("\nDemo 5: Pass Benchmarking");
221 println!("-------------------------");
222
223 // Benchmark individual passes
224 let passes: Vec<(&str, Box<dyn OptimizationPass>)> = vec![
225 ("Gate Cancellation", Box::new(GateCancellation::new(false))),
226 ("Rotation Merging", Box::new(RotationMerging::new(1e-10))),
227 ("Gate Commutation", Box::new(GateCommutation::new(5))),
228 ("Template Matching", Box::new(TemplateMatching::new())),
229 (
230 "Two-Qubit Opt",
231 Box::new(TwoQubitOptimization::new(false, true)),
232 ),
233 ];
234
235 let cost_model = AbstractCostModel::default();
236
237 for (name, pass) in passes {
238 let start = Instant::now();
239
240 match pass.apply(circuit, &cost_model) {
241 Ok(_) => {
242 let duration = start.elapsed();
243 println!(" {}: {:?}", name, duration);
244 }
245 Err(e) => {
246 println!(" {} failed: {:?}", name, e);
247 }
248 }
249 }
250
251 // Benchmark full optimization
252 println!("\nFull Optimization Benchmark:");
253 let start = Instant::now();
254 let mut optimizer = CircuitOptimizer2::<4>::with_level(OptimizationLevel::Heavy);
255
256 match optimizer.optimize(circuit) {
257 Ok(report) => {
258 let duration = start.elapsed();
259 println!(" Total time: {:?}", duration);
260 println!(
261 " Gates reduced: {} → {}",
262 report.initial_metrics.gate_count, report.final_metrics.gate_count
263 );
264
265 // Show detailed report
266 println!("\nDetailed Report:");
267 println!("{}", report.detailed_report());
268 }
269 Err(e) => {
270 println!(" Benchmark failed: {:?}", e);
271 }
272 }
273}
Trait Implementations§
Source§impl OptimizationPass for GateCommutation
impl OptimizationPass for GateCommutation
Source§fn apply_to_gates(
&self,
gates: Vec<Box<dyn GateOp>>,
_cost_model: &dyn CostModel,
) -> QuantRS2Result<Vec<Box<dyn GateOp>>>
fn apply_to_gates( &self, gates: Vec<Box<dyn GateOp>>, _cost_model: &dyn CostModel, ) -> QuantRS2Result<Vec<Box<dyn GateOp>>>
Apply the optimization pass to a gate list
Source§fn should_apply(&self) -> bool
fn should_apply(&self) -> bool
Check if this pass should be applied
Auto Trait Implementations§
impl Freeze for GateCommutation
impl RefUnwindSafe for GateCommutation
impl Send for GateCommutation
impl Sync for GateCommutation
impl Unpin for GateCommutation
impl UnwindSafe for GateCommutation
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T, const N: usize> OptimizationPassExt<N> for Twhere
T: OptimizationPass + ?Sized,
impl<T, const N: usize> OptimizationPassExt<N> for Twhere
T: OptimizationPass + ?Sized,
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.