Download Phase2Engine.qs from Snapkitty/black-hole-engine: direct link, hf CLI and curl.
- Browser
- Download file 2.54 kB
-
https://huggingface.co/Snapkitty/black-hole-engine/resolve/main/Phase2Engine.qs
- Command line
-
hf download hf://Snapkitty/black-hole-engine/Phase2Engine.qs
-
curl -L -o Phase2Engine.qs https://huggingface.co/Snapkitty/black-hole-engine/resolve/main/Phase2Engine.qs
2.54 kB
| // | |
| // 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; | |
| } | |
| } | |