pub struct TemplateMatching { /* private fields */ }
Expand description
Template matching optimization
Implementations§
Source§impl TemplateMatching
impl TemplateMatching
Sourcepub fn new() -> Self
pub fn new() -> Self
Examples found in repository?
examples/optimization_demo.rs (line 151)
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}
pub fn with_templates(templates: Vec<CircuitTemplate>) -> Self
Source§impl TemplateMatching
impl TemplateMatching
Sourcepub fn with_advanced_templates() -> Self
pub fn with_advanced_templates() -> Self
Create an advanced template matcher with more sophisticated patterns
Sourcepub fn for_hardware(hardware: &str) -> Self
pub fn for_hardware(hardware: &str) -> Self
Create a template matcher for specific hardware
Trait Implementations§
Source§impl Default for TemplateMatching
impl Default for TemplateMatching
Source§impl OptimizationPass for TemplateMatching
impl OptimizationPass for TemplateMatching
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 TemplateMatching
impl RefUnwindSafe for TemplateMatching
impl Send for TemplateMatching
impl Sync for TemplateMatching
impl Unpin for TemplateMatching
impl UnwindSafe for TemplateMatching
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.