qnet.algebra.core.scalar_algebra module¶
Implementation of the scalar (quantum) algebra
Summary¶
Classes:
Scalar |
Base class for Scalars |
ScalarDerivative |
Symbolic partial derivative of a scalar |
ScalarExpression |
Base class for scalars with non-scalar arguments |
ScalarIndexedSum |
Indexed sum over scalars |
ScalarPlus |
Sum of scalars |
ScalarPower |
A scalar raised to a power |
ScalarTimes |
Product of scalars |
ScalarValue |
Wrapper around a numeric or symbolic value |
Functions:
KroneckerDelta |
Kronecker delta symbol |
is_scalar |
Check if scalar is a Scalar or a scalar value |
sqrt |
Square root of a Scalar or scalar value |
Data:
One |
The neutral element with respect to scalar multiplication |
Zero |
The neutral element with respect to scalar addition |
__all__: KroneckerDelta, One, Scalar, ScalarDerivative, ScalarExpression, ScalarIndexedSum, ScalarPlus, ScalarPower, ScalarTimes, ScalarValue, Zero, sqrt
Reference¶
-
class
qnet.algebra.core.scalar_algebra.Scalar(*args, **kwargs)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumExpressionBase class for Scalars
-
space¶ TrivialSpace, by definition
-
real¶ Real part
-
imag¶ Imaginary part
-
-
class
qnet.algebra.core.scalar_algebra.ScalarValue(val)[source]¶ Bases:
qnet.algebra.core.scalar_algebra.ScalarWrapper around a numeric or symbolic value
The wrapped value may be of any of the following types:
>>> for t in ScalarValue._val_types: ... print(t) <class 'int'> <class 'float'> <class 'complex'> <class 'sympy.core.basic.Basic'> <class 'numpy.int64'> <class 'numpy.complex128'> <class 'numpy.float64'>
A
ScalarValuebehaves exactly like its wrapped value in all algebraic contexts:>>> 5 * ScalarValue.create(2) 10
Any unknown attributes or methods will be forwarded to the wrapped value to ensure complete “duck-typing”:
>>> alpha = ScalarValue(sympy.symbols('alpha', positive=True)) >>> alpha.is_positive # same as alpha.val.is_positive True >>> ScalarValue(5).is_positive Traceback (most recent call last): ... AttributeError: 'int' object has no attribute 'is_positive'
-
classmethod
create(val)[source]¶ Instatiate the
ScalarValuewhile recognizingZeroandOne.Scalarinstances as val (includingScalarExpressioninstances) are left unchanged. This makesScalarValue.create()a safe method for converting unknown objects toScalar.
-
val¶ The wrapped scalar value
-
args¶ Tuple containing the wrapped scalar value as its only element
-
real¶ Real part
-
imag¶ Imaginary part
-
classmethod
-
class
qnet.algebra.core.scalar_algebra.ScalarExpression(*args, **kwargs)[source]¶ Bases:
qnet.algebra.core.scalar_algebra.ScalarBase class for scalars with non-scalar arguments
For example, a
BraKetis aScalar, but has arguments that are states.
-
qnet.algebra.core.scalar_algebra.Zero= Zero[source]¶ The neutral element with respect to scalar addition
Equivalent to the scalar value zero:
>>> Zero == 0 True
-
qnet.algebra.core.scalar_algebra.One= One[source]¶ The neutral element with respect to scalar multiplication
Equivalent to the scalar value one:
>>> One == 1 True
-
class
qnet.algebra.core.scalar_algebra.ScalarPlus(*operands, **kwargs)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumPlus,qnet.algebra.core.scalar_algebra.ScalarSum of scalars
Generally,
ScalarValueinstances are combined directly:>>> alpha = ScalarValue.create(sympy.symbols('alpha')) >>> print(srepr(alpha + 1)) ScalarValue(Add(Symbol('alpha'), Integer(1)))
An unevaluated
ScalarPlusremains only forScalarExpressioninstaces:>>> braket = KetSymbol('Psi', hs=0).dag() * KetSymbol('Phi', hs=0) >>> print(srepr(braket + 1, indented=True)) ScalarPlus( One, BraKet( KetSymbol( 'Psi', hs=LocalSpace( '0')), KetSymbol( 'Phi', hs=LocalSpace( '0'))))
-
simplifications= [<function assoc>, <function convert_to_scalars>, <function orderby>, <function collect_scalar_summands>, <function match_replace_binary>]¶
-
-
class
qnet.algebra.core.scalar_algebra.ScalarTimes(*operands, **kwargs)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumTimes,qnet.algebra.core.scalar_algebra.ScalarProduct of scalars
Generally,
ScalarValueinstances are combined directly:>>> alpha = ScalarValue.create(sympy.symbols('alpha')) >>> print(srepr(alpha * 2)) ScalarValue(Mul(Integer(2), Symbol('alpha')))
An unevaluated
ScalarTimesremains only forScalarExpressioninstaces:>>> braket = KetSymbol('Psi', hs=0).dag() * KetSymbol('Phi', hs=0) >>> print(srepr(braket * 2, indented=True)) ScalarTimes( ScalarValue( 2), BraKet( KetSymbol( 'Psi', hs=LocalSpace( '0')), KetSymbol( 'Phi', hs=LocalSpace( '0'))))
-
simplifications= [<function assoc>, <function orderby>, <function filter_neutral>, <function match_replace_binary>]¶
-
-
class
qnet.algebra.core.scalar_algebra.ScalarIndexedSum(term, *ranges)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumIndexedSum,qnet.algebra.core.scalar_algebra.ScalarIndexed sum over scalars
-
simplifications= [<function assoc_indexed>, <function indexed_sum_over_kronecker>, <function indexed_sum_over_const>, <function match_replace>]¶
-
classmethod
create(term, *ranges)[source]¶ Instantiate the indexed sum while applying simplification rules
-
real¶ Real part
-
imag¶ Imaginary part
-
-
class
qnet.algebra.core.scalar_algebra.ScalarPower(b, e)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumOperation,qnet.algebra.core.scalar_algebra.ScalarA scalar raised to a power
Generally,
ScalarValueinstances are exponentiated directly:>>> alpha = ScalarValue.create(sympy.symbols('alpha')) >>> print(srepr(alpha**2)) ScalarValue(Pow(Symbol('alpha'), Integer(2)))
An unevaluated
ScalarPowerremains only forScalarExpressioninstaces, see e.g.sqrt().-
simplifications= [<function convert_to_scalars>, <function match_replace>]¶
-
base¶ The base of the exponential
-
exp¶ The exponent
-
-
class
qnet.algebra.core.scalar_algebra.ScalarDerivative(op, *, derivs, vals=None)[source]¶ Bases:
qnet.algebra.core.abstract_quantum_algebra.QuantumDerivative,qnet.algebra.core.scalar_algebra.ScalarSymbolic partial derivative of a scalar
See
QuantumDerivative.
-
qnet.algebra.core.scalar_algebra.KroneckerDelta(i, j, simplify=True)[source]¶ Kronecker delta symbol
Return
One(i equals j)),Zero(i and j are non-symbolic an unequal), or aScalarValuewrapping SymPy’sKroneckerDelta.>>> i, j = IdxSym('i'), IdxSym('j') >>> KroneckerDelta(i, i) One >>> KroneckerDelta(1, 2) Zero >>> KroneckerDelta(i, j) KroneckerDelta(i, j)
By default, the Kronecker delta is returned in a simplified form, e.g:
>>> KroneckerDelta((i+1)/2, (j+1)/2) KroneckerDelta(i, j)
This may be suppressed by setting simplify to False:
>>> KroneckerDelta((i+1)/2, (j+1)/2, simplify=False) KroneckerDelta(i/2 + 1/2, j/2 + 1/2)
Raises: TypeError– if i or j is not an integer or sympy expression. There- is no automatic sympification of i and j.
-
qnet.algebra.core.scalar_algebra.sqrt(scalar)[source]¶ Square root of a
Scalaror scalar valueThis always returns a
Scalar, and uses a symbolic square root if possible (i.e., for non-floats):>>> sqrt(2) sqrt(2) >>> sqrt(2.0) 1.414213...
For a
ScalarExpressionargument, it returns aScalarPowerinstance:>>> braket = KetSymbol('Psi', hs=0).dag() * KetSymbol('Phi', hs=0) >>> nrm = sqrt(braket * braket.dag()) >>> print(srepr(nrm, indented=True)) ScalarPower( ScalarTimes( BraKet( KetSymbol( 'Phi', hs=LocalSpace( '0')), KetSymbol( 'Psi', hs=LocalSpace( '0'))), BraKet( KetSymbol( 'Psi', hs=LocalSpace( '0')), KetSymbol( 'Phi', hs=LocalSpace( '0')))), ScalarValue( Rational(1, 2)))
-
qnet.algebra.core.scalar_algebra.is_scalar(scalar)[source]¶ Check if scalar is a
Scalaror a scalar valueSpecifically, whether scalar is an instance of
Scalaror an instance of a numeric or symbolic type that could be wrapped inScalarValue.For internal use only.