@@ -12,23 +12,21 @@ import JordanWigner.JordanWignerEvolutionSet.JordanWignerGeneratorSystem;
12
12
import JordanWigner .JordanWignerOptimizedBlockEncoding .JordanWignerOptimizedBlockEncoding ;
13
13
import JordanWigner .JordanWignerOptimizedBlockEncoding .PauliBlockEncoding ;
14
14
import JordanWigner .JordanWignerOptimizedBlockEncoding .QuantumWalkByQubitization ;
15
- import JordanWigner .StatePreparation .PrepareArbitraryStateD ;
16
15
import JordanWigner .Utils .JordanWignerEncodingData ;
17
16
import JordanWigner .Utils .MultiplexOperationsFromGenerator ;
18
17
import JordanWigner .Utils .TrotterSimulationAlgorithm ;
19
18
import Std .Convert .IntAsDouble ;
20
19
import Std .Math .Ceiling ;
21
20
import Std .Math .Lg ;
22
21
import Utils .EvolutionGenerator ;
23
- import Utils .GeneratorSystem ;
24
22
25
23
// Convenience functions for performing simulation.
26
24
27
25
/// # Summary
28
26
/// Returns Trotter step operation and the parameters necessary to run it.
29
27
///
30
28
/// # Input
31
- /// ## qSharpData
29
+ /// ## jwHamiltonian
32
30
/// Hamiltonian described by `JordanWignerEncodingData` format.
33
31
/// ## trotterStepSize
34
32
/// Step size of Trotter integrator.
@@ -39,24 +37,22 @@ import Utils.GeneratorSystem;
39
37
/// A tuple where: `Int` is the number of qubits allocated,
40
38
/// `Double` is `1.0/trotterStepSize`, and the operation
41
39
/// is the Trotter step.
42
- function TrotterStepOracle (qSharpData : JordanWignerEncodingData , trotterStepSize : Double , trotterOrder : Int ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
43
- let (nSpinOrbitals , data , statePrepData , energyShift ) = qSharpData ! ;
44
- let generatorSystem = JordanWignerGeneratorSystem (data );
40
+ function TrotterStepOracle (jwHamiltonian : JordanWignerEncodingData , trotterStepSize : Double , trotterOrder : Int ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
41
+ let generatorSystem = JordanWignerGeneratorSystem (jwHamiltonian .Terms );
45
42
let evolutionGenerator = new EvolutionGenerator { EvolutionSet = JordanWignerFermionEvolutionSet (), System = generatorSystem };
46
43
let simulationAlgorithm = TrotterSimulationAlgorithm (trotterStepSize , trotterOrder );
47
44
let oracle = simulationAlgorithm (trotterStepSize , evolutionGenerator , _ );
48
- let nTargetRegisterQubits = nSpinOrbitals ;
45
+ let nTargetRegisterQubits = jwHamiltonian . NumQubits ;
49
46
let rescaleFactor = 1.0 / trotterStepSize ;
50
47
return (nTargetRegisterQubits , (rescaleFactor , oracle ));
51
48
}
52
49
53
50
54
- function QubitizationOracleSeperatedRegisters (qSharpData : JordanWignerEncodingData ) : ((Int , Int ), (Double , ((Qubit [], Qubit []) => Unit is Adj + Ctl ))) {
55
- let (nSpinOrbitals , data , statePrepData , energyShift ) = qSharpData ! ;
56
- let generatorSystem = JordanWignerBlockEncodingGeneratorSystem (data );
51
+ function QubitizationOracleSeperatedRegisters (jwHamiltonian : JordanWignerEncodingData ) : ((Int , Int ), (Double , ((Qubit [], Qubit []) => Unit is Adj + Ctl ))) {
52
+ let generatorSystem = JordanWignerBlockEncodingGeneratorSystem (jwHamiltonian .Terms );
57
53
let (nTerms , genIdxFunction ) = generatorSystem ! ;
58
54
let (oneNorm , blockEncodingReflection ) = PauliBlockEncoding (generatorSystem );
59
- let nTargetRegisterQubits = nSpinOrbitals ;
55
+ let nTargetRegisterQubits = jwHamiltonian . NumQubits ;
60
56
let nCtrlRegisterQubits = Ceiling (Lg (IntAsDouble (nTerms )));
61
57
return ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , QuantumWalkByQubitization (blockEncodingReflection )));
62
58
}
@@ -65,15 +61,15 @@ function QubitizationOracleSeperatedRegisters(qSharpData : JordanWignerEncodingD
65
61
/// Returns Qubitization operation and the parameters necessary to run it.
66
62
///
67
63
/// # Input
68
- /// ## qSharpData
64
+ /// ## jwHamiltonian
69
65
/// Hamiltonian described by `JordanWignerEncodingData` format.
70
66
///
71
67
/// # Output
72
68
/// A tuple where: `Int` is the number of qubits allocated,
73
69
/// `Double` is the one-norm of Hamiltonian coefficients, and the operation
74
70
/// is the Quantum walk created by Qubitization.
75
- function QubitizationOracle (qSharpData : JordanWignerEncodingData ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
76
- let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , oracle )) = QubitizationOracleSeperatedRegisters (qSharpData );
71
+ function QubitizationOracle (jwHamiltonian : JordanWignerEncodingData ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
72
+ let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , oracle )) = QubitizationOracleSeperatedRegisters (jwHamiltonian );
77
73
let nQubits = nCtrlRegisterQubits + nTargetRegisterQubits ;
78
74
return (nQubits , (oneNorm , MergeTwoRegisters (oracle , nTargetRegisterQubits , _ )));
79
75
}
@@ -84,9 +80,8 @@ operation MergeTwoRegisters(oracle : ((Qubit[], Qubit[]) => Unit is Adj + Ctl),
84
80
}
85
81
86
82
87
- function OptimizedQubitizationOracleSeperatedRegisters (qSharpData : JordanWignerEncodingData , targetError : Double ) : ((Int , Int ), (Double , ((Qubit [], Qubit []) => Unit is Adj + Ctl ))) {
88
- let (nSpinOrbitals , data , statePrepData , energyShift ) = qSharpData ! ;
89
- let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , blockEncodingReflection )) = JordanWignerOptimizedBlockEncoding (targetError , data , nSpinOrbitals );
83
+ function OptimizedQubitizationOracleSeperatedRegisters (jwHamiltonian : JordanWignerEncodingData , targetError : Double ) : ((Int , Int ), (Double , ((Qubit [], Qubit []) => Unit is Adj + Ctl ))) {
84
+ let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , blockEncodingReflection )) = JordanWignerOptimizedBlockEncoding (targetError , jwHamiltonian .Terms , jwHamiltonian .NumQubits );
90
85
return ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , QuantumWalkByQubitization (blockEncodingReflection )));
91
86
}
92
87
@@ -96,7 +91,7 @@ function OptimizedQubitizationOracleSeperatedRegisters(qSharpData : JordanWigner
96
91
/// and the parameters necessary to run it.
97
92
///
98
93
/// # Input
99
- /// ## qSharpData
94
+ /// ## jwHamiltonian
100
95
/// Hamiltonian described by `JordanWignerEncodingData` format.
101
96
/// ## targetError
102
97
/// Error of auxillary state preparation step.
@@ -105,8 +100,8 @@ function OptimizedQubitizationOracleSeperatedRegisters(qSharpData : JordanWigner
105
100
/// A tuple where: `Int` is the number of qubits allocated,
106
101
/// `Double` is the one-norm of Hamiltonian coefficients, and the operation
107
102
/// is the Quantum walk created by Qubitization.
108
- function OptimizedQubitizationOracle (qSharpData : JordanWignerEncodingData , targetError : Double ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
109
- let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , oracle )) = OptimizedQubitizationOracleSeperatedRegisters (qSharpData , targetError );
103
+ function OptimizedQubitizationOracle (jwHamiltonian : JordanWignerEncodingData , targetError : Double ) : (Int , (Double , (Qubit [] => Unit is Adj + Ctl ))) {
104
+ let ((nCtrlRegisterQubits , nTargetRegisterQubits ), (oneNorm , oracle )) = OptimizedQubitizationOracleSeperatedRegisters (jwHamiltonian , targetError );
110
105
let nQubits = nCtrlRegisterQubits + nTargetRegisterQubits ;
111
106
return (nQubits , (oneNorm , MergeTwoRegisters (oracle , nTargetRegisterQubits , _ )));
112
107
}
0 commit comments