pyqpanda_alg.QFinance.QUBO
¶
Module Contents¶
Classes¶
Represent a quadratic form and compute the function value using a quantum circuit |
|
\[\]
|
|
\[\]
|
- class pyqpanda_alg.QFinance.QUBO.QuadraticBinary(problem)¶
Represent a quadratic form and compute the function value using a quantum circuit
\[Q(x) = x^T A x + x^T b + c\]\[|x\rangle_n |0\rangle_m \mapsto |x\rangle_n |(Q(x) + 2^m) \mod 2^m \rangle_m\]According to the above formula, a negative value can also be represent by this method using two’s complement.
- Parameters
problem :
sympy.Basic
ordict
A quadratic form function with binary variables to be optimized. Support an expression in sympy. Keys followed should be included if expression in dict:
quadratic
: A, Optional[Union[np.ndarray, List[List[float]]]]
, the quadratic coefficients matrix.linear
: b, Optional[Union[np.ndarray, List[float]]]
, the linear coefficients array.constant
: c,float
, a constant.
- query_qnumber() List[int] ¶
- Returns
[n_key, n_res] :
list[int]
Returns the size(number of qubits) of the variable and result registers for the given problem.
- Examples
An example for function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> import numpy as np >>> import pyqpanda as pq >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> test0 = QUBO.QuadraticBinary(function) >>> n_key, n_res = test0.query_qnumber() >>> print(n_key, n_res) 3 2
- cir(q_key, q_res)¶
- Parameters
q_key :
QVec
Qubit(s) for the variable register.
q_res :
QVec
Qubit(s) for the result register.
- Returns
main_cir :
QCircuit
Returns the quantum circuit for computing the function.
- Examples
An example for function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> import numpy as np >>> import pyqpanda as pq >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> test0 = QUBO.QuadraticBinary(function) >>> n_key, n_res = test0.query_qnumber() >>> m = pq.CPUQVM() >>> m.initQVM() >>> q_key = m.qAlloc_many(n_key) >>> q_res = m.qAlloc_many(n_res) >>> print(test0.cir(q_key, q_res))
q_0: |0>──── ───────■────── ───────■─────────────── ─────────────────────── ───────■────────────────────── > │ │ │ > q_1: |0>──── ───────┼────── ───────┼───────■─────── ───────■─────────────── ───────■────────────────────── > │ │ │ │ │ > q_2: |0>──── ───────┼────── ───────┼───────┼─────── ───────┼───────■─────── ───────┼──────────────■─────── > ┌─┐ ┌──────┴─────┐ │┌──────┴──────┐ │┌──────┴──────┐ ┌──────┴──────┐ │ > q_3: |0>─┤H├ ┤U1(2.042035)├ ───────┼┤U1(-1.570796)├ ───────┼┤U1(-0.785398)├ ┤U1(-1.884956)├───────┼─────── > ├─┤ └────────────┘ ┌──────┴┴────┬────────┘ ┌──────┴┴─────┬───────┘ └─────────────┘┌──────┴──────┐ > q_4: |0>─┤H├ ────────────── ┤U1(4.084070)├───────── ┤U1(-3.141593)├──────── ───────────────┤U1(-1.570796)├ > └─┘ └────────────┘ └─────────────┘ └─────────────┘ > q_0: |0>───────■─────── ────────────── ────────────── ─ ─── ────────────────── ─── │ q_1: |0>───────■─────── ───────■────── ───────■────── ─ ─── ────────────────── ─── │ │ │ q_2: |0>───────┼─────── ───────■────── ───────■────── ─ ─── ────────────────── ─── │ ┌──────┴─────┐ │ ┌─┐ q_3: |0>───────┼─────── ┤U1(1.413717)├ ───────┼────── X ┤H├ ─────────■──────── ─── ┌──────┴──────┐ └────────────┘ ┌──────┴─────┐ │ └─┘ ┌────────┴───────┐ ┌─┐ q_4: |0>┤U1(-3.769911)├ ────────────── ┤U1(2.827433)├ X ─── ┤CR(1.570796).dag├ ┤H├ └─────────────┘ └────────────┘ └────────────────┘ └─┘
- function_value(var_array)¶
- Parameters
var_array :
array_like
An array of binary values.
- Returns
res :
float
The result of the function under given variables array.
- Examples
An example for function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> test0 = QUBO.QuadraticBinary(function) >>> # calculate the quadratic function value above with x0, x1, x2= 0, 1, 0 >>> print(test0.function_value([0, 1, 0])) -1.0
- qubobytraversal()¶
Traversing the entire solution space to find the minimum value solution.
- Returns
index_list, min_value :
list
,float
The solution obtained by traversing the entire solution space.
- Examples
An example for function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> import numpy as np >>> import pyqpanda as pq >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> test0 = QUBO.QuadraticBinary(function) >>> # find the minimum function value by traversing >>> res0 = test0.qubobytraversal() >>> print('result of traversal: ', res0) result of traversal: ([[0, 1, 0]], -1.0)
- class pyqpanda_alg.QFinance.QUBO.QUBO_GAS_origin(problem)¶
Bases:
QuadraticBinary
Inheritance class of QuadraticBinary. Using GAS to find the minimum value solution of given quadratic binary optimization problem.
\[Q(x) = x^T A x + x^T b + c\]\[|x\rangle_n |0\rangle_m \mapsto |x\rangle_n |(Q(x) + 2^m) \mod 2^m \rangle_m\]According to the above formula, a negative value can also be represent by this method using two’s complement.
- Parameters
problem :
sympy.Basic
ordict
A quadratic form function with binary variables to be optimized. Support an expression in sympy. Keys followed should be included if expression in dict:
quadratic
: A, Optional[Union[np.ndarray, List[List[float]]]]
, the quadratic coefficients matrix.linear
: b, Optional[Union[np.ndarray, List[float]]]
, the linear coefficients array.constant
: c,float
, a constant.
- run(continue_times: int = 5, init_value=None, process_show=False)¶
Run the solver to find the minimum.
- Parameters
continue_times :
int
The maximum number of repeated searches at the current optimal point in GAS algorithm.
init_value :
float
The given initial value of the optimization function. Default the constant item of the problem.
process_show :
bool
Set to True to print the detail during search.
- Returns
minimum_indexes, minimum_res :
list[list[int]]
,float
The optimization result including the solution array and the optimal value.
- Examples
An example for minimization of quadratic binary function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> import numpy as np >>> import pyqpanda as pq >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> # find the minimum function value using GAS >>> test1 = QUBO.QUBO_GAS_origin(function) >>> res1 = test1.run(init_value=0, continue_times=10, process_show=False) >>> print('result of Grover adaptive search: ', res1) result of Grover adaptive search: ([[0, 1, 0]], -1.0)
- class pyqpanda_alg.QFinance.QUBO.QUBO_QAOA(problem)¶
Bases:
QuadraticBinary
Inheritance class of QuadraticBinary. Using QAOA to find the minimum value solution of given quadratic binary optimization problem.
\[Q(x) = x^T A x + x^T b + c\]\[|x\rangle_n |0\rangle_m \mapsto |x\rangle_n |(Q(x) + 2^m) \mod 2^m \rangle_m\]According to the above formula, a negative value can also be represent by this method using two’s complement.
- Parameters
problem :
sympy.Basic
ordict
A quadratic form function with binary variables to be optimized. Support an expression in sympy. Keys followed should be included if expression in dict:
quadratic
: A, Optional[Union[np.ndarray, List[List[float]]]]
, the quadratic coefficients matrix.linear
: b, Optional[Union[np.ndarray, List[float]]]
, the linear coefficients array.constant
: c,float
, a constant.
- run(layer=None, optimizer='SLSQP', optimizer_option=None)¶
Run the solver to find the minimum.
- Parameters
layer :
int
Layers number of QAOA circuit. If optimize type is interp, then it represents the final layer of the optimization progress.
optimizer :
str
,optional
Type of solver. Should be one of
SPSA
: See :ref:<spsa.spsa_minimize>
one of
['Nelder-Mead', 'Powell', 'CG', 'BFGS', 'Newton-CG', 'TNC', 'COBYLA', 'SLSQP', 'trust-constr','dogleg', 'trust-ncg', 'trust-exact', 'trust-krylov']
. Seescipy.optimize.minimize
.
If not given, default by
SLSQP
.optimizer_option :
dict
,optional
A dictionary of solver options. Accept the following generic options:
bounds :
List[tuple]
,optional
Bounds for the variables. Sequence of
(min, max)
pairs for each element in x. If specified, variables are clipped to fit inside the bounds after each iteration. None is used to specify no bound.options :
int
Maximum number of iterations to perform. Depending on the method each iteration may use several function evaluations.
For TNC use maxfun instead of maxiter.
- Returns
qaoa_result :
list[tuple]
List of all possible solutions with corresponding probabilities. The solution of the problem we are looking for should generally be the maximum probability.
- Examples
An example for minimization of quadratic binary function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2
>>> from pyqpanda_alg.QFinance import QUBO >>> import sympy as sp >>> import numpy as np >>> import pyqpanda as pq >>> x0, x1, x2 = sp.symbols('x0 x1 x2') >>> function = -0.5 * x0 * x1 - 0.7 * x0 * x1 + 0.9 * x1 * x2 + 1.3 * x0 - x1 - 0.5 * x2 >>> # find the minimum function value using QAOA >>> test2 = QUBO.QUBO_QAOA(function) >>> res2 = test2.run(layer=5, optimizer='SLSQP', >>> optimizer_option={'options':{'eps':1e-3}}) >>> print('result of QAOA: ', res2) result of QAOA: {'000': 0.0004125955977882364, '001': 0.020540129989231624, '010': 0.9152063391500159, '011': 0.003439453872904533, '100': 6.389251180087758e-05, '101': 0.0013381332738120826, '110': 0.034300546853266084, '111': 0.024698908751180276}