1#![allow(
2 clippy::pedantic,
3 clippy::unnecessary_wraps,
4 clippy::needless_range_loop,
5 clippy::useless_vec,
6 clippy::needless_collect,
7 clippy::too_many_arguments
8)]
9use quantrs2_ml::autodiff::optimizers::Adam;
15use quantrs2_ml::prelude::*;
16use quantrs2_ml::qnn::QNNLayerType;
17use scirs2_core::ndarray::{s, Array1, Array2};
18use scirs2_core::random::prelude::*;
19
20fn main() -> Result<()> {
21 println!("=== Quantum Adversarial Training Demo ===\n");
22
23 println!("1. Adversarial Attack Generation...");
25 adversarial_attack_demo()?;
26
27 println!("\n2. Defense Mechanisms...");
29 defense_mechanisms_demo()?;
30
31 println!("\n3. Adversarial Training...");
33 adversarial_training_demo()?;
34
35 println!("\n4. Robustness Evaluation...");
37 robustness_evaluation_demo()?;
38
39 println!("\n5. Certified Defense Analysis...");
41 certified_defense_demo()?;
42
43 println!("\n6. Attack Method Comparison...");
45 attack_comparison_demo()?;
46
47 println!("\n7. Ensemble Defense...");
49 ensemble_defense_demo()?;
50
51 println!("\n=== Quantum Adversarial Demo Complete ===");
52
53 Ok(())
54}
55
56fn adversarial_attack_demo() -> Result<()> {
58 let layers = vec![
60 QNNLayerType::EncodingLayer { num_features: 4 },
61 QNNLayerType::VariationalLayer { num_params: 8 },
62 QNNLayerType::EntanglementLayer {
63 connectivity: "circular".to_string(),
64 },
65 QNNLayerType::VariationalLayer { num_params: 8 },
66 QNNLayerType::MeasurementLayer {
67 measurement_basis: "computational".to_string(),
68 },
69 ];
70
71 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
72 let defense = create_comprehensive_defense();
73 let config = create_default_adversarial_config();
74
75 let trainer = QuantumAdversarialTrainer::new(model, defense, config);
76
77 println!(" Created quantum adversarial trainer"); let test_data = Array2::from_shape_fn((10, 4), |(i, j)| {
81 0.2f64.mul_add(j as f64 / 4.0, 0.3f64.mul_add(i as f64 / 10.0, 0.5))
82 });
83 let test_labels = Array1::from_shape_fn(10, |i| i % 2);
84
85 println!("\n Testing different attack methods:");
86
87 println!(" - Fast Gradient Sign Method (FGSM)...");
89 let fgsm_examples = trainer.generate_adversarial_examples(
90 &test_data,
91 &test_labels,
92 QuantumAttackType::FGSM { epsilon: 0.1 },
93 )?;
94
95 let fgsm_success_rate = fgsm_examples
96 .iter()
97 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
98 .sum::<f64>()
99 / fgsm_examples.len() as f64;
100
101 println!(" Success rate: {:.2}%", fgsm_success_rate * 100.0);
102
103 if let Some(example) = fgsm_examples.first() {
104 println!(
105 " Average perturbation: {:.4}",
106 example.perturbation_norm
107 );
108 }
109
110 println!(" - Projected Gradient Descent (PGD)...");
112 let pgd_examples = trainer.generate_adversarial_examples(
113 &test_data,
114 &test_labels,
115 QuantumAttackType::PGD {
116 epsilon: 0.1,
117 alpha: 0.01,
118 num_steps: 10,
119 },
120 )?;
121
122 let pgd_success_rate = pgd_examples
123 .iter()
124 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
125 .sum::<f64>()
126 / pgd_examples.len() as f64;
127
128 println!(" Success rate: {:.2}%", pgd_success_rate * 100.0);
129
130 println!(" - Parameter Shift Attack...");
132 let param_examples = trainer.generate_adversarial_examples(
133 &test_data,
134 &test_labels,
135 QuantumAttackType::ParameterShift {
136 shift_magnitude: 0.05,
137 target_parameters: None,
138 },
139 )?;
140
141 let param_success_rate = param_examples
142 .iter()
143 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
144 .sum::<f64>()
145 / param_examples.len() as f64;
146
147 println!(" Success rate: {:.2}%", param_success_rate * 100.0);
148
149 println!(" - Quantum State Perturbation...");
151 let state_examples = trainer.generate_adversarial_examples(
152 &test_data,
153 &test_labels,
154 QuantumAttackType::StatePerturbation {
155 perturbation_strength: 0.1,
156 basis: "pauli_z".to_string(),
157 },
158 )?;
159
160 let state_success_rate = state_examples
161 .iter()
162 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
163 .sum::<f64>()
164 / state_examples.len() as f64;
165
166 println!(" Success rate: {:.2}%", state_success_rate * 100.0);
167
168 Ok(())
169}
170
171fn defense_mechanisms_demo() -> Result<()> {
173 println!(" Testing defense strategies:");
174
175 println!(" - Input Preprocessing...");
177 let preprocessing_defense = QuantumDefenseStrategy::InputPreprocessing {
178 noise_addition: 0.05,
179 feature_squeezing: true,
180 };
181
182 let layers = vec![
183 QNNLayerType::EncodingLayer { num_features: 4 },
184 QNNLayerType::VariationalLayer { num_params: 6 },
185 QNNLayerType::MeasurementLayer {
186 measurement_basis: "computational".to_string(),
187 },
188 ];
189
190 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
191 let config = create_default_adversarial_config();
192 let trainer = QuantumAdversarialTrainer::new(model, preprocessing_defense, config.clone());
193
194 let test_input = Array1::from_vec(vec![0.51, 0.32, 0.83, 0.24]);
195 let defended_input = trainer.apply_defense(&test_input)?;
196
197 let defense_effect = (&defended_input - &test_input).mapv(f64::abs).sum();
198 println!(" Defense effect magnitude: {defense_effect:.4}");
199
200 println!(" - Randomized Circuit Defense...");
202 let randomized_defense = QuantumDefenseStrategy::RandomizedCircuit {
203 randomization_strength: 0.1,
204 num_random_layers: 2,
205 };
206
207 let layers2 = vec![
208 QNNLayerType::EncodingLayer { num_features: 4 },
209 QNNLayerType::VariationalLayer { num_params: 8 },
210 ];
211
212 let model2 = QuantumNeuralNetwork::new(layers2, 4, 4, 2)?;
213 let trainer2 = QuantumAdversarialTrainer::new(model2, randomized_defense, config);
214
215 let defended_input2 = trainer2.apply_defense(&test_input)?;
216 let randomization_effect = (&defended_input2 - &test_input).mapv(f64::abs).sum();
217 println!(" Randomization effect: {randomization_effect:.4}");
218
219 println!(" - Quantum Error Correction...");
221 let qec_defense = QuantumDefenseStrategy::QuantumErrorCorrection {
222 code_type: "surface_code".to_string(),
223 correction_threshold: 0.01,
224 };
225
226 println!(" Error correction configured with surface codes");
227 println!(" Correction threshold: 1%");
228
229 Ok(())
230}
231
232fn adversarial_training_demo() -> Result<()> {
234 let layers = vec![
236 QNNLayerType::EncodingLayer { num_features: 4 },
237 QNNLayerType::VariationalLayer { num_params: 12 },
238 QNNLayerType::EntanglementLayer {
239 connectivity: "circular".to_string(),
240 },
241 QNNLayerType::MeasurementLayer {
242 measurement_basis: "computational".to_string(),
243 },
244 ];
245
246 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
247
248 let defense = QuantumDefenseStrategy::AdversarialTraining {
249 attack_types: vec![
250 QuantumAttackType::FGSM { epsilon: 0.08 },
251 QuantumAttackType::PGD {
252 epsilon: 0.08,
253 alpha: 0.01,
254 num_steps: 7,
255 },
256 ],
257 adversarial_ratio: 0.4,
258 };
259
260 let mut config = create_default_adversarial_config();
261 config.epochs = 20; config.eval_interval = 5;
263
264 let mut trainer = QuantumAdversarialTrainer::new(model, defense, config);
265
266 println!(" Adversarial training configuration:");
267 println!(" - Attack types: FGSM + PGD");
268 println!(" - Adversarial ratio: 40%");
269 println!(" - Training epochs: 20");
270
271 let train_data = generate_quantum_dataset(200, 4);
273 let train_labels = Array1::from_shape_fn(200, |i| i % 2);
274
275 let val_data = generate_quantum_dataset(50, 4);
276 let val_labels = Array1::from_shape_fn(50, |i| i % 2);
277
278 println!("\n Starting adversarial training...");
280 let mut optimizer = Adam::new(0.001);
281 let losses = trainer.train(
282 &train_data,
283 &train_labels,
284 &val_data,
285 &val_labels,
286 &mut optimizer,
287 )?;
288
289 println!(" Training completed!");
290 println!(" Final loss: {:.4}", losses.last().unwrap_or(&0.0));
291
292 let metrics = trainer.get_robustness_metrics();
294 println!("\n Final robustness metrics:");
295 println!(" - Clean accuracy: {:.3}", metrics.clean_accuracy);
296 println!(" - Robust accuracy: {:.3}", metrics.robust_accuracy);
297 println!(
298 " - Attack success rate: {:.3}",
299 metrics.attack_success_rate
300 );
301
302 Ok(())
303}
304
305fn robustness_evaluation_demo() -> Result<()> {
307 let layers = vec![
309 QNNLayerType::EncodingLayer { num_features: 4 },
310 QNNLayerType::VariationalLayer { num_params: 8 },
311 QNNLayerType::MeasurementLayer {
312 measurement_basis: "computational".to_string(),
313 },
314 ];
315
316 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
317 let defense = create_comprehensive_defense();
318 let config = create_default_adversarial_config();
319
320 let mut trainer = QuantumAdversarialTrainer::new(model, defense, config);
321
322 println!(" Evaluating model robustness...");
323
324 let test_data = generate_quantum_dataset(100, 4);
326 let test_labels = Array1::from_shape_fn(100, |i| i % 2);
327
328 let epsilons = vec![0.05, 0.1, 0.15, 0.2];
330
331 println!("\n Robustness vs. attack strength:");
332 for &epsilon in &epsilons {
333 let attack_examples = trainer.generate_adversarial_examples(
334 &test_data,
335 &test_labels,
336 QuantumAttackType::FGSM { epsilon },
337 )?;
338
339 let success_rate = attack_examples
340 .iter()
341 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
342 .sum::<f64>()
343 / attack_examples.len() as f64;
344
345 let avg_perturbation = attack_examples
346 .iter()
347 .map(|ex| ex.perturbation_norm)
348 .sum::<f64>()
349 / attack_examples.len() as f64;
350
351 println!(
352 " ε = {:.2}: Attack success = {:.1}%, Avg perturbation = {:.4}",
353 epsilon,
354 success_rate * 100.0,
355 avg_perturbation
356 );
357 }
358
359 println!("\n Attack type comparison:");
361 let attack_types = vec![
362 ("FGSM", QuantumAttackType::FGSM { epsilon: 0.1 }),
363 (
364 "PGD",
365 QuantumAttackType::PGD {
366 epsilon: 0.1,
367 alpha: 0.01,
368 num_steps: 10,
369 },
370 ),
371 (
372 "Parameter Shift",
373 QuantumAttackType::ParameterShift {
374 shift_magnitude: 0.05,
375 target_parameters: None,
376 },
377 ),
378 (
379 "State Perturbation",
380 QuantumAttackType::StatePerturbation {
381 perturbation_strength: 0.1,
382 basis: "pauli_z".to_string(),
383 },
384 ),
385 ];
386
387 for (name, attack_type) in attack_types {
388 let examples = trainer.generate_adversarial_examples(
389 &test_data.slice(s![0..20, ..]).to_owned(),
390 &test_labels.slice(s![0..20]).to_owned(),
391 attack_type,
392 )?;
393
394 let success_rate = examples
395 .iter()
396 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
397 .sum::<f64>()
398 / examples.len() as f64;
399
400 println!(" {}: {:.1}% success rate", name, success_rate * 100.0);
401 }
402
403 Ok(())
404}
405
406fn certified_defense_demo() -> Result<()> {
408 let layers = vec![
409 QNNLayerType::EncodingLayer { num_features: 4 },
410 QNNLayerType::VariationalLayer { num_params: 6 },
411 QNNLayerType::MeasurementLayer {
412 measurement_basis: "computational".to_string(),
413 },
414 ];
415
416 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
417
418 let certified_defense = QuantumDefenseStrategy::CertifiedDefense {
419 smoothing_variance: 0.1,
420 confidence_level: 0.95,
421 };
422
423 let config = create_default_adversarial_config();
424 let trainer = QuantumAdversarialTrainer::new(model, certified_defense, config);
425
426 println!(" Certified defense analysis:");
427 println!(" - Smoothing variance: 0.1");
428 println!(" - Confidence level: 95%");
429
430 let test_data = generate_quantum_dataset(50, 4);
432
433 println!("\n Running randomized smoothing certification...");
435 let certified_accuracy = trainer.certified_defense_analysis(
436 &test_data, 0.1, 100, )?;
439
440 println!(" Certified accuracy: {:.2}%", certified_accuracy * 100.0);
441
442 let smoothing_levels = vec![0.05, 0.1, 0.15, 0.2];
444 println!("\n Certified accuracy vs. smoothing variance:");
445
446 for &variance in &smoothing_levels {
447 let cert_acc = trainer.certified_defense_analysis(&test_data, variance, 50)?;
448 println!(" σ = {:.2}: {:.1}% certified", variance, cert_acc * 100.0);
449 }
450
451 Ok(())
452}
453
454fn attack_comparison_demo() -> Result<()> {
456 let layers = vec![
457 QNNLayerType::EncodingLayer { num_features: 4 },
458 QNNLayerType::VariationalLayer { num_params: 10 },
459 QNNLayerType::EntanglementLayer {
460 connectivity: "full".to_string(),
461 },
462 QNNLayerType::MeasurementLayer {
463 measurement_basis: "computational".to_string(),
464 },
465 ];
466
467 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
468 let defense = create_comprehensive_defense();
469 let config = create_default_adversarial_config();
470
471 let trainer = QuantumAdversarialTrainer::new(model, defense, config);
472
473 println!(" Comprehensive attack comparison:");
474
475 let test_data = generate_quantum_dataset(30, 4);
476 let test_labels = Array1::from_shape_fn(30, |i| i % 2);
477
478 let attack_configs = vec![
480 ("FGSM (ε=0.05)", QuantumAttackType::FGSM { epsilon: 0.05 }),
481 ("FGSM (ε=0.1)", QuantumAttackType::FGSM { epsilon: 0.1 }),
482 (
483 "PGD-5",
484 QuantumAttackType::PGD {
485 epsilon: 0.1,
486 alpha: 0.02,
487 num_steps: 5,
488 },
489 ),
490 (
491 "PGD-10",
492 QuantumAttackType::PGD {
493 epsilon: 0.1,
494 alpha: 0.01,
495 num_steps: 10,
496 },
497 ),
498 (
499 "Parameter Shift",
500 QuantumAttackType::ParameterShift {
501 shift_magnitude: 0.1,
502 target_parameters: None,
503 },
504 ),
505 (
506 "Circuit Manipulation",
507 QuantumAttackType::CircuitManipulation {
508 gate_error_rate: 0.01,
509 coherence_time: 100.0,
510 },
511 ),
512 ];
513
514 println!("\n Attack effectiveness comparison:");
515 println!(
516 " {:20} {:>12} {:>15} {:>15}",
517 "Attack Type", "Success Rate", "Avg Perturbation", "Effectiveness"
518 );
519
520 for (name, attack_type) in attack_configs {
521 let examples =
522 trainer.generate_adversarial_examples(&test_data, &test_labels, attack_type)?;
523
524 let success_rate = examples
525 .iter()
526 .map(|ex| if ex.attack_success { 1.0 } else { 0.0 })
527 .sum::<f64>()
528 / examples.len() as f64;
529
530 let avg_perturbation =
531 examples.iter().map(|ex| ex.perturbation_norm).sum::<f64>() / examples.len() as f64;
532
533 let effectiveness = if avg_perturbation > 0.0 {
534 success_rate / avg_perturbation
535 } else {
536 0.0
537 };
538
539 println!(
540 " {:20} {:>11.1}% {:>14.4} {:>14.2}",
541 name,
542 success_rate * 100.0,
543 avg_perturbation,
544 effectiveness
545 );
546 }
547
548 Ok(())
549}
550
551fn ensemble_defense_demo() -> Result<()> {
553 println!(" Ensemble defense strategy:");
554
555 let ensemble_defense = QuantumDefenseStrategy::EnsembleDefense {
556 num_models: 5,
557 diversity_metric: "parameter_diversity".to_string(),
558 };
559
560 let layers = vec![
561 QNNLayerType::EncodingLayer { num_features: 4 },
562 QNNLayerType::VariationalLayer { num_params: 8 },
563 QNNLayerType::MeasurementLayer {
564 measurement_basis: "computational".to_string(),
565 },
566 ];
567
568 let model = QuantumNeuralNetwork::new(layers, 4, 4, 2)?;
569 let config = create_default_adversarial_config();
570
571 let mut trainer = QuantumAdversarialTrainer::new(model, ensemble_defense, config);
572
573 println!(" - Number of models: 5");
574 println!(" - Diversity metric: Parameter diversity");
575
576 println!("\n Initializing ensemble models...");
578 println!(" Ensemble initialized (placeholder)");
580
581 println!(" Ensemble initialized successfully");
582
583 let test_input = Array1::from_vec(vec![0.6, 0.4, 0.7, 0.3]);
585
586 println!("\n Ensemble prediction characteristics:");
587 println!(" - Improved robustness through model diversity");
588 println!(" - Reduced attack transferability");
589 println!(" - Majority voting for final predictions");
590
591 let single_model_attack = trainer.generate_adversarial_examples(
599 &Array2::from_shape_vec((1, test_input.len()), test_input.to_vec())?,
600 &Array1::from_vec(vec![0]),
601 QuantumAttackType::FGSM { epsilon: 0.1 },
602 )?[0]
603 .clone();
604
605 println!("\n Single model vs. ensemble comparison:");
606 println!(
607 " - Single model attack success: {}",
608 if single_model_attack.attack_success {
609 "Yes"
610 } else {
611 "No"
612 }
613 );
614 println!(
615 " - Perturbation magnitude: {:.4}",
616 single_model_attack.perturbation_norm
617 );
618
619 Ok(())
620}
621
622fn generate_quantum_dataset(samples: usize, features: usize) -> Array2<f64> {
624 Array2::from_shape_fn((samples, features), |(i, j)| {
625 let phase = (i as f64).mul_add(0.1, j as f64 * 0.3).sin();
626 let amplitude = (i as f64 / samples as f64 + j as f64 / features as f64) * 0.5;
627 0.1f64.mul_add(fastrand::f64() - 0.5, 0.5 + amplitude * phase)
628 })
629}