qml.dot¶
- dot(coeffs, ops, pauli=False, grouping_type=None, method='rlf')[source]¶
Returns the dot product between the
coeffs
vector and theops
list of operators.This function returns the following linear combination: \(\sum_{k} c_k O_k\), where \(c_k\) and \(O_k\) are the elements inside the
coeffs
andops
arguments, respectively.- Parameters
coeffs (Sequence[float, Callable]) – sequence containing the coefficients of the linear combination
ops (Sequence[Operator, PauliWord, PauliSentence]) – sequence containing the operators of the linear combination. Can also be
PauliWord
orPauliSentence
instances.pauli (bool, optional) – If
True
, aPauliSentence
operator is used to represent the linear combination. If False, aSum
operator is returned. Defaults toFalse
. Note that whenops
consists solely ofPauliWord
andPauliSentence
instances, the function still returns a PennyLane operator whenpauli=False
.grouping_type (str) – The type of binary relation between Pauli words used to compute the grouping. Can be
'qwc'
,'commuting'
, or'anticommuting'
. Note that ifpauli=True
, the grouping will be ignored.method (str) – The graph colouring heuristic to use in solving minimum clique cover for grouping, which can be
'lf'
(Largest First) or'rlf'
(Recursive Largest First). This keyword argument is ignored ifgrouping_type
isNone
.
- Raises
ValueError – if the number of coefficients and operators does not match or if they are empty
- Returns
operator describing the linear combination
- Return type
Note
If grouping is requested, the computed groupings are stored as a list of list of indices in
Sum.grouping_indices
. The indices refer to the operators and coefficients returned bySum.terms()
, notSum.operands
, as these are not guaranteed to be equivalent.Example
>>> coeffs = np.array([1.1, 2.2]) >>> ops = [qml.X(0), qml.Y(0)] >>> qml.dot(coeffs, ops) 1.1 * X(0) + 2.2 * Y(0) >>> qml.dot(coeffs, ops, pauli=True) 1.1 * X(0) + 2.2 * Y(0)
Note that additions of the same operator are not executed by default.
>>> qml.dot([1., 1.], [qml.X(0), qml.X(0)]) X(0) + X(0)
You can obtain a cleaner version by simplifying the resulting expression.
>>> qml.dot([1., 1.], [qml.X(0), qml.X(0)]).simplify() 2.0 * X(0)
pauli=True
can be used to construct a more efficient, simplified version of the operator. Note that it returns aPauliSentence
, which is not anOperator
. This specialized representation can be converted to an operator:>>> qml.dot([1, 2], [qml.X(0), qml.X(0)], pauli=True).operation() 3.0 * X(0)
Using
pauli=True
and then converting the result to anOperator
is much faster than usingpauli=False
, but it only works for pauli words (seeis_pauli_word()
).If any of the parameters listed in
coeffs
are callables, the resulting dot product will be aParametrizedHamiltonian
:>>> coeffs = [lambda p, t: p * jnp.sin(t) for _ in range(2)] >>> ops = [qml.X(0), qml.Y(0)] >>> qml.dot(coeffs, ops) ( <lambda>(params_0, t) * X(0) + <lambda>(params_1, t) * Y(0) )
Grouping
Grouping information can be collected during construction using the
grouping_type
andmethod
keyword arguments. For example:import pennylane as qml a = qml.X(0) b = qml.prod(qml.X(0), qml.X(1)) c = qml.Z(0) obs = [a, b, c] coeffs = [1.0, 2.0, 3.0] op = qml.dot(coeffs, obs, grouping_type="qwc")
>>> op.grouping_indices ((2,), (0, 1))
grouping_type
can be"qwc"
(qubit-wise commuting),"commuting"
, or"anticommuting"
, andmethod
can be"rlf"
or"lf"
. To see more details about how these affect grouping, see Pauli Graph Colouring andgroup_observables()
.