File size: 2,537 Bytes
98d5347
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//
// Copyright (c) 2026 BEL ESPRIT D ACCORD TRUST HOLDINGS INC
// All rights reserved.

// BlackHoleEngine/Phase2Engine.qs
namespace BlackHoleEngine.Phase2 {
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Arrays;
    open Microsoft.Quantum.Math;
    open BlackHoleEngine.Primitives;

    @EntryPoint()
    operation RunPhase2Collapse(
        nQubits : Int,
        clauses : (Int, Int, Int)[],
        violations : ViolatingAssignment[],
        gamma_dt : Double,
        delta : Double,
        scrambleInterval : Int,
        scrambleTime : Double,
        maxSteps : Int
    ) : (Bool[], Double) {

        use qubits = Qubit[nQubits];
        use ancilla = Qubit();

        ApplyToEach(H, qubits);

        let m = Length(clauses);
        let couplings = GenerateCouplings(nQubits);
        let fields = GenerateFields(nQubits);

        mutable step = 0;
        mutable scrambleCount = 0;
        mutable energy = 1.0;

        while (step < maxSteps and energy > delta) {
            for idx in 0..m-1 {
                let (a, b, c) = clauses[idx];
                let viol = violations[idx];
                LindbladStepClause(ancilla, [qubits[a], qubits[b], qubits[c]], viol, gamma_dt);
            }

            set energy = MeasureEnergy(qubits, clauses, violations);

            set scrambleCount += 1;
            if (scrambleCount >= scrambleInterval and energy < 2.0 * delta) {
                HaydenPreskillScrambler(qubits, scrambleTime, couplings, fields);
                set scrambleCount = 0;
                set energy = MeasureEnergy(qubits, clauses, violations);
            }

            set step += 1;
        }

        let result = MultiM(qubits);
        let bits = ResultArrayAsBoolArray(result);

        ResetAll(qubits);
        Reset(ancilla);

        return (bits, energy);
    }

    function GenerateCouplings(n : Int) : Double[][] {
        let J = 1.0 / IntAsDouble(n);
        mutable matrix = new Double[n][n];
        for i in 0..n-1 {
            for j in 0..n-1 {
                set matrix[i][j] = if i < j then J else 0.0;
            }
        }
        return matrix;
    }

    function GenerateFields(n : Int) : Double[] {
        mutable fields = new Double[n];
        for i in 0..n-1 {
            set fields[i] = 0.5; // deterministic for reproducibility
        }
        return fields;
    }
}