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: total_chars.checked_div(total_lines).unwrap_or(0),
738 gate_density: circuit.len() as f64 / total_lines.max(1) as f64,
739 comment_ratio: self.calculate_comment_ratio(outputs),
740 simd_optimization_ratio: self.calculate_simd_ratio(circuit),
741 }
742 }
743
744 fn calculate_readability_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
746 outputs
747 .values()
748 .map(|output| {
749 let lines = output.lines().count() as f64;
750 let comments = output.matches("//").count() as f64;
751 let whitespace = output.matches('\n').count() as f64;
752
753 ((comments / lines.max(1.0)).mul_add(0.3, whitespace / lines.max(1.0) * 0.2) + 0.5)
754 .min(1.0)
755 })
756 .sum::<f64>()
757 / outputs.len().max(1) as f64
758 }
759
760 const fn calculate_consistency_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
762 0.85 }
765
766 fn calculate_optimization_score(&self, circuit: &[QuantumGate]) -> f64 {
768 let optimizable = circuit
769 .iter()
770 .filter(|g| self.is_simd_optimizable(g))
771 .count();
772
773 optimizable as f64 / circuit.len().max(1) as f64
774 }
775
776 fn calculate_documentation_score(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
778 outputs
779 .values()
780 .map(|output| {
781 let lines = output.lines().count() as f64;
782 let doc_comments = output.matches("///").count() as f64;
783 let regular_comments = output.matches("//").count() as f64;
784
785 (doc_comments.mul_add(2.0, regular_comments) / lines.max(1.0)).min(1.0)
786 })
787 .sum::<f64>()
788 / outputs.len().max(1) as f64
789 }
790
791 fn calculate_comment_ratio(&self, outputs: &HashMap<OutputFormat, String>) -> f64 {
793 let total_lines: usize = outputs.values().map(|output| output.lines().count()).sum();
794
795 let comment_lines: usize = outputs
796 .values()
797 .map(|output| {
798 output
799 .lines()
800 .filter(|line| line.trim().starts_with("//"))
801 .count()
802 })
803 .sum();
804
805 comment_lines as f64 / total_lines.max(1) as f64
806 }
807
808 fn calculate_simd_ratio(&self, circuit: &[QuantumGate]) -> f64 {
810 let simd_gates = circuit
811 .iter()
812 .filter(|g| self.is_simd_optimizable(g))
813 .count();
814
815 simd_gates as f64 / circuit.len().max(1) as f64
816 }
817
818 fn identify_platform_optimizations(&self) -> Vec<PlatformOptimization> {
820 let mut optimizations = Vec::new();
821
822 if self.platform_capabilities.simd_available() {
823 optimizations.push(PlatformOptimization {
824 optimization_type: "SIMD Vectorization".to_string(),
825 description: "Use SciRS2 SIMD operations for gate implementations".to_string(),
826 expected_speedup: 2.5,
827 });
828 }
829
830 let cpu_count = num_cpus::get();
831 if cpu_count > 1 {
832 optimizations.push(PlatformOptimization {
833 optimization_type: "Parallel Execution".to_string(),
834 description: format!("Utilize {cpu_count} CPU cores for parallel gate execution"),
835 expected_speedup: cpu_count as f64 * 0.7,
836 });
837 }
838
839 optimizations
840 }
841
842 pub fn format_incremental(
844 &mut self,
845 change: CircuitChange,
846 previous_format: &EnhancedFormattedCode,
847 ) -> Result<IncrementalUpdate, QuantRS2Error> {
848 self.incremental_formatter
849 .apply_change(change, previous_format)
850 }
851
852 pub fn get_interactive_suggestions(
854 &self,
855 circuit: &[QuantumGate],
856 cursor_position: usize,
857 ) -> Result<Vec<InteractiveSuggestion>, QuantRS2Error> {
858 self.suggestion_engine
859 .get_suggestions_at_position(circuit, cursor_position)
860 }
861
862 pub fn export_formatted_code(
864 &self,
865 formatted_code: &EnhancedFormattedCode,
866 format: ExportFormat,
867 ) -> Result<String, QuantRS2Error> {
868 self.export_engine.export(formatted_code, format)
869 }
870}
871
872#[derive(Debug, Clone)]
874pub struct EnhancedFormattedCode {
875 pub formatted_outputs: HashMap<OutputFormat, String>,
876 pub visual_representations: HashMap<VisualFormat, String>,
877 pub semantic_info: Option<SemanticInfo>,
878 pub beautification_suggestions: Option<BeautificationSuggestions>,
879 pub hardware_formatting: Option<HardwareFormattingInfo>,
880 pub formatting_suggestions: Vec<FormattingSuggestion>,
881 pub templated_code: Option<TemplatedCode>,
882 pub syntax_metadata: Option<SyntaxMetadata>,
883 pub quality_metrics: QualityMetrics,
884 pub formatting_time: std::time::Duration,
885 pub platform_optimizations: Vec<PlatformOptimization>,
886}
887
888#[derive(Debug, Clone)]
890pub struct FormattingOptions {
891 pub target_hardware: QuantumBackend,
892 pub include_code_formats: bool,
893 pub apply_templates: bool,
894 pub optimization_level: OptimizationLevel,
895}
896
897#[derive(Debug, Clone, Copy)]
899pub enum OptimizationLevel {
900 None,
901 Basic,
902 Advanced,
903 Maximum,
904}
905
906#[derive(Debug, Clone)]
908pub struct SemanticInfo {
909 pub algorithm_type: String,
910 pub complexity_class: String,
911 pub purpose: String,
912 pub algorithm_phases: Vec<AlgorithmPhase>,
913 pub identified_patterns: Vec<QuantumPattern>,
914}
915
916#[derive(Debug, Clone)]
918pub struct AlgorithmPhase {
919 pub name: String,
920 pub start_index: usize,
921 pub end_index: usize,
922 pub description: String,
923}
924
925#[derive(Debug, Clone)]
927pub struct QuantumPattern {
928 pub pattern_type: String,
929 pub gates: Vec<usize>,
930 pub description: String,
931}
932
933#[derive(Debug, Clone)]
935pub struct BeautificationSuggestions {
936 pub layout_improvements: Vec<String>,
937 pub naming_suggestions: Vec<String>,
938 pub structure_improvements: Vec<String>,
939 pub style_recommendations: Vec<String>,
940}
941
942#[derive(Debug, Clone)]
944pub struct HardwareFormattingInfo {
945 pub target_backend: QuantumBackend,
946 pub native_gates: Vec<String>,
947 pub connectivity_constraints: Vec<(usize, usize)>,
948 pub optimization_hints: Vec<String>,
949}
950
951#[derive(Debug, Clone)]
953pub struct FormattingSuggestion {
954 pub suggestion_type: SuggestionType,
955 pub description: String,
956 pub location: SuggestionLocation,
957 pub priority: Priority,
958 pub auto_applicable: bool,
959}
960
961#[derive(Debug, Clone)]
963pub enum SuggestionType {
964 Layout,
965 Performance,
966 Readability,
967 Consistency,
968 Documentation,
969}
970
971#[derive(Debug, Clone)]
973pub enum SuggestionLocation {
974 Line(usize),
975 Range(usize, usize),
976 Global,
977}
978
979#[derive(Debug, Clone, Copy)]
981pub enum Priority {
982 Low,
983 Medium,
984 High,
985 Critical,
986}
987
988#[derive(Debug, Clone)]
990pub struct TemplatedCode {
991 pub template_name: String,
992 pub filled_template: String,
993 pub parameters: HashMap<String, String>,
994}
995
996#[derive(Debug, Clone)]
998pub struct SyntaxMetadata {
999 pub tokens: Vec<SyntaxToken>,
1000 pub scopes: Vec<SyntaxScope>,
1001 pub color_scheme: ColorScheme,
1002}
1003
1004#[derive(Debug, Clone)]
1006pub struct SyntaxToken {
1007 pub token_type: TokenType,
1008 pub start: usize,
1009 pub end: usize,
1010 pub text: String,
1011}
1012
1013#[derive(Debug, Clone)]
1015pub enum TokenType {
1016 Keyword,
1017 Gate,
1018 Qubit,
1019 Parameter,
1020 Comment,
1021 String,
1022 Number,
1023}
1024
1025#[derive(Debug, Clone)]
1027pub struct SyntaxScope {
1028 pub scope_type: String,
1029 pub start: usize,
1030 pub end: usize,
1031}
1032
1033#[derive(Debug, Clone)]
1035pub struct ColorScheme {
1036 pub name: String,
1037 pub colors: HashMap<TokenType, String>,
1038}
1039
1040#[derive(Debug, Clone)]
1042pub struct QualityMetrics {
1043 pub readability_score: f64,
1044 pub consistency_score: f64,
1045 pub optimization_score: f64,
1046 pub documentation_score: f64,
1047 pub average_line_length: usize,
1048 pub gate_density: f64,
1049 pub comment_ratio: f64,
1050 pub simd_optimization_ratio: f64,
1051}
1052
1053#[derive(Debug, Clone)]
1055pub struct PlatformOptimization {
1056 pub optimization_type: String,
1057 pub description: String,
1058 pub expected_speedup: f64,
1059}
1060
1061#[derive(Debug, Clone)]
1063pub struct CircuitChange {
1064 pub change_type: ChangeType,
1065 pub location: usize,
1066 pub new_gates: Vec<QuantumGate>,
1067}
1068
1069#[derive(Debug, Clone)]
1071pub enum ChangeType {
1072 Insert,
1073 Delete,
1074 Modify,
1075}
1076
1077#[derive(Debug, Clone)]
1079pub struct IncrementalUpdate {
1080 pub updated_sections: Vec<UpdatedSection>,
1081 pub update_time: std::time::Duration,
1082}
1083
1084#[derive(Debug, Clone)]
1086pub struct UpdatedSection {
1087 pub format: OutputFormat,
1088 pub start_line: usize,
1089 pub end_line: usize,
1090 pub new_content: String,
1091}
1092
1093#[derive(Debug, Clone)]
1095pub struct InteractiveSuggestion {
1096 pub suggestion: String,
1097 pub completion: String,
1098 pub confidence: f64,
1099}
1100
1101#[derive(Debug)]
1104pub struct SemanticAnalyzer {}
1105
1106impl SemanticAnalyzer {
1107 pub const fn new() -> Self {
1108 Self {}
1109 }
1110
1111 pub fn analyze_circuit(
1112 &self,
1113 circuit: &[QuantumGate],
1114 _num_qubits: usize,
1115 ) -> Result<SemanticInfo, QuantRS2Error> {
1116 let algorithm_type = if circuit.len() > 10 {
1117 "Complex Algorithm"
1118 } else {
1119 "Simple Circuit"
1120 };
1121
1122 Ok(SemanticInfo {
1123 algorithm_type: algorithm_type.to_string(),
1124 complexity_class: "BQP".to_string(),
1125 purpose: "Quantum computation".to_string(),
1126 algorithm_phases: vec![AlgorithmPhase {
1127 name: "Initialization".to_string(),
1128 start_index: 0,
1129 end_index: circuit.len().min(3),
1130 description: "State preparation".to_string(),
1131 }],
1132 identified_patterns: Vec::new(),
1133 })
1134 }
1135}
1136
1137#[derive(Debug)]
1138pub struct AIBeautifier {}
1139
1140impl AIBeautifier {
1141 pub const fn new() -> Self {
1142 Self {}
1143 }
1144
1145 pub fn generate_beautification_suggestions(
1146 &self,
1147 _circuit: &[QuantumGate],
1148 _semantic_info: &Option<SemanticInfo>,
1149 ) -> Result<BeautificationSuggestions, QuantRS2Error> {
1150 Ok(BeautificationSuggestions {
1151 layout_improvements: vec!["Group related gates together".to_string()],
1152 naming_suggestions: vec!["Use descriptive gate labels".to_string()],
1153 structure_improvements: vec!["Consider gate fusion opportunities".to_string()],
1154 style_recommendations: vec!["Add comments for complex sections".to_string()],
1155 })
1156 }
1157}
1158
1159#[derive(Debug)]
1160pub struct VisualRenderer {}
1161
1162impl VisualRenderer {
1163 pub const fn new() -> Self {
1164 Self {}
1165 }
1166
1167 pub fn render_ascii(
1168 &self,
1169 circuit: &[QuantumGate],
1170 num_qubits: usize,
1171 ) -> Result<String, QuantRS2Error> {
1172 let mut output = String::new();
1173
1174 for q in 0..num_qubits {
1176 let _ = write!(output, "q{q}: ");
1177
1178 for gate in circuit {
1179 if gate.target_qubits().contains(&q) {
1180 match gate.gate_type() {
1181 GateType::X => output.push_str("-X-"),
1182 GateType::H => output.push_str("-H-"),
1183 GateType::CNOT => {
1184 if gate.target_qubits()[0] == q {
1185 output.push_str("-●-");
1186 } else {
1187 output.push_str("-⊕-");
1188 }
1189 }
1190 _ => output.push_str("-G-"),
1191 }
1192 } else {
1193 output.push_str("---");
1194 }
1195 }
1196
1197 output.push('\n');
1198 }
1199
1200 Ok(output)
1201 }
1202
1203 pub fn render_unicode(
1204 &self,
1205 circuit: &[QuantumGate],
1206 num_qubits: usize,
1207 ) -> Result<String, QuantRS2Error> {
1208 let mut output = String::new();
1209
1210 for q in 0..num_qubits {
1211 let _ = write!(output, "q{q}: ");
1212
1213 for gate in circuit {
1214 if gate.target_qubits().contains(&q) {
1215 match gate.gate_type() {
1216 GateType::X => output.push_str("─X̂─"),
1217 GateType::Y => output.push_str("─Ŷ─"),
1218 GateType::Z => output.push_str("─Ẑ─"),
1219 GateType::H => output.push_str("─Ĥ─"),
1220 GateType::CNOT => {
1221 if gate.target_qubits()[0] == q {
1222 output.push_str("─●─");
1223 } else {
1224 output.push_str("─⊕─");
1225 }
1226 }
1227 _ => output.push_str("─□─"),
1228 }
1229 } else {
1230 output.push_str("───");
1231 }
1232 }
1233
1234 output.push('\n');
1235 }
1236
1237 Ok(output)
1238 }
1239
1240 pub fn render_latex(
1241 &self,
1242 _circuit: &[QuantumGate],
1243 _num_qubits: usize,
1244 ) -> Result<String, QuantRS2Error> {
1245 Ok("\\begin{quantikz}\n% LaTeX circuit\n\\end{quantikz}".to_string())
1246 }
1247
1248 pub fn render_svg(
1249 &self,
1250 _circuit: &[QuantumGate],
1251 _num_qubits: usize,
1252 ) -> Result<String, QuantRS2Error> {
1253 Ok("<svg><!-- SVG circuit --></svg>".to_string())
1254 }
1255
1256 pub fn render_html(
1257 &self,
1258 _circuit: &[QuantumGate],
1259 _num_qubits: usize,
1260 ) -> Result<String, QuantRS2Error> {
1261 Ok("<div class=\"quantum-circuit\"><!-- HTML circuit --></div>".to_string())
1262 }
1263
1264 pub fn render_markdown(
1265 &self,
1266 circuit: &[QuantumGate],
1267 num_qubits: usize,
1268 ) -> Result<String, QuantRS2Error> {
1269 let mut output = String::new();
1270
1271 output.push_str("## Quantum Circuit\n\n");
1272 output.push_str("```\n");
1273 output.push_str(&self.render_ascii(circuit, num_qubits)?);
1274 output.push_str("```\n");
1275
1276 Ok(output)
1277 }
1278
1279 pub fn render_graphviz(
1280 &self,
1281 _circuit: &[QuantumGate],
1282 _num_qubits: usize,
1283 ) -> Result<String, QuantRS2Error> {
1284 Ok("digraph QuantumCircuit {\n // GraphViz representation\n}".to_string())
1285 }
1286}
1287
1288#[derive(Debug)]
1289pub struct TemplateEngine {}
1290
1291impl TemplateEngine {
1292 pub const fn new() -> Self {
1293 Self {}
1294 }
1295
1296 pub fn get_template(&self, algorithm_type: &str) -> Result<AlgorithmTemplate, QuantRS2Error> {
1297 Ok(AlgorithmTemplate {
1298 name: algorithm_type.to_string(),
1299 content: "// {{ALGORITHM_NAME}}\n// Gates: {{GATE_COUNT}}\n// Depth: {{CIRCUIT_DEPTH}}\n\n{{GATE_SEQUENCE}}".to_string(),
1300 parameters: HashMap::new(),
1301 })
1302 }
1303
1304 pub fn get_default_template(&self) -> Result<AlgorithmTemplate, QuantRS2Error> {
1305 self.get_template("Default")
1306 }
1307}
1308
1309#[derive(Debug, Clone)]
1310pub struct AlgorithmTemplate {
1311 pub name: String,
1312 pub content: String,
1313 pub parameters: HashMap<String, String>,
1314}
1315
1316#[derive(Debug)]
1317pub struct HardwareOptimizer {}
1318
1319impl HardwareOptimizer {
1320 pub const fn new() -> Self {
1321 Self {}
1322 }
1323
1324 pub fn optimize_for_hardware(
1325 &self,
1326 _circuit: &[QuantumGate],
1327 backend: &QuantumBackend,
1328 ) -> Result<HardwareFormattingInfo, QuantRS2Error> {
1329 let native_gates = match backend {
1330 QuantumBackend::IBMQ => vec!["rz", "sx", "cx"],
1331 QuantumBackend::IonQ => vec!["rx", "ry", "rz", "rxx"],
1332 _ => vec!["u1", "u2", "u3", "cx"],
1333 };
1334
1335 Ok(HardwareFormattingInfo {
1336 target_backend: *backend,
1337 native_gates: native_gates.iter().map(|s| s.to_string()).collect(),
1338 connectivity_constraints: Vec::new(),
1339 optimization_hints: vec!["Use native gate set for optimal performance".to_string()],
1340 })
1341 }
1342}
1343
1344#[derive(Debug)]
1345pub struct IncrementalFormatter {}
1346
1347impl IncrementalFormatter {
1348 pub const fn new() -> Self {
1349 Self {}
1350 }
1351
1352 pub fn apply_change(
1353 &self,
1354 _change: CircuitChange,
1355 _previous: &EnhancedFormattedCode,
1356 ) -> Result<IncrementalUpdate, QuantRS2Error> {
1357 Ok(IncrementalUpdate {
1358 updated_sections: Vec::new(),
1359 update_time: std::time::Duration::from_millis(10),
1360 })
1361 }
1362}
1363
1364#[derive(Debug)]
1365pub struct SuggestionEngine {}
1366
1367impl SuggestionEngine {
1368 pub const fn new() -> Self {
1369 Self {}
1370 }
1371
1372 pub fn generate_suggestions(
1373 &self,
1374 _circuit: &[QuantumGate],
1375 _semantic_info: &Option<SemanticInfo>,
1376 ) -> Result<Vec<FormattingSuggestion>, QuantRS2Error> {
1377 Ok(vec![FormattingSuggestion {
1378 suggestion_type: SuggestionType::Performance,
1379 description: "Consider gate fusion for adjacent single-qubit gates".to_string(),
1380 location: SuggestionLocation::Global,
1381 priority: Priority::Medium,
1382 auto_applicable: true,
1383 }])
1384 }
1385
1386 pub fn get_suggestions_at_position(
1387 &self,
1388 _circuit: &[QuantumGate],
1389 _position: usize,
1390 ) -> Result<Vec<InteractiveSuggestion>, QuantRS2Error> {
1391 Ok(vec![InteractiveSuggestion {
1392 suggestion: "Add Hadamard gate".to_string(),
1393 completion: "H(0)".to_string(),
1394 confidence: 0.85,
1395 }])
1396 }
1397}
1398
1399#[derive(Debug)]
1400pub struct ExportEngine {}
1401
1402impl ExportEngine {
1403 pub const fn new() -> Self {
1404 Self {}
1405 }
1406
1407 pub fn export(
1408 &self,
1409 formatted_code: &EnhancedFormattedCode,
1410 format: ExportFormat,
1411 ) -> Result<String, QuantRS2Error> {
1412 match format {
1413 ExportFormat::JSON => Ok(format!(
1414 "{{\"circuit\": \"exported\", \"gates\": {}}}",
1415 formatted_code.formatted_outputs.len()
1416 )),
1417 ExportFormat::YAML => Ok(format!(
1418 "circuit: exported\ngates: {}",
1419 formatted_code.formatted_outputs.len()
1420 )),
1421 _ => Ok("Exported circuit".to_string()),
1422 }
1423 }
1424}
1425
1426#[derive(Debug)]
1427pub struct SyntaxHighlighter {}
1428
1429impl SyntaxHighlighter {
1430 pub const fn new() -> Self {
1431 Self {}
1432 }
1433
1434 pub fn generate_metadata(
1435 &self,
1436 circuit: &[QuantumGate],
1437 ) -> Result<SyntaxMetadata, QuantRS2Error> {
1438 let mut tokens = Vec::new();
1439
1440 for (i, gate) in circuit.iter().enumerate() {
1441 tokens.push(SyntaxToken {
1442 token_type: TokenType::Gate,
1443 start: i * 10,
1444 end: i * 10 + 5,
1445 text: format!("{:?}", gate.gate_type()),
1446 });
1447 }
1448
1449 Ok(SyntaxMetadata {
1450 tokens,
1451 scopes: Vec::new(),
1452 color_scheme: ColorScheme {
1453 name: "Quantum Dark".to_string(),
1454 colors: HashMap::new(),
1455 },
1456 })
1457 }
1458}
1459
1460#[cfg(test)]
1461mod tests {
1462 use super::*;
1463
1464 #[test]
1465 fn test_enhanced_formatter_creation() {
1466 let formatter = EnhancedQuantumFormatter::new();
1467 assert!(formatter.config.enable_ai_beautification);
1468 assert!(formatter.config.enable_semantic_formatting);
1469 }
1470
1471 #[test]
1472 fn test_enhanced_circuit_formatting() {
1473 let formatter = EnhancedQuantumFormatter::new();
1474 let circuit = vec![
1475 QuantumGate::new(GateType::H, vec![0], None),
1476 QuantumGate::new(GateType::CNOT, vec![0, 1], None),
1477 ];
1478
1479 let options = FormattingOptions {
1480 target_hardware: QuantumBackend::IBMQ,
1481 include_code_formats: true,
1482 apply_templates: true,
1483 optimization_level: OptimizationLevel::Advanced,
1484 };
1485
1486 let result = formatter
1487 .format_circuit_enhanced(&circuit, 2, options)
1488 .expect("circuit formatting failed");
1489 assert!(!result.formatted_outputs.is_empty());
1490 assert!(result.quality_metrics.readability_score > 0.0);
1491 }
1492
1493 #[test]
1494 fn test_visual_rendering() {
1495 let renderer = VisualRenderer::new();
1496 let circuit = vec![
1497 QuantumGate::new(GateType::H, vec![0], None),
1498 QuantumGate::new(GateType::X, vec![1], None),
1499 ];
1500
1501 let ascii = renderer
1502 .render_ascii(&circuit, 2)
1503 .expect("ascii rendering failed");
1504 assert!(ascii.contains("-H-"));
1505 assert!(ascii.contains("-X-"));
1506 }
1507
1508 #[test]
1509 fn test_unicode_rendering() {
1510 let renderer = VisualRenderer::new();
1511 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1512
1513 let unicode = renderer
1514 .render_unicode(&circuit, 1)
1515 .expect("unicode rendering failed");
1516 assert!(unicode.contains("Ĥ"));
1517 }
1518
1519 #[test]
1520 fn test_semantic_analysis() {
1521 let analyzer = SemanticAnalyzer::new();
1522 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1523
1524 let semantic_info = analyzer
1525 .analyze_circuit(&circuit, 1)
1526 .expect("semantic analysis failed");
1527 assert!(!semantic_info.algorithm_type.is_empty());
1528 assert!(!semantic_info.algorithm_phases.is_empty());
1529 }
1530
1531 #[test]
1532 fn test_ai_beautification() {
1533 let beautifier = AIBeautifier::new();
1534 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1535
1536 let suggestions = beautifier
1537 .generate_beautification_suggestions(&circuit, &None)
1538 .expect("beautification suggestions failed");
1539 assert!(!suggestions.layout_improvements.is_empty());
1540 }
1541
1542 #[test]
1543 fn test_hardware_optimization() {
1544 let optimizer = HardwareOptimizer::new();
1545 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1546
1547 let hw_info = optimizer
1548 .optimize_for_hardware(&circuit, &QuantumBackend::IBMQ)
1549 .expect("hardware optimization failed");
1550 assert!(!hw_info.native_gates.is_empty());
1551 assert_eq!(hw_info.target_backend, QuantumBackend::IBMQ);
1552 }
1553
1554 #[test]
1555 fn test_quality_metrics_calculation() {
1556 let formatter = EnhancedQuantumFormatter::new();
1557 let circuit = vec![
1558 QuantumGate::new(GateType::H, vec![0], None),
1559 QuantumGate::new(GateType::X, vec![1], None),
1560 ];
1561
1562 let mut outputs = HashMap::new();
1563 outputs.insert(OutputFormat::Text, "// Test\nH(0)\nX(1)".to_string());
1564
1565 let metrics = formatter.calculate_quality_metrics(&circuit, &outputs);
1566 assert!(metrics.readability_score > 0.0);
1567 assert!(metrics.simd_optimization_ratio > 0.0);
1568 }
1569
1570 #[test]
1571 fn test_interactive_suggestions() {
1572 let engine = SuggestionEngine::new();
1573 let circuit = vec![QuantumGate::new(GateType::H, vec![0], None)];
1574
1575 let suggestions = engine
1576 .get_suggestions_at_position(&circuit, 0)
1577 .expect("suggestions at position failed");
1578 assert!(!suggestions.is_empty());
1579 assert!(suggestions[0].confidence > 0.0);
1580 }
1581
1582 #[test]
1583 fn test_export_functionality() {
1584 let engine = ExportEngine::new();
1585 let formatted_code = EnhancedFormattedCode {
1586 formatted_outputs: HashMap::new(),
1587 visual_representations: HashMap::new(),
1588 semantic_info: None,
1589 beautification_suggestions: None,
1590 hardware_formatting: None,
1591 formatting_suggestions: Vec::new(),
1592 templated_code: None,
1593 syntax_metadata: None,
1594 quality_metrics: QualityMetrics {
1595 readability_score: 0.9,
1596 consistency_score: 0.85,
1597 optimization_score: 0.7,
1598 documentation_score: 0.8,
1599 average_line_length: 80,
1600 gate_density: 0.5,
1601 comment_ratio: 0.3,
1602 simd_optimization_ratio: 0.6,
1603 },
1604 formatting_time: std::time::Duration::from_millis(100),
1605 platform_optimizations: Vec::new(),
1606 };
1607
1608 let json_export = engine
1609 .export(&formatted_code, ExportFormat::JSON)
1610 .expect("json export failed");
1611 assert!(json_export.contains("circuit"));
1612 }
1613}