VibrationalOp#
- class VibrationalOp(data, num_modals=None, *, copy=True, validate=True)[ソース]#
ベースクラス:
SparseLabelOp
N-mode vibrational operator.
A
VibrationalOp
represents a weighted sum of vibrational creation/annihilation operator terms. These terms are encoded as sparse labels, strings consisting of a space-separated list of expressions. Each expression must look like[+-]_<mode_index>_<modal_index>
, where the<mode_index>
and<modal_index>
are non-negative integers representing the index of the vibrational mode and modal, respectively, where the+
(creation) or-
(annihilation) operation is to be performed.Initialization
A
VibrationalOp
is initialized with a dictionary, mapping terms to their respective coefficients:from qiskit_nature.second_q.operators import VibrationalOp op = VibrationalOp( { "+_0_0 -_0_0": 1.0, "+_0_1 -_0_1": 1.0, "+_1_0 -_1_0": -1.0, "+_1_1 -_1_1": -1.0, }, num_modals=[2, 2] )
By default, this way of initializing will create a full copy of the dictionary of coefficients. If you have very restricted memory resources available, or would like to avoid the additional copy, the dictionary will be stored by reference if you disable
copy
like so:some_big_data = { "+_0_0 -_0_0": 1.0, "+_0_1 -_0_1": 1.0, # ... } op = VibrationalOp( some_big_data, num_modals=[2, 2], copy=False, )
注釈
It is the users』 responsibility, that in the above scenario,
some_big_data
is not changed after initialization of theVibrationalOp
, since the operator contents are not guaranteed to remain unaffected by such changes.If
num_modals
is not provided then the maximummodal_index
per mode will determine thenum_modals
for that mode.from qiskit_nature.second_q.operators import VibrationalOp op = VibrationalOp( { "+_0_0 -_0_0": 1.0, "+_0_1 -_0_1": 1.0, "+_1_0 -_1_0": -1.0, "+_1_1 -_1_1": -1.0, }, )
Algebra
This class supports the following basic arithmetic operations: addition, subtraction, scalar multiplication, operator multiplication, and adjoint. For example,
Addition
VibrationalOp({"+_1_0": 1}, num_modals=[2, 2]) + VibrationalOp({"+_0_0": 1}, num_modals=[2, 2])
Sum
sum(VibrationalOp({label: 1}, num_modals=[1, 1, 1]) for label in ["+_0_0", "-_1_0", "+_2_0 -_2_0"])
Scalar multiplication
0.5 * VibrationalOp({"+_1_0": 1}, num_modals=[1, 1])
Operator multiplication
op1 = VibrationalOp({"+_0_0 -_1_0": 1}, num_modals=[1, 1]) op2 = VibrationalOp({"-_0_0 +_0_0 +_1_0": 1}, num_modals=[1, 1]) print(op1 @ op2)
Tensor multiplication
op = VibrationalOp({"+_0_0 -_1_0": 1}, num_modals=[1, 1]) print(op ^ op)
Adjoint
VibrationalOp({"+_0_0 -_1_0": 1j}, num_modals=[1, 1]).adjoint()
Iteration
Instances of
VibrationalOp
are iterable. Iterating aVibrationalOp
yields (term, coefficient) pairs describing the terms contained in the operator.注釈
A VibrationalOp can contain
qiskit.circuit.ParameterExpression
objects as coefficients.- パラメータ:
data (Mapping[str, _TCoeff]) – the operator data, mapping string-based keys to numerical values.
num_modals (Sequence[int] | None) – number of modals - described by a sequence of integers where each integer describes the number of modals in the corresponding mode; the total number of modals defines the
register_length
.copy (bool) – when set to False the data will not be copied and the dictionary will be stored by reference rather than by value (which is the default;
copy=True
). Note, that this requires you to not change the contents of the dictionary after constructing the operator. This also impliesvalidate=False
. Use with care!validate (bool) – when set to False the
data
keys will not be validated. Note, that the SparseLabelOp base class, makes no assumption about the data keys, so will not perform any validation by itself. Only concrete subclasses are encouraged to implement a key validation method. Disable this setting with care!
- 例外:
QiskitNatureError – when an invalid key is encountered during validation.
Attributes
- atol = 1e-08#
- num_modals#
The number of modals for each mode on which this operator acts.
This is an optional sequence of integers which are considered lower bounds. That means that mathematical operations acting on two or more operators will result in a new operator with the maximum number of modals for each mode involved in any of the operators.
- register_length#
- rtol = 1e-05#
Methods
- argsort(*, weight=False)#
Returns the keys which sort this operator.
- assign_parameters(parameters)#
Assign parameters to new parameters or values.
- パラメータ:
parameters (Mapping[ParameterExpression, complex | ParameterExpression]) – The mapping from parameters to new parameters or values.
- 戻り値:
A new operator with the parameters assigned.
- 戻り値の型:
- static build_dual_index(num_modals, index)[ソース]#
Convert a single expanded index into a dual mode and modal index string.
- パラメータ:
- 戻り値:
The dual index label.
- 例外:
ValueError – If the index is greater than the sum of num_modals.
- 戻り値の型:
- chop(atol=None)#
Chops the real and imaginary parts of the operator coefficients.
This function separately chops the real and imaginary parts of all coefficients to the provided tolerance. Parameters are chopped only if they are exactly zero.
- compose(other, qargs=None, front=False)[ソース]#
Returns the operator composition with another operator.
- パラメータ:
other (VibrationalOp) – the other operator.
qargs – UNUSED.
front (bool) – If True composition uses right operator multiplication, otherwise left multiplication is used (the default).
- 戻り値:
The operator resulting from the composition.
- 戻り値の型:
注釈
Composition (
&
) by default is defined as left matrix multiplication for matrix operators, while@
(equivalent todot()
) is defined as right matrix multiplication. This means thatA & B == A.compose(B)
is equivalent toB @ A == B.dot(A)
whenA
andB
are of the same type.Setting the
front=True
keyword argument changes this to right matrix multiplication which is equivalent to thedot()
methodA.dot(B) == A.compose(B, front=True)
.
- conjugate()#
Returns the conjugate of the
SparseLabelOp
.- 戻り値:
The complex conjugate of the starting
SparseLabelOp
.- 戻り値の型:
- dot(other, qargs=None)#
Return the right multiplied operator self * other.
- パラメータ:
other (Operator) – an operator object.
qargs (list or None) – Optional, a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
- 戻り値:
The right matrix multiplied Operator.
- 戻り値の型:
Operator
注釈
The dot product can be obtained using the
@
binary operator. Hencea.dot(b)
is equivalent toa @ b
.
- equiv(other, *, atol=None, rtol=None)#
Check equivalence of two
SparseLabelOp
instances up to an accepted tolerance.- パラメータ:
other (SparseLabelOp) – the second
SparseLabelOp
to compare with this instance.atol (float | None) – Absolute numerical tolerance. The default behavior is to use
self.atol
.rtol (float | None) – Relative numerical tolerance. The default behavior is to use
self.rtol
.
- 戻り値:
True if operators are equivalent, False if not.
- 例外:
ValueError – Raised if either operator contains parameters
- 戻り値の型:
- expand(other)[ソース]#
Returns the reverse-order tensor product with another operator.
- パラメータ:
other (VibrationalOp) – the other operator.
- 戻り値:
The operator resulting from the tensor product, \(othr \otimes self\).
- 戻り値の型:
- classmethod from_polynomial_tensor(tensor)[ソース]#
Constructs the operator from a
PolynomialTensor
.- パラメータ:
tensor (PolynomialTensor) – the
PolynomialTensor
to be expanded.- 戻り値:
The constructed operator.
- 戻り値の型:
- classmethod from_terms(terms)[ソース]#
Constructs a new
SparseLabelOp
from a sequence returned byterms()
.
- get(k[, d]) D[k] if k in D, else d. d defaults to None. #
- index_order()[ソース]#
Convert to the equivalent operator with the terms of each label ordered by index.
Returns a new operator (the original operator is not modified).
注釈
You can use this method to achieve the most aggressive simplification of an operator without changing the operation order per index.
simplify()
does not reorder the terms and, thus, cannot deduce-_0_0 +_1_0
and+_1_0 -_0_0 +_0_0 -_0_0
to be identical labels. Calling this method will reorder the latter label to-_0_0 +_0_0 -_0_0 +_1_0
, after whichsimplify()
will be able to correctly collapse these two labels into one.- 戻り値:
The index ordered operator.
- 戻り値の型:
- induced_norm(order=1)#
Returns the p-norm induced by the operator coefficients.
If the operator is represented as a sum of terms
\[\sum_i w_i H_i\]then the induced \(p\)-norm is
\[\left(\sum_i |w_i|^p \right)^{1/p}\]This is the standard \(p\)-norm of the operator coefficients considered as a vector (see https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm). Note that this method does not normal-order or simplify the operator before computing the norm; performing either of those operations can affect the result.
- パラメータ:
order (int) – Order \(p\) of the norm. The default value is 1.
- 戻り値:
The induced norm.
- 戻り値の型:
- 例外:
ValueError – Operator contains parameters.
- 戻り値の型:
- is_zero(tol=None)#
Returns true if operator length is zero or all coefficients have value zero.
- items() a set-like object providing a view on D's items #
- keys() a set-like object providing a view on D's keys #
- normal_order()[ソース]#
Convert to the equivalent operator in normal order.
The normal order for this operator is defined as follows: - creation (
+
) operations are applied before annihilation (-
) ones - operators are ordered by index within each of the operator type groupsReturns a new operator (the original operator is not modified).
注釈
The operations encoded by a
VibrationalOp
are fully commutative, which means that re-ordering of individual terms does not result in a phase shift.- 戻り値:
The normal ordered operator.
- 戻り値の型:
- classmethod one()#
Constructs a unity-operator.
- 戻り値:
The unity-operator of the given length.
- 戻り値の型:
- parameters()#
Returns a list of the parameters in the operator.
- 戻り値:
A list of the parameters in the operator.
- 戻り値の型:
list[qiskit.circuit.parameterexpression.ParameterExpression]
- permute_indices(permutation)#
Permutes the indices of the operator.
This method applies the provided index permutation to all labels of this operator. The provided permutation must be a sequence of integers whose length is equal to the
register_length
of the operator. The integer at any given index of the sequence indicates the new index which that location will be permuted to. For example:op = SparseLabelOp({"+_0 -_1 +_2 -_3": 1.0}) permuted_op = op.permute_indices([3, 1, 0, 2]) assert permuted_op == SparseLabelOp({"+_3 -_1 +_0 -_2": 1.0})
警告
This permutation utility is very powerful. Be mindful of the implications such a permutation might have on other components of the stack. To name an example, the builtin two-qubit reduction of the
ParityMapper
might not yield the expected results when used on permuted operator.- パラメータ:
permutation (Sequence[int]) – a sequence of integers indicating the permutation to be applied. See above for an example.
- 戻り値:
A new operator instance with the permuted indices.
- 例外:
ValueError – if the length of the
permutation
argument does not equalregister_length
.- 戻り値の型:
- power(n)#
Return the compose of a operator with itself n times.
- パラメータ:
n (int) – the number of times to compose with self (n>0).
- 戻り値:
the n-times composed operator.
- 戻り値の型:
Clifford
- 例外:
QiskitError – if the input and output dimensions of the operator are not equal, or the power is not a positive integer.
- round(decimals=0)#
Rounds the operator coefficients to a specified number of decimal places.
- パラメータ:
decimals (int) – the number of decimal places to round coefficients to. By default this will round to the nearest integer value.
- 戻り値:
The rounded operator.
- 戻り値の型:
- simplify(atol=None)[ソース]#
Simplify the operator.
The simplifications implemented by this method should be: - to eliminate terms whose coefficients are close (w.r.t.
atol
) to 0. - to combine the coefficients which correspond to equivalent terms (see also the note below)注釈
simplify()
should be used to simplify terms whose coefficients are close to zero, up to the specified numerical tolerance. It still differs slightly fromchop()
because that will chop real and imaginary part components individually.注釈
The meaning of 「equivalence」 between multiple terms depends on the specific operator subclass. As a restriction this method is required to preserve the order of appearance of the different components within a term. This avoids some possibly unexpected edge cases. However, this also means that some equivalencies cannot be detected. Check for other methods of a specific subclass which may affect the order of terms and can allow for further simplifications to be implemented. For example, check out
index_order()
.This method returns a new operator (the original operator is not modified).
- パラメータ:
atol (float | None) – Absolute numerical tolerance. The default behavior is to use
self.atol
.- 戻り値:
The simplified operator.
- 戻り値の型:
- sort(*, weight=False)#
Returns a new sorted operator.
- パラメータ:
weight (bool) – when True, the returned keys will sort this operator according to the coefficient weights of the stored terms; when False, the keys will sort the operator by its keys (i.e. lexicographically).
- 戻り値:
A new operator instance with its contents sorted.
- 戻り値の型:
- tensor(other)[ソース]#
Returns the tensor product with another SparseLabelOp.
- パラメータ:
other (VibrationalOp) – the other SparseLabelOp.
- 戻り値:
The operator resulting from the tensor product, \(self \otimes other\).
- 戻り値の型:
注釈
The tensor product can be obtained using the
^
binary operator. Hencea.tensor(b)
is equivalent toa ^ b
.
- terms()[ソース]#
Provides an iterator analogous to
items()
but with the labels already split into pairs of operation characters and indices.- 列挙:
A tuple with two items; the first one being a list of pairs of the form (char, int) where char is either
+
or-
and the integer corresponds to the vibrational mode and modal index on which the operator gets applied; the second item of the returned tuple is the coefficient of this term.- 戻り値の型:
Iterator[tuple[list[tuple[str, int]], Union[complex, qiskit.circuit.parameterexpression.ParameterExpression]]]
- values() an object providing a view on D's values #
- classmethod zero()#
Constructs a zero-operator.
- 戻り値:
The zero-operator of the given length.
- 戻り値の型: