1use crate::error::QuantRS2Error;
8use crate::gate_translation::GateType;
9use crate::scirs2_quantum_formatter::{
10 CommentStyle, FormattingConfig, IndentationStyle, OutputFormat, QuantumGate,
11};
12use scirs2_core::Complex64;
13use std::fmt::Write;
14use crate::parallel_ops_stubs::*;
16use crate::buffer_pool::BufferPool;
18use crate::platform::PlatformCapabilities;
19use scirs2_core::ndarray::{Array1, Array2};
20use serde::{Deserialize, Serialize};
21use std::collections::{BTreeMap, HashMap, HashSet, VecDeque};
22use std::fmt;
23use std::sync::{Arc, Mutex};
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct EnhancedFormattingConfig {
28 pub base_config: FormattingConfig,
30
31 pub enable_ai_beautification: bool,
33
34 pub enable_semantic_formatting: bool,
36
37 pub enable_visual_representation: bool,
39
40 pub enable_interactive_suggestions: bool,
42
43 pub enable_incremental_formatting: bool,
45
46 pub enable_hardware_optimizations: bool,
48
49 pub enable_algorithm_templates: bool,
51
52 pub enable_code_folding: bool,
54
55 pub enable_syntax_highlighting: bool,
57
58 pub visual_formats: Vec<VisualFormat>,
60
61 pub target_backends: Vec<QuantumBackend>,
63
64 pub max_diagram_width: usize,
66
67 pub use_unicode_symbols: bool,
69
70 pub custom_rules: Vec<CustomFormattingRule>,
72
73 pub export_formats: Vec<ExportFormat>,
75}
76
77impl Default for EnhancedFormattingConfig {
78 fn default() -> Self {
79 Self {
80 base_config: FormattingConfig::default(),
81 enable_ai_beautification: true,
82 enable_semantic_formatting: true,
83 enable_visual_representation: true,
84 enable_interactive_suggestions: true,
85 enable_incremental_formatting: true,
86 enable_hardware_optimizations: true,
87 enable_algorithm_templates: true,
88 enable_code_folding: true,
89 enable_syntax_highlighting: true,
90 visual_formats: vec![
91 VisualFormat::ASCII,
92 VisualFormat::Unicode,
93 VisualFormat::LaTeX,
94 ],
95 target_backends: vec![
96 QuantumBackend::IBMQ,
97 QuantumBackend::IonQ,
98 QuantumBackend::Simulator,
99 ],
100 max_diagram_width: 120,
101 use_unicode_symbols: true,
102 custom_rules: Vec::new(),
103 export_formats: vec![ExportFormat::JSON, ExportFormat::YAML, ExportFormat::TOML],
104 }
105 }
106}
107
108#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
110pub enum VisualFormat {
111 ASCII,
112 Unicode,
113 LaTeX,
114 SVG,
115 HTML,
116 Markdown,
117 GraphViz,
118}
119
120#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
122pub enum QuantumBackend {
123 IBMQ,
124 IonQ,
125 Rigetti,
126 Honeywell,
127 AzureQuantum,
128 AmazonBraket,
129 Simulator,
130}
131
132#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
134pub enum ExportFormat {
135 JSON,
136 YAML,
137 TOML,
138 XML,
139 Protocol,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct CustomFormattingRule {
145 pub name: String,
146 pub pattern: String,
147 pub replacement: String,
148 pub priority: i32,
149 pub enabled: bool,
150}
151
152pub struct EnhancedQuantumFormatter {
154 config: EnhancedFormattingConfig,
155 semantic_analyzer: SemanticAnalyzer,
156 ai_beautifier: AIBeautifier,
157 visual_renderer: VisualRenderer,
158 template_engine: TemplateEngine,
159 hardware_optimizer: HardwareOptimizer,
160 incremental_formatter: IncrementalFormatter,
161 suggestion_engine: SuggestionEngine,
162 export_engine: ExportEngine,
163 syntax_highlighter: SyntaxHighlighter,
164 platform_capabilities: PlatformCapabilities,
165}
166
167impl EnhancedQuantumFormatter {
168 pub fn new() -> Self {
170 let config = EnhancedFormattingConfig::default();
171 Self::with_config(config)
172 }
173
174 pub fn with_config(config: EnhancedFormattingConfig) -> Self {
176 let platform_capabilities = PlatformCapabilities::detect();
177
178 Self {
179 config,
180 semantic_analyzer: SemanticAnalyzer::new(),
181 ai_beautifier: AIBeautifier::new(),
182 visual_renderer: VisualRenderer::new(),
183 template_engine: TemplateEngine::new(),
184 hardware_optimizer: HardwareOptimizer::new(),
185 incremental_formatter: IncrementalFormatter::new(),
186 suggestion_engine: SuggestionEngine::new(),
187 export_engine: ExportEngine::new(),
188 syntax_highlighter: SyntaxHighlighter::new(),
189 platform_capabilities,
190 }
191 }
192
193 pub fn format_circuit_enhanced(
195 &self,
196 circuit: &[QuantumGate],
197 num_qubits: usize,
198 options: FormattingOptions,
199 ) -> Result<EnhancedFormattedCode, QuantRS2Error> {
200 let start_time = std::time::Instant::now();
201
202 let semantic_info = if self.config.enable_semantic_formatting {
204 Some(
205 self.semantic_analyzer
206 .analyze_circuit(circuit, num_qubits)?,
207 )
208 } else {
209 None
210 };
211
212 let beautification_suggestions = if self.config.enable_ai_beautification {
214 Some(
215 self.ai_beautifier
216 .generate_beautification_suggestions(circuit, &semantic_info)?,
217 )
218 } else {
219 None
220 };
221
222 let hardware_formatting = if self.config.enable_hardware_optimizations {
224 Some(
225 self.hardware_optimizer
226 .optimize_for_hardware(circuit, &options.target_hardware)?,
227 )
228 } else {
229 None
230 };
231
232 let mut formatted_outputs = HashMap::new();
234
235 formatted_outputs.insert(
237 OutputFormat::Text,
238 self.format_as_text(circuit, &semantic_info, &beautification_suggestions)?,
239 );
240
241 if options.include_code_formats {
243 formatted_outputs.insert(
244 OutputFormat::Rust,
245 self.format_as_rust(circuit, &semantic_info)?,
246 );
247 formatted_outputs.insert(
248 OutputFormat::Python,
249 self.format_as_python(circuit, &semantic_info)?,
250 );
251 formatted_outputs.insert(OutputFormat::QASM, self.format_as_qasm(circuit)?);
252 }
253
254 let visual_representations = if self.config.enable_visual_representation {
256 self.generate_visual_representations(circuit, num_qubits)?
257 } else {
258 HashMap::new()
259 };
260
261 let formatting_suggestions = if self.config.enable_interactive_suggestions {
263 self.suggestion_engine
264 .generate_suggestions(circuit, &semantic_info)?
265 } else {
266 Vec::new()
267 };
268
269 let templated_code = if options.apply_templates {
271 Some(self.apply_algorithm_templates(circuit, &semantic_info)?)
272 } else {
273 None
274 };
275
276 let syntax_metadata = if self.config.enable_syntax_highlighting {
278 Some(self.syntax_highlighter.generate_metadata(circuit)?)
279 } else {
280 None
281 };
282
283 let quality_metrics = self.calculate_quality_metrics(circuit, &formatted_outputs);
285
286 Ok(EnhancedFormattedCode {
287 formatted_outputs,
288 visual_representations,
289 semantic_info,
290 beautification_suggestions,
291 hardware_formatting,
292 formatting_suggestions,
293 templated_code,
294 syntax_metadata,
295 quality_metrics,
296 formatting_time: start_time.elapsed(),
297 platform_optimizations: self.identify_platform_optimizations(),
298 })
299 }
300
301 fn format_as_text(
303 &self,
304 circuit: &[QuantumGate],
305 semantic_info: &Option<SemanticInfo>,
306 beautification: &Option<BeautificationSuggestions>,
307 ) -> Result<String, QuantRS2Error> {
308 let mut output = String::new();
309
310 if let Some(sem_info) = semantic_info {
312 let _ = writeln!(output, "// Quantum Algorithm: {}", sem_info.algorithm_type);
313 let _ = writeln!(output, "// Complexity: {}", sem_info.complexity_class);
314 let _ = writeln!(output, "// Purpose: {}\n", sem_info.purpose);
315 }
316
317 if let Some(beauty) = beautification {
319 for suggestion in &beauty.layout_improvements {
320 let _ = writeln!(output, "// Layout: {suggestion}");
321 }
322 output.push('\n');
323 }
324
325 if self.config.enable_code_folding {
327 output.push_str("// region: Initialization\n");
328 }
329
330 let gate_groups = self.group_gates_semantically(circuit, semantic_info);
332
333 for (group_name, gates) in gate_groups {
334 if self.config.enable_code_folding {
335 let _ = writeln!(output, "\n// region: {group_name}");
336 }
337
338 let _ = writeln!(output, "// {group_name}");
339
340 for gate in gates {
341 let formatted_gate = self.format_gate_enhanced(gate)?;
342 let _ = writeln!(output, "{formatted_gate}");
343 }
344
345 if self.config.enable_code_folding {
346 output.push_str("// endregion\n");
347 }
348 }
349
350 Ok(output)
351 }
352
353 fn format_gate_enhanced(&self, gate: &QuantumGate) -> Result<String, QuantRS2Error> {
355 let mut formatted = String::new();
356
357 let gate_symbol = if self.config.use_unicode_symbols {
359 match gate.gate_type() {
360 GateType::X => "X̂",
361 GateType::Y => "Ŷ",
362 GateType::Z => "Ẑ",
363 GateType::H => "Ĥ",
364 GateType::CNOT => "⊕",
365 GateType::T => "T̂",
366 GateType::S => "Ŝ",
367 _ => "G",
368 }
369 } else {
370 match gate.gate_type() {
371 GateType::X => "X",
372 GateType::Y => "Y",
373 GateType::Z => "Z",
374 GateType::H => "H",
375 GateType::CNOT => "CX",
376 GateType::T => "T",
377 GateType::S => "S",
378 _ => "G",
379 }
380 };
381
382 formatted.push_str(gate_symbol);
384
385 if let Some(controls) = gate.control_qubits() {
387 let _ = write!(formatted, "[c:{controls:?}]");
388 }
389 let _ = write!(formatted, "[t:{:?}]", gate.target_qubits());
390
391 if self.is_simd_optimizable(gate) {
393 formatted.push_str(" // SIMD");
394 }
395
396 Ok(formatted)
397 }
398
399 fn group_gates_semantically<'a>(
401 &self,
402 circuit: &'a [QuantumGate],
403 semantic_info: &Option<SemanticInfo>,
404 ) -> Vec<(String, Vec<&'a QuantumGate>)> {
405 let mut groups = Vec::new();
406
407 if let Some(sem_info) = semantic_info {
408 for phase in &sem_info.algorithm_phases {
410 let phase_gates: Vec<&QuantumGate> = circuit
411 .iter()
412 .skip(phase.start_index)
413 .take(phase.end_index - phase.start_index)
414 .collect();
415
416 if !phase_gates.is_empty() {
417 groups.push((phase.name.clone(), phase_gates));
418 }
419 }
420 } else {
421 groups.push(("Circuit".to_string(), circuit.iter().collect()));
423 }
424
425 groups
426 }
427
428 fn generate_visual_representations(
430 &self,
431 circuit: &[QuantumGate],
432 num_qubits: usize,
433 ) -> Result<HashMap<VisualFormat, String>, QuantRS2Error> {
434 let mut representations = HashMap::new();
435
436 for format in &self.config.visual_formats {
437 let visual = match format {
438 VisualFormat::ASCII => self.visual_renderer.render_ascii(circuit, num_qubits)?,
439 VisualFormat::Unicode => {
440 self.visual_renderer.render_unicode(circuit, num_qubits)?
441 }
442 VisualFormat::LaTeX => self.visual_renderer.render_latex(circuit, num_qubits)?,
443 VisualFormat::SVG => self.visual_renderer.render_svg(circuit, num_qubits)?,
444 VisualFormat::HTML => self.visual_renderer.render_html(circuit, num_qubits)?,
445 VisualFormat::Markdown => {
446 self.visual_renderer.render_markdown(circuit, num_qubits)?
447 }
448 VisualFormat::GraphViz => {
449 self.visual_renderer.render_graphviz(circuit, num_qubits)?
450 }
451 };
452 representations.insert(*format, visual);
453 }
454
455 Ok(representations)
456 }
457
458 fn format_as_rust(
460 &self,
461 circuit: &[QuantumGate],
462 semantic_info: &Option<SemanticInfo>,
463 ) -> Result<String, QuantRS2Error> {
464 let mut output = String::new();
465
466 output.push_str("//! Quantum circuit implementation\n");
467 output.push_str("//! Auto-generated by SciRS2 Enhanced Formatter\n\n");
468
469 output.push_str("use quantrs2_core::prelude::*;\n");
470 output.push_str(
471 "// use scirs2_core::parallel_ops::*;
472use crate::parallel_ops_stubs::*;\n\n",
473 );
474
475 if let Some(sem_info) = semantic_info {
477 let _ = writeln!(output, "/// {}", sem_info.purpose);
478 let _ = writeln!(output, "/// Algorithm: {}", sem_info.algorithm_type);
479 let _ = writeln!(output, "/// Complexity: {}", sem_info.complexity_class);
480 }
481
482 output.push_str("pub fn quantum_circuit(\n");
483 output.push_str(" state: &mut QuantumState,\n");
484 output.push_str(" params: &CircuitParams,\n");
485 output.push_str(") -> QuantRS2Result<CircuitResult> {\n");
486
487 output.push_str(" let start = std::time::Instant::now();\n");
489 output.push_str(" let mut gate_count = 0;\n\n");
490
491 for gate in circuit {
493 let rust_gate = self.generate_optimized_rust_gate(gate)?;
494 let _ = writeln!(output, " {rust_gate};");
495 output.push_str(" gate_count += 1;\n");
496 }
497
498 output.push_str("\n Ok(CircuitResult {\n");
499 output.push_str(" execution_time: start.elapsed(),\n");
500 output.push_str(" gate_count,\n");
501 output.push_str(" final_state: state.clone(),\n");
502 output.push_str(" })\n");
503 output.push_str("}\n");
504
505 Ok(output)
506 }
507
508 fn generate_optimized_rust_gate(&self, gate: &QuantumGate) -> Result<String, QuantRS2Error> {
510 match gate.gate_type() {
511 GateType::X => {
512 if self.platform_capabilities.simd_available() {
513 Ok(format!("simd_x_gate(state, {})", gate.target_qubits()[0]))
514 } else {
515 Ok(format!("state.apply_x({})", gate.target_qubits()[0]))
516 }
517 }
518 GateType::H => {
519 if self.platform_capabilities.simd_available() {
520 Ok(format!("simd_hadamard(state, {})", gate.target_qubits()[0]))
521 } else {
522 Ok(format!("state.apply_h({})", gate.target_qubits()[0]))
523 }
524 }
525 GateType::CNOT => Ok(format!(
526 "state.apply_cnot({}, {})",
527 gate.target_qubits()[0],
528 gate.target_qubits()[1]
529 )),
530 _ => Ok(format!("state.apply_gate({gate:?})")),
531 }
532 }
533
534 fn format_as_python(
536 &self,
537 circuit: &[QuantumGate],
538 semantic_info: &Option<SemanticInfo>,
539 ) -> Result<String, QuantRS2Error> {
540 let mut output = String::new();
541
542 output.push_str("#!/usr/bin/env python3\n");
543 output.push_str("\"\"\"Quantum circuit implementation\n");
544 output.push_str("Auto-generated by SciRS2 Enhanced Formatter\n");
545
546 if let Some(sem_info) = semantic_info {
547 let _ = writeln!(output, "\nAlgorithm: {}", sem_info.algorithm_type);
548 let _ = writeln!(output, "Purpose: {}", sem_info.purpose);
549 }
550
551 output.push_str("\"\"\"\n\n");
552 output.push_str("from quantrs2 import QuantumCircuit, QuantumState\n");
553 output.push_str("import numpy as np\n");
554 output.push_str("import time\n\n");
555
556 output.push_str("def create_quantum_circuit(num_qubits: int) -> QuantumCircuit:\n");
557 output.push_str(" \"\"\"Create optimized quantum circuit.\"\"\"\n");
558 output.push_str(" qc = QuantumCircuit(num_qubits)\n");
559 output.push_str(" \n");
560 output.push_str(" # Circuit implementation\n");
561
562 for gate in circuit {
563 let python_gate = self.format_python_gate(gate)?;
564 let _ = writeln!(output, " {python_gate}");
565 }
566
567 output.push_str(" \n");
568 output.push_str(" return qc\n\n");
569
570 output.push_str("if __name__ == \"__main__\":\n");
571 output.push_str(" # Example usage\n");
572 output.push_str(" circuit = create_quantum_circuit(4)\n");
573 output.push_str(" result = circuit.execute()\n");
574 output.push_str(" print(f\"Result: {result}\")\n");
575
576 Ok(output)
577 }
578
579 fn format_python_gate(&self, gate: &QuantumGate) -> Result<String, QuantRS2Error> {
581 Ok(match gate.gate_type() {
582 GateType::X => format!("qc.x({})", gate.target_qubits()[0]),
583 GateType::Y => format!("qc.y({})", gate.target_qubits()[0]),
584 GateType::Z => format!("qc.z({})", gate.target_qubits()[0]),
585 GateType::H => format!("qc.h({})", gate.target_qubits()[0]),
586 GateType::CNOT => format!(
587 "qc.cx({}, {})",
588 gate.target_qubits()[0],
589 gate.target_qubits()[1]
590 ),
591 GateType::T => format!("qc.t({})", gate.target_qubits()[0]),
592 GateType::S => format!("qc.s({})", gate.target_qubits()[0]),
593 GateType::Rx(angle) => format!("qc.rx({}, {})", angle, gate.target_qubits()[0]),
594 GateType::Ry(angle) => format!("qc.ry({}, {})", angle, gate.target_qubits()[0]),
595 GateType::Rz(angle) => format!("qc.rz({}, {})", angle, gate.target_qubits()[0]),
596 _ => format!("# Unsupported gate: {:?}", gate.gate_type()),
597 })
598 }
599
600 fn format_as_qasm(&self, circuit: &[QuantumGate]) -> Result<String, QuantRS2Error> {
602 let mut output = String::new();
603
604 output.push_str("// SciRS2 Enhanced QASM Output\n");
605 output.push_str("OPENQASM 3.0;\n");
606 output.push_str("include \"stdgates.inc\";\n\n");
607
608 let max_qubit = circuit
610 .iter()
611 .flat_map(|g| g.target_qubits().iter())
612 .max()
613 .copied()
614 .unwrap_or(0);
615
616 let _ = writeln!(output, "qubit[{}] q;", max_qubit + 1);
617 let _ = writeln!(output, "bit[{}] c;\n", max_qubit + 1);
618
619 for (i, gate) in circuit.iter().enumerate() {
621 if i > 0 && i % 10 == 0 {
622 let _ = writeln!(output, "\n// Gates {}-{}", i, i + 9);
623 }
624 let _ = writeln!(output, "{};", self.format_qasm_gate(gate)?);
625 }
626
627 output.push_str("\n// Measurements\n");
628 for i in 0..=max_qubit {
629 let _ = writeln!(output, "c[{i}] = measure q[{i}];");
630 }
631
632 Ok(output)
633 }
634
635 fn format_qasm_gate(&self, gate: &QuantumGate) -> Result<String, QuantRS2Error> {
637 Ok(match gate.gate_type() {
638 GateType::X => format!("x q[{}]", gate.target_qubits()[0]),
639 GateType::Y => format!("y q[{}]", gate.target_qubits()[0]),
640 GateType::Z => format!("z q[{}]", gate.target_qubits()[0]),
641 GateType::H => format!("h q[{}]", gate.target_qubits()[0]),
642 GateType::CNOT => format!(
643 "cx q[{}], q[{}]",
644 gate.target_qubits()[0],
645 gate.target_qubits()[1]
646 ),
647 GateType::T => format!("t q[{}]", gate.target_qubits()[0]),
648 GateType::S => format!("s q[{}]", gate.target_qubits()[0]),
649 GateType::Rx(angle) => format!("rx({}) q[{}]", angle, gate.target_qubits()[0]),
650 GateType::Ry(angle) => format!("ry({}) q[{}]", angle, gate.target_qubits()[0]),
651 GateType::Rz(angle) => format!("rz({}) q[{}]", angle, gate.target_qubits()[0]),
652 _ => format!("// {:?}", gate.gate_type()),
653 })
654 }
655
656 fn apply_algorithm_templates(
658 &self,
659 circuit: &[QuantumGate],
660 semantic_info: &Option<SemanticInfo>,
661 ) -> Result<TemplatedCode, QuantRS2Error> {
662 let template = if let Some(sem_info) = semantic_info {
663 self.template_engine
664 .get_template(&sem_info.algorithm_type)?
665 } else {
666 self.template_engine.get_default_template()?
667 };
668
669 Ok(TemplatedCode {
670 template_name: template.name.clone(),
671 filled_template: self.fill_template(&template, circuit)?,
672 parameters: template.parameters.clone(),
673 })
674 }
675
676 fn fill_template(
678 &self,
679 template: &AlgorithmTemplate,
680 circuit: &[QuantumGate],
681 ) -> Result<String, QuantRS2Error> {
682 let mut filled = template.content.clone();
683
684 filled = filled.replace("{{GATE_COUNT}}", &circuit.len().to_string());
686 filled = filled.replace(
687 "{{CIRCUIT_DEPTH}}",
688 &self.calculate_depth(circuit).to_string(),
689 );
690
691 let gate_sequence = circuit
693 .iter()
694 .filter_map(|g| self.format_gate_enhanced(g).ok())
695 .collect::<Vec<_>>()
696 .join("\n");
697 filled = filled.replace("{{GATE_SEQUENCE}}", &gate_sequence);
698
699 Ok(filled)
700 }
701
702 const fn calculate_depth(&self, circuit: &[QuantumGate]) -> usize {
704 circuit.len()
706 }
707
708 const fn is_simd_optimizable(&self, gate: &QuantumGate) -> bool {
710 matches!(
711 gate.gate_type(),
712 GateType::X
713 | GateType::Y
714 | GateType::Z
715 | GateType::H
716 | GateType::Rx(_)
717 | GateType::Ry(_)
718 | GateType::Rz(_)
719 )
720 }
721
722 fn calculate_quality_metrics(
724 &self,
725 circuit: &[QuantumGate],
726 outputs: &HashMap<OutputFormat, String>,
727 ) -> QualityMetrics {
728 let total_lines: usize = outputs.values().map(|output| output.lines().count()).sum();
729
730 let total_chars: usize = outputs.values().map(|output| output.len()).sum();
731
732 QualityMetrics {
733 readability_score: self.calculate_readability_score(outputs),
734 consistency_score: self.calculate_consistency_score(outputs),
735 optimization_score: self.calculate_optimization_score(circuit),
736 documentation_score: self.calculate_documentation_score(outputs),
737 average_line_length: if total_lines > 0 {
738 total_chars / total_lines
739 } else {
740 0
741 },
742 gate_density: circuit.len() as f64 / total_lines.max(1) as f64,
743 comment_ratio: self.calculate_comment_ratio(outputs),
744 simd_optimization_ratio: self.calculate_simd_ratio(circuit),
745 }
746 }
747
748 fn calculate_readability_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
750 outputs
751 .values()
752 .map(|output| {
753 let lines = output.lines().count() as f64;
754 let comments = output.matches("//").count() as f64;
755 let whitespace = output.matches('\n').count() as f64;
756
757 ((comments / lines.max(1.0)).mul_add(0.3, whitespace / lines.max(1.0) * 0.2) + 0.5)
758 .min(1.0)
759 })
760 .sum::<f64>()
761 / outputs.len().max(1) as f64
762 }
763
764 const fn calculate_consistency_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
766 0.85 }
769
770 fn calculate_optimization_score(&self, circuit: &[QuantumGate]) -> f64 {
772 let optimizable = circuit
773 .iter()
774 .filter(|g| self.is_simd_optimizable(g))
775 .count();
776
777 optimizable as f64 / circuit.len().max(1) as f64
778 }
779
780 fn calculate_documentation_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
782 outputs
783 .values()
784 .map(|output| {
785 let lines = output.lines().count() as f64;
786 let doc_comments = output.matches("///").count() as f64;
787 let regular_comments = output.matches("//").count() as f64;
788
789 (doc_comments.mul_add(2.0, regular_comments) / lines.max(1.0)).min(1.0)
790 })
791 .sum::<f64>()
792 / outputs.len().max(1) as f64
793 }
794
795 fn calculate_comment_ratio(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
797 let total_lines: usize = outputs.values().map(|output| output.lines().count()).sum();
798
799 let comment_lines: usize = outputs
800 .values()
801 .map(|output| {
802 output
803 .lines()
804 .filter(|line| line.trim().starts_with("//"))
805 .count()
806 })
807 .sum();
808
809 comment_lines as f64 / total_lines.max(1) as f64
810 }
811
812 fn calculate_simd_ratio(&self, circuit: &[QuantumGate]) -> f64 {
814 let simd_gates = circuit
815 .iter()
816 .filter(|g| self.is_simd_optimizable(g))
817 .count();
818
819 simd_gates as f64 / circuit.len().max(1) as f64
820 }
821
822 fn identify_platform_optimizations(&self) -> Vec<PlatformOptimization> {
824 let mut optimizations = Vec::new();
825
826 if self.platform_capabilities.simd_available() {
827 optimizations.push(PlatformOptimization {
828 optimization_type: "SIMD Vectorization".to_string(),
829 description: "Use SciRS2 SIMD operations for gate implementations".to_string(),
830 expected_speedup: 2.5,
831 });
832 }
833
834 let cpu_count = num_cpus::get();
835 if cpu_count > 1 {
836 optimizations.push(PlatformOptimization {
837 optimization_type: "Parallel Execution".to_string(),
838 description: format!("Utilize {cpu_count} CPU cores for parallel gate execution"),
839 expected_speedup: cpu_count as f64 * 0.7,
840 });
841 }
842
843 optimizations
844 }
845
846 pub fn format_incremental(
848 &mut self,
849 change: CircuitChange,
850 previous_format: &EnhancedFormattedCode,
851 ) -> Result<IncrementalUpdate, QuantRS2Error> {
852 self.incremental_formatter
853 .apply_change(change, previous_format)
854 }
855
856 pub fn get_interactive_suggestions(
858 &self,
859 circuit: &[QuantumGate],
860 cursor_position: usize,
861 ) -> Result<Vec<InteractiveSuggestion>, QuantRS2Error> {
862 self.suggestion_engine
863 .get_suggestions_at_position(circuit, cursor_position)
864 }
865
866 pub fn export_formatted_code(
868 &self,
869 formatted_code: &EnhancedFormattedCode,
870 format: ExportFormat,
871 ) -> Result<String, QuantRS2Error> {
872 self.export_engine.export(formatted_code, format)
873 }
874}
875
876#[derive(Debug, Clone)]
878pub struct EnhancedFormattedCode {
879 pub formatted_outputs: HashMap<OutputFormat, String>,
880 pub visual_representations: HashMap<VisualFormat, String>,
881 pub semantic_info: Option<SemanticInfo>,
882 pub beautification_suggestions: Option<BeautificationSuggestions>,
883 pub hardware_formatting: Option<HardwareFormattingInfo>,
884 pub formatting_suggestions: Vec<FormattingSuggestion>,
885 pub templated_code: Option<TemplatedCode>,
886 pub syntax_metadata: Option<SyntaxMetadata>,
887 pub quality_metrics: QualityMetrics,
888 pub formatting_time: std::time::Duration,
889 pub platform_optimizations: Vec<PlatformOptimization>,
890}
891
892#[derive(Debug, Clone)]
894pub struct FormattingOptions {
895 pub target_hardware: QuantumBackend,
896 pub include_code_formats: bool,
897 pub apply_templates: bool,
898 pub optimization_level: OptimizationLevel,
899}
900
901#[derive(Debug, Clone, Copy)]
903pub enum OptimizationLevel {
904 None,
905 Basic,
906 Advanced,
907 Maximum,
908}
909
910#[derive(Debug, Clone)]
912pub struct SemanticInfo {
913 pub algorithm_type: String,
914 pub complexity_class: String,
915 pub purpose: String,
916 pub algorithm_phases: Vec<AlgorithmPhase>,
917 pub identified_patterns: Vec<QuantumPattern>,
918}
919
920#[derive(Debug, Clone)]
922pub struct AlgorithmPhase {
923 pub name: String,
924 pub start_index: usize,
925 pub end_index: usize,
926 pub description: String,
927}
928
929#[derive(Debug, Clone)]
931pub struct QuantumPattern {
932 pub pattern_type: String,
933 pub gates: Vec<usize>,
934 pub description: String,
935}
936
937#[derive(Debug, Clone)]
939pub struct BeautificationSuggestions {
940 pub layout_improvements: Vec<String>,
941 pub naming_suggestions: Vec<String>,
942 pub structure_improvements: Vec<String>,
943 pub style_recommendations: Vec<String>,
944}
945
946#[derive(Debug, Clone)]
948pub struct HardwareFormattingInfo {
949 pub target_backend: QuantumBackend,
950 pub native_gates: Vec<String>,
951 pub connectivity_constraints: Vec<(usize, usize)>,
952 pub optimization_hints: Vec<String>,
953}
954
955#[derive(Debug, Clone)]
957pub struct FormattingSuggestion {
958 pub suggestion_type: SuggestionType,
959 pub description: String,
960 pub location: SuggestionLocation,
961 pub priority: Priority,
962 pub auto_applicable: bool,
963}
964
965#[derive(Debug, Clone)]
967pub enum SuggestionType {
968 Layout,
969 Performance,
970 Readability,
971 Consistency,
972 Documentation,
973}
974
975#[derive(Debug, Clone)]
977pub enum SuggestionLocation {
978 Line(usize),
979 Range(usize, usize),
980 Global,
981}
982
983#[derive(Debug, Clone, Copy)]
985pub enum Priority {
986 Low,
987 Medium,
988 High,
989 Critical,
990}
991
992#[derive(Debug, Clone)]
994pub struct TemplatedCode {
995 pub template_name: String,
996 pub filled_template: String,
997 pub parameters: HashMap<String, String>,
998}
999
1000#[derive(Debug, Clone)]
1002pub struct SyntaxMetadata {
1003 pub tokens: Vec<SyntaxToken>,
1004 pub scopes: Vec<SyntaxScope>,
1005 pub color_scheme: ColorScheme,
1006}
1007
1008#[derive(Debug, Clone)]
1010pub struct SyntaxToken {
1011 pub token_type: TokenType,
1012 pub start: usize,
1013 pub end: usize,
1014 pub text: String,
1015}
1016
1017#[derive(Debug, Clone)]
1019pub enum TokenType {
1020 Keyword,
1021 Gate,
1022 Qubit,
1023 Parameter,
1024 Comment,
1025 String,
1026 Number,
1027}
1028
1029#[derive(Debug, Clone)]
1031pub struct SyntaxScope {
1032 pub scope_type: String,
1033 pub start: usize,
1034 pub end: usize,
1035}
1036
1037#[derive(Debug, Clone)]
1039pub struct ColorScheme {
1040 pub name: String,
1041 pub colors: HashMap<TokenType, String>,
1042}
1043
1044#[derive(Debug, Clone)]
1046pub struct QualityMetrics {
1047 pub readability_score: f64,
1048 pub consistency_score: f64,
1049 pub optimization_score: f64,
1050 pub documentation_score: f64,
1051 pub average_line_length: usize,
1052 pub gate_density: f64,
1053 pub comment_ratio: f64,
1054 pub simd_optimization_ratio: f64,
1055}
1056
1057#[derive(Debug, Clone)]
1059pub struct PlatformOptimization {
1060 pub optimization_type: String,
1061 pub description: String,
1062 pub expected_speedup: f64,
1063}
1064
1065#[derive(Debug, Clone)]
1067pub struct CircuitChange {
1068 pub change_type: ChangeType,
1069 pub location: usize,
1070 pub new_gates: Vec<QuantumGate>,
1071}
1072
1073#[derive(Debug, Clone)]
1075pub enum ChangeType {
1076 Insert,
1077 Delete,
1078 Modify,
1079}
1080
1081#[derive(Debug, Clone)]
1083pub struct IncrementalUpdate {
1084 pub updated_sections: Vec<UpdatedSection>,
1085 pub update_time: std::time::Duration,
1086}
1087
1088#[derive(Debug, Clone)]
1090pub struct UpdatedSection {
1091 pub format: OutputFormat,
1092 pub start_line: usize,
1093 pub end_line: usize,
1094 pub new_content: String,
1095}
1096
1097#[derive(Debug, Clone)]
1099pub struct InteractiveSuggestion {
1100 pub suggestion: String,
1101 pub completion: String,
1102 pub confidence: f64,
1103}
1104
1105#[derive(Debug)]
1108pub struct SemanticAnalyzer {}
1109
1110impl SemanticAnalyzer {
1111 pub const fn new() -> Self {
1112 Self {}
1113 }
1114
1115 pub fn analyze_circuit(
1116 &self,
1117 circuit: &[QuantumGate],
1118 _num_qubits: usize,
1119 ) -> Result<SemanticInfo, QuantRS2Error> {
1120 let algorithm_type = if circuit.len() > 10 {
1121 "Complex Algorithm"
1122 } else {
1123 "Simple Circuit"
1124 };
1125
1126 Ok(SemanticInfo {
1127 algorithm_type: algorithm_type.to_string(),
1128 complexity_class: "BQP".to_string(),
1129 purpose: "Quantum computation".to_string(),
1130 algorithm_phases: vec![AlgorithmPhase {
1131 name: "Initialization".to_string(),
1132 start_index: 0,
1133 end_index: circuit.len().min(3),
1134 description: "State preparation".to_string(),
1135 }],
1136 identified_patterns: Vec::new(),
1137 })
1138 }
1139}
1140
1141#[derive(Debug)]
1142pub struct AIBeautifier {}
1143
1144impl AIBeautifier {
1145 pub const fn new() -> Self {
1146 Self {}
1147 }
1148
1149 pub fn generate_beautification_suggestions(
1150 &self,
1151 _circuit: &[QuantumGate],
1152 _semantic_info: &Option<SemanticInfo>,
1153 ) -> Result<BeautificationSuggestions, QuantRS2Error> {
1154 Ok(BeautificationSuggestions {
1155 layout_improvements: vec!["Group related gates together".to_string()],
1156 naming_suggestions: vec!["Use descriptive gate labels".to_string()],
1157 structure_improvements: vec!["Consider gate fusion opportunities".to_string()],
1158 style_recommendations: vec!["Add comments for complex sections".to_string()],
1159 })
1160 }
1161}
1162
1163#[derive(Debug)]
1164pub struct VisualRenderer {}
1165
1166impl VisualRenderer {
1167 pub const fn new() -> Self {
1168 Self {}
1169 }
1170
1171 pub fn render_ascii(
1172 &self,
1173 circuit: &[QuantumGate],
1174 num_qubits: usize,
1175 ) -> Result<String, QuantRS2Error> {
1176 let mut output = String::new();
1177
1178 for q in 0..num_qubits {
1180 let _ = write!(output, "q{q}: ");
1181
1182 for gate in circuit {
1183 if gate.target_qubits().contains(&q) {
1184 match gate.gate_type() {
1185 GateType::X => output.push_str("-X-"),
1186 GateType::H => output.push_str("-H-"),
1187 GateType::CNOT => {
1188 if gate.target_qubits()[0] == q {
1189 output.push_str("-●-");
1190 } else {
1191 output.push_str("-⊕-");
1192 }
1193 }
1194 _ => output.push_str("-G-"),
1195 }
1196 } else {
1197 output.push_str("---");
1198 }
1199 }
1200
1201 output.push('\n');
1202 }
1203
1204 Ok(output)
1205 }
1206
1207 pub fn render_unicode(
1208 &self,
1209 circuit: &[QuantumGate],
1210 num_qubits: usize,
1211 ) -> Result<String, QuantRS2Error> {
1212 let mut output = String::new();
1213
1214 for q in 0..num_qubits {
1215 let _ = write!(output, "q{q}: ");
1216
1217 for gate in circuit {
1218 if gate.target_qubits().contains(&q) {
1219 match gate.gate_type() {
1220 GateType::X => output.push_str("─X̂─"),
1221 GateType::Y => output.push_str("─Ŷ─"),
1222 GateType::Z => output.push_str("─Ẑ─"),
1223 GateType::H => output.push_str("─Ĥ─"),
1224 GateType::CNOT => {
1225 if gate.target_qubits()[0] == q {
1226 output.push_str("─●─");
1227 } else {
1228 output.push_str("─⊕─");
1229 }
1230 }
1231 _ => output.push_str("─□─"),
1232 }
1233 } else {
1234 output.push_str("───");
1235 }
1236 }
1237
1238 output.push('\n');
1239 }
1240
1241 Ok(output)
1242 }
1243
1244 pub fn render_latex(
1245 &self,
1246 _circuit: &[QuantumGate],
1247 _num_qubits: usize,
1248 ) -> Result<String, QuantRS2Error> {
1249 Ok("\\begin{quantikz}\n% LaTeX circuit\n\\end{quantikz}".to_string())
1250 }
1251
1252 pub fn render_svg(
1253 &self,
1254 _circuit: &[QuantumGate],
1255 _num_qubits: usize,
1256 ) -> Result<String, QuantRS2Error> {
1257 Ok("<svg><!-- SVG circuit --></svg>".to_string())
1258 }
1259
1260 pub fn render_html(
1261 &self,
1262 _circuit: &[QuantumGate],
1263 _num_qubits: usize,
1264 ) -> Result<String, QuantRS2Error> {
1265 Ok("<div class=\"quantum-circuit\"><!-- HTML circuit --></div>".to_string())
1266 }
1267
1268 pub fn render_markdown(
1269 &self,
1270 circuit: &[QuantumGate],
1271 num_qubits: usize,
1272 ) -> Result<String, QuantRS2Error> {
1273 let mut output = String::new();
1274
1275 output.push_str("## Quantum Circuit\n\n");
1276 output.push_str("```\n");
1277 output.push_str(&self.render_ascii(circuit, num_qubits)?);
1278 output.push_str("```\n");
1279
1280 Ok(output)
1281 }
1282
1283 pub fn render_graphviz(
1284 &self,
1285 _circuit: &[QuantumGate],
1286 _num_qubits: usize,
1287 ) -> Result<String, QuantRS2Error> {
1288 Ok("digraph QuantumCircuit {\n // GraphViz representation\n}".to_string())
1289 }
1290}
1291
1292#[derive(Debug)]
1293pub struct TemplateEngine {}
1294
1295impl TemplateEngine {
1296 pub const fn new() -> Self {
1297 Self {}
1298 }
1299
1300 pub fn get_template(&self, algorithm_type: &str) -> Result<AlgorithmTemplate, QuantRS2Error> {
1301 Ok(AlgorithmTemplate {
1302 name: algorithm_type.to_string(),
1303 content: "// {{ALGORITHM_NAME}}\n// Gates: {{GATE_COUNT}}\n// Depth: {{CIRCUIT_DEPTH}}\n\n{{GATE_SEQUENCE}}".to_string(),
1304 parameters: HashMap::new(),
1305 })
1306 }
1307
1308 pub fn get_default_template(&self) -> Result<AlgorithmTemplate, QuantRS2Error> {
1309 self.get_template("Default")
1310 }
1311}
1312
1313#[derive(Debug, Clone)]
1314pub struct AlgorithmTemplate {
1315 pub name: String,
1316 pub content: String,
1317 pub parameters: HashMap<String, String>,
1318}
1319
1320#[derive(Debug)]
1321pub struct HardwareOptimizer {}
1322
1323impl HardwareOptimizer {
1324 pub const fn new() -> Self {
1325 Self {}
1326 }
1327
1328 pub fn optimize_for_hardware(
1329 &self,
1330 _circuit: &[QuantumGate],
1331 backend: &QuantumBackend,
1332 ) -> Result<HardwareFormattingInfo, QuantRS2Error> {
1333 let native_gates = match backend {
1334 QuantumBackend::IBMQ => vec!["rz", "sx", "cx"],
1335 QuantumBackend::IonQ => vec!["rx", "ry", "rz", "rxx"],
1336 _ => vec!["u1", "u2", "u3", "cx"],
1337 };
1338
1339 Ok(HardwareFormattingInfo {
1340 target_backend: *backend,
1341 native_gates: native_gates.iter().map(|s| s.to_string()).collect(),
1342 connectivity_constraints: Vec::new(),
1343 optimization_hints: vec!["Use native gate set for optimal performance".to_string()],
1344 })
1345 }
1346}
1347
1348#[derive(Debug)]
1349pub struct IncrementalFormatter {}
1350
1351impl IncrementalFormatter {
1352 pub const fn new() -> Self {
1353 Self {}
1354 }
1355
1356 pub fn apply_change(
1357 &self,
1358 _change: CircuitChange,
1359 _previous: &EnhancedFormattedCode,
1360 ) -> Result<IncrementalUpdate, QuantRS2Error> {
1361 Ok(IncrementalUpdate {
1362 updated_sections: Vec::new(),
1363 update_time: std::time::Duration::from_millis(10),
1364 })
1365 }
1366}
1367
1368#[derive(Debug)]
1369pub struct SuggestionEngine {}
1370
1371impl SuggestionEngine {
1372 pub const fn new() -> Self {
1373 Self {}
1374 }
1375
1376 pub fn generate_suggestions(
1377 &self,
1378 _circuit: &[QuantumGate],
1379 _semantic_info: &Option<SemanticInfo>,
1380 ) -> Result<Vec<FormattingSuggestion>, QuantRS2Error> {
1381 Ok(vec![FormattingSuggestion {
1382 suggestion_type: SuggestionType::Performance,
1383 description: "Consider gate fusion for adjacent single-qubit gates".to_string(),
1384 location: SuggestionLocation::Global,
1385 priority: Priority::Medium,
1386 auto_applicable: true,
1387 }])
1388 }
1389
1390 pub fn get_suggestions_at_position(
1391 &self,
1392 _circuit: &[QuantumGate],
1393 _position: usize,
1394 ) -> Result<Vec<InteractiveSuggestion>, QuantRS2Error> {
1395 Ok(vec![InteractiveSuggestion {
1396 suggestion: "Add Hadamard gate".to_string(),
1397 completion: "H(0)".to_string(),
1398 confidence: 0.85,
1399 }])
1400 }
1401}
1402
1403#[derive(Debug)]
1404pub struct ExportEngine {}
1405
1406impl ExportEngine {
1407 pub const fn new() -> Self {
1408 Self {}
1409 }
1410
1411 pub fn export(
1412 &self,
1413 formatted_code: &EnhancedFormattedCode,
1414 format: ExportFormat,
1415 ) -> Result<String, QuantRS2Error> {
1416 match format {
1417 ExportFormat::JSON => Ok(format!(
1418 "{{\"circuit\": \"exported\", \"gates\": {}}}",
1419 formatted_code.formatted_outputs.len()
1420 )),
1421 ExportFormat::YAML => Ok(format!(
1422 "circuit: exported\ngates: {}",
1423 formatted_code.formatted_outputs.len()
1424 )),
1425 _ => Ok("Exported circuit".to_string()),
1426 }
1427 }
1428}
1429
1430#[derive(Debug)]
1431pub struct SyntaxHighlighter {}
1432
1433impl SyntaxHighlighter {
1434 pub const fn new() -> Self {
1435 Self {}
1436 }
1437
1438 pub fn generate_metadata(
1439 &self,
1440 circuit: &[QuantumGate],
1441 ) -> Result<SyntaxMetadata, QuantRS2Error> {
1442 let mut tokens = Vec::new();
1443
1444 for (i, gate) in circuit.iter().enumerate() {
1445 tokens.push(SyntaxToken {
1446 token_type: TokenType::Gate,
1447 start: i * 10,
1448 end: i * 10 + 5,
1449 text: format!("{:?}", gate.gate_type()),
1450 });
1451 }
1452
1453 Ok(SyntaxMetadata {
1454 tokens,
1455 scopes: Vec::new(),
1456 color_scheme: ColorScheme {
1457 name: "Quantum Dark".to_string(),
1458 colors: HashMap::new(),
1459 },
1460 })
1461 }
1462}
1463
1464#[cfg(test)]
1465mod tests {
1466 use super::*;
1467
1468 #[test]
1469 fn test_enhanced_formatter_creation() {
1470 let formatter = EnhancedQuantumFormatter::new();
1471 assert!(formatter.config.enable_ai_beautification);
1472 assert!(formatter.config.enable_semantic_formatting);
1473 }
1474
1475 #[test]
1476 fn test_enhanced_circuit_formatting() {
1477 let formatter = EnhancedQuantumFormatter::new();
1478 let circuit = vec![
1479 QuantumGate::new(GateType::H, vec![0], None),
1480 QuantumGate::new(GateType::CNOT, vec![0, 1], None),
1481 ];
1482
1483 let options = FormattingOptions {
1484 target_hardware: QuantumBackend::IBMQ,
1485 include_code_formats: true,
1486 apply_templates: true,
1487 optimization_level: OptimizationLevel::Advanced,
1488 };
1489
1490 let result = formatter
1491 .format_circuit_enhanced(&circuit, 2, options)
1492 .expect("circuit formatting failed");
1493 assert!(!result.formatted_outputs.is_empty());
1494 assert!(result.quality_metrics.readability_score > 0.0);
1495 }
1496
1497 #[test]
1498 fn test_visual_rendering() {
1499 let renderer = VisualRenderer::new();
1500 let circuit = vec![
1501 QuantumGate::new(GateType::H, vec![0], None),
1502 QuantumGate::new(GateType::X, vec![1], None),
1503 ];
1504
1505 let ascii = renderer
1506 .render_ascii(&circuit, 2)
1507 .expect("ascii rendering failed");
1508 assert!(ascii.contains("-H-"));
1509 assert!(ascii.contains("-X-"));
1510 }
1511
1512 #[test]
1513 fn test_unicode_rendering() {
1514 let renderer = VisualRenderer::new();
1515 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1516
1517 let unicode = renderer
1518 .render_unicode(&circuit, 1)
1519 .expect("unicode rendering failed");
1520 assert!(unicode.contains("Ĥ"));
1521 }
1522
1523 #[test]
1524 fn test_semantic_analysis() {
1525 let analyzer = SemanticAnalyzer::new();
1526 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1527
1528 let semantic_info = analyzer
1529 .analyze_circuit(&circuit, 1)
1530 .expect("semantic analysis failed");
1531 assert!(!semantic_info.algorithm_type.is_empty());
1532 assert!(!semantic_info.algorithm_phases.is_empty());
1533 }
1534
1535 #[test]
1536 fn test_ai_beautification() {
1537 let beautifier = AIBeautifier::new();
1538 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1539
1540 let suggestions = beautifier
1541 .generate_beautification_suggestions(&circuit, &None)
1542 .expect("beautification suggestions failed");
1543 assert!(!suggestions.layout_improvements.is_empty());
1544 }
1545
1546 #[test]
1547 fn test_hardware_optimization() {
1548 let optimizer = HardwareOptimizer::new();
1549 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1550
1551 let hw_info = optimizer
1552 .optimize_for_hardware(&circuit, &QuantumBackend::IBMQ)
1553 .expect("hardware optimization failed");
1554 assert!(!hw_info.native_gates.is_empty());
1555 assert_eq!(hw_info.target_backend, QuantumBackend::IBMQ);
1556 }
1557
1558 #[test]
1559 fn test_quality_metrics_calculation() {
1560 let formatter = EnhancedQuantumFormatter::new();
1561 let circuit = vec![
1562 QuantumGate::new(GateType::H, vec![0], None),
1563 QuantumGate::new(GateType::X, vec![1], None),
1564 ];
1565
1566 let mut outputs = HashMap::new();
1567 outputs.insert(OutputFormat::Text, "// Test\nH(0)\nX(1)".to_string());
1568
1569 let metrics = formatter.calculate_quality_metrics(&circuit, &outputs);
1570 assert!(metrics.readability_score > 0.0);
1571 assert!(metrics.simd_optimization_ratio > 0.0);
1572 }
1573
1574 #[test]
1575 fn test_interactive_suggestions() {
1576 let engine = SuggestionEngine::new();
1577 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1578
1579 let suggestions = engine
1580 .get_suggestions_at_position(&circuit, 0)
1581 .expect("suggestions at position failed");
1582 assert!(!suggestions.is_empty());
1583 assert!(suggestions[0].confidence > 0.0);
1584 }
1585
1586 #[test]
1587 fn test_export_functionality() {
1588 let engine = ExportEngine::new();
1589 let formatted_code = EnhancedFormattedCode {
1590 formatted_outputs: HashMap::new(),
1591 visual_representations: HashMap::new(),
1592 semantic_info: None,
1593 beautification_suggestions: None,
1594 hardware_formatting: None,
1595 formatting_suggestions: Vec::new(),
1596 templated_code: None,
1597 syntax_metadata: None,
1598 quality_metrics: QualityMetrics {
1599 readability_score: 0.9,
1600 consistency_score: 0.85,
1601 optimization_score: 0.7,
1602 documentation_score: 0.8,
1603 average_line_length: 80,
1604 gate_density: 0.5,
1605 comment_ratio: 0.3,
1606 simd_optimization_ratio: 0.6,
1607 },
1608 formatting_time: std::time::Duration::from_millis(100),
1609 platform_optimizations: Vec::new(),
1610 };
1611
1612 let json_export = engine
1613 .export(&formatted_code, ExportFormat::JSON)
1614 .expect("json export failed");
1615 assert!(json_export.contains("circuit"));
1616 }
1617}