Skip to main content

quantrs2_core/quantum_walk/
mod.rs

1//! Quantum Walk Algorithms
2//!
3//! This module implements various quantum walk algorithms, including:
4//! - Discrete-time quantum walks on graphs
5//! - Continuous-time quantum walks
6//! - Szegedy quantum walks
7//!
8//! Quantum walks are the quantum analog of classical random walks and form
9//! the basis for many quantum algorithms.
10
11mod continuous;
12mod discrete;
13mod eigensolvers;
14mod graph;
15mod multi;
16mod search;
17
18#[cfg(test)]
19mod tests;
20
21pub use continuous::{ContinuousQuantumWalk, SzegedyQuantumWalk};
22pub use discrete::DiscreteQuantumWalk;
23pub(crate) use eigensolvers::{compute_laplacian_eigenvalues_impl, estimate_fiedler_value_impl};
24pub use graph::{CoinOperator, Graph, GraphType, SearchOracle};
25pub use multi::{DecoherentQuantumWalk, MultiWalkerQuantumWalk};
26pub use search::QuantumWalkSearch;
27
28/// Example: Quantum walk on a line
29pub fn quantum_walk_line_example() {
30    println!("Quantum Walk on a Line (10 vertices)");
31
32    let graph = Graph::new(GraphType::Line, 10);
33    let walk = DiscreteQuantumWalk::new(graph, CoinOperator::Hadamard);
34
35    // Start at vertex 5 (middle)
36    let mut walk = walk;
37    walk.initialize_position(5);
38
39    // Evolve for different time steps
40    for steps in [0, 5, 10, 20, 30] {
41        // Reset and evolve
42        walk.initialize_position(5);
43        for _ in 0..steps {
44            walk.step();
45        }
46        let probs = walk.position_probabilities();
47
48        println!("\nAfter {steps} steps:");
49        print!("Probabilities: ");
50        for (v, p) in probs.iter().enumerate() {
51            if *p > 0.01 {
52                print!("v{v}: {p:.3} ");
53            }
54        }
55        println!();
56    }
57}
58
59/// Example: Search on a complete graph
60pub fn quantum_walk_search_example() {
61    println!("\nQuantum Walk Search on Complete Graph (8 vertices)");
62
63    let graph = Graph::new(GraphType::Complete, 8);
64    let marked = vec![3, 5]; // Mark vertices 3 and 5
65    let oracle = SearchOracle::new(marked.clone());
66
67    let mut search = QuantumWalkSearch::new(graph, oracle);
68
69    println!("Marked vertices: {marked:?}");
70
71    // Run search
72    let (found, prob, steps) = search.run(50);
73
74    println!("\nFound vertex {found} with probability {prob:.3} after {steps} steps");
75}