Quantum system classes (quanguru.classes.QSystem
)#
Contains the QuantumSystem class used for quantum systems
|
Class for quantum systems, both for single and composite systems, which can also be nested. |
Function Name |
Docstrings |
Unit Tests |
Tutorials |
---|---|---|---|
QuantumSystem |
✅ |
✅ |
✅ |
- _initStDec(_createInitialState)[source]#
Decorater to handle different inputs for initial state creation.
- class QuantumSystem(**kwargs)[source]#
Bases:
QSimComp
Class for quantum systems, both for single and composite systems, which can also be nested.
- label: str = 'QuantumSystem'#
(class attribute) class label used in default naming
- _internalInstances: int = 0#
(class attribute) number of instances created internally by the library
- _externalInstances: int = 0#
(class attribute) number of instances created explicitly by the user
- _instances: int = 0#
(class attribute) number of total instances = _internalInstances + _externalInstances
- __terms#
dictionary of the terms
- __dimension#
dimension of Hilbert space of the quantum system
- __compSys#
boolean flag for composite/single systems
- __dimsBefore#
Total dimension of the other quantum systems before
self
in a composite system. It is 1, whenself`
is the first system in the composite system orself
is not in a composite system.
- __dimsAfter#
Total dimension of the other quantum systems after
self
in a composite system. It is 1, whenself
is the last system in the composite system.
- _inpCoef#
boolean to determine whether initialState inputs contains complex coefficients (the probability amplitudes) or the populations
- __compOpers#
a dictionary to store arbitrary composite operators that are shaped and updated internally
- timeDependency#
function that can be assigned by the user to update the parameters a function of time. The library passes the current time to this function, and any desired parameter can be updated as a function of time.
- __unitary#
an internal
freeEvolution
protocol, this is the default evolution when a simulation is run.
- property _compositeOperator#
A property to store a function pointer (for operator) as key of a dictionary where the value is the internally created composite operator.
- _constructMatrices()[source]#
The matrices for operators constructed and de-constructed whenever they should be, and this method is used internally in various places when the matrices are needed to be constructed.
- _timeDependency(time=None)[source]#
Internal method that passes the current time to
timeDependency
method that needs to be defined by the user to update the desired parameters (such as frequency of the spin system) as a function of time. Also passes down the current time in evolution to all thesubSys
andterms
.
- _createState(inp=None, _maxInput=1)#
- property initialState#
Getter for the simulation initial state, equivalent to
self.simulation.initialState
. This works by assuming that its setter/s makes sure that _stateBase__initialState.value is not None for single systems (if its state is set).
- property _subSysHamiltonian#
returns the sum of sub-system Hamiltonian
- property totalHamiltonian#
returns the total Hamiltonian of
self
including the coupling terms.
- property _termHamiltonian#
returns the sum of term Hamiltonian
- property _totalDim#
QuantumSystem.dimension
returns the dimension of a quantum system itself, meaning it does not contain dimensions of the other systems ifself
is in a composite system,_totalDim
returns the total dimension by also taking the dimensions before and afterself
in a composte system.
- property dimension#
Property to get the dimension of any quantum system and also to set the dimension of single quantum systems. It calculates the dimension of a composite system on every call. For composite systems, setter raises a warning. For single system, setter also calls _updateDimension on its superSys (if there is one).
- property subSysDimensions#
Returns a (nested) list of dimensions of the quantum systems contained in
self
, if self is composite, else returns self.dimension.
- _updateDimension(subSys, newDim, oldDim)[source]#
Internal method to update dimension before/after information of the sub-systems when the dimension of a sub-system is updated. It is called in the dimension setter.
- Parameters:
subSys – The sub-system whose dimension is being updated.
newDim (int) – The new dimension of the subSys
oldDim (int) – The old dimension of the subSys
- __dimsABUpdate(attrName, val)#
Common parts of the dimsBefore/After setters are combined in this method.
- Parameters:
attrName (str) – _dimsBefore/After as a string to be used with setAttr&setattr
val (int) – new value of _dimsBefore/After
- property _dimsBefore#
Property to set and get the
__dimsBefore
. Getter can be used to get information, but the setter is intended purely for internal use.
- property _dimsAfter#
Property to set and get the
__dimsAfter
. Getter can be used to get information, but the setter is intended purely for internal use.
- property _isComposite#
Used internally to set _QuantumSystem__compSys boolean, never query this before _QuantumSystem__compSys is set by some internal call. Otherwise, this will always return False (because subSys dict is always empty initially)
- _hasInSubs(other)[source]#
Returns True if the given system is in self.subSys or in any other subSys nested inside the self.subSys
- property ind#
If
self
is in a composite quantum system, this return an index representing the position ofself
in the composite system, else it returns 0. Also, the first system in a composite quantum system is at index 0. This is mainly used for _updateDimension where we compare the position of a sub-system against the others to determine whether _dimsBefore/After needs to be updated.
- __addSub(subSys)#
internal method used to update relevant information (such as dimension before/after) for the existing and newly added sub-systems. This is purely for internal use.
- addSubSys(subSys, **kwargs)[source]#
Extends the addSubSys method for composite quantum systems to set the __compSys boolean (to True, if None), update the dimsBefore/After of the sub-systems, set self as superSys of the sub-system, and set _paramUpdated to True, or it raises a TypeError if __compSys is already set to False. Also, it places self into the _paramBoundBase__paramBound dictionary of the sub-system, so that parameter updates of the sub-system also sets the _paramUpdated of self to True. Note that composite systems can contain other composite systems as sub-systems.
- delMatrices(_exclude=[])[source]#
This method extends
delMatrices
ofQSimComp
to also calldelMatrices
on terms.
- __add__(other)[source]#
overload the + operator to create a composite quantum system between
self
and theother
quantum system.
- __sub__(other)[source]#
overload the
-
operator to remove theother
fromself
, which should be the composite quantum system containing/connected-to the other.
- _removeSubSysExc(subSys: Any, _exclude=[]) None [source]#
Method to remove a given subSys (which might be a single or composite system) from a composite system, which might be self or any other composite system in the nested-system structure. This method traverses through the nested-structure to find the subSys (that will be removed) and uses _exclude to avoid infinite loops, that, for example, might be created when a system calls _removeSubSysExc on its superSys which calls _removeSubSysExc on its subSys, by calling _removeSubSysExc on self if self is not in _exclude. Since _exclude needs to be empty in each call, this method should not be called directly, removeSubSys is a wrapper around this and always calls this with an empty _exclude. Raises an error if removeSubSys is called on a single system. This method also updates the dimsBefore/After of the remaining sub-systems (and the removed system), deletes the existing matrices so that they are re-created with the proper dimensions. When removing a single system, it sets the dimension of the single system to 1, so that all the dimsBefore/After information are updated by the dimensionUpdate method. However, we might still need the removed system, so its dimension is stored (in oldDim) and set back again (into _QuantumSystem__dimension) after its removed. When removing a composite system, it makes _removeSubSysExc to each sub-system of the removed composite system, and these nested calls sets the dimensions of all the single systems below the removed composite to 1 so that the dimsBefore/After information are again updated by the dimensionUpdate method. However, the removed composite system might still be needed, and we might not want these dimensions to be 1 or these single systems to be removed from the removed composite system. These are avoided by storing&setting the dimensions back to their original values for single systems and adding the removed sub-systems of removed composite systems back in.
- property _freeEvol#
Property to get the
default
internalfreeEvolution
proptocol.
- addProtocol(protocol=None, system=None, protocolRemove=None)[source]#
adds the given
protocol
intoself.simulation
and usesself
assystem
if it is not given. It also can removed a protocol (protocolRemove
) at the same time.
- createTerm(operator, frequency=None, qSystem=None, order=None, superSys=None, **kwargs)[source]#
Method to create a new term with the given parameters and also set the given kwargs to the new term.
- Parameters:
operator (Callable or List[Callable]) – operator/s of the term
frequency – frequency of the term, by default None
qSystem (QuantumSystem) – quantum system/s for the given operator/s, and it is self if no system is given
order – order/s of the operator/s, it is set to 1 by default if no order value is given
- Returns:
Newly created QTerm object
- Return type:
- addTerms(trm, **kwargs)[source]#
Method to add an existing term to self and also optionally set some of the term parameters through the kwargs.
- _removeTermExc(termObj, _exclude=[])[source]#
The method to find and remove the term from a quantum system.
- removeTerm(termObj)[source]#
Method to remove the given term from the quantum system. This can be called on any system in a composite system to remove any term, even if it belongs to another sub-system. This is intended so that the term of a subsystem can be removed through the composite system, especially for nested-composite systems. You can also give a list of terms (or their named/aliases) to be removed. This method is a wrapper around the actual remove method the
_removeTermExc
so that it is called with an empty _exclude list, which is used to avoid infinite recursions when finding the term inside a nested system. Note that it will raise an error, if the given term is the first-term if the system.
- property terms#
Property to get & set the terms of the quantum system. Note that the setter is not intended for adding a new term, but replace the all the existing terms with the given term/s (which can be a single term or a list of terms, and it also works with names and/or aliases). In order to add an additional term to existing ones, use
addTerm
method.
- property _firstTerm#
Property to get the first term of the quantum system.
- property frequency#
Property to get & set the frequency of the first term of the quantum system.
- property operator#
Property to get & set the operator of the first term of the quantum system.
- property order#
Property to get & set the order of the first term of the quantum system.
- property _freeMatrix#
Property to get & set the free (i.e. no frequency or, equivalently frequency=1) matrix for the first term.
- copy(**kwargs)[source]#
Creates an empty copy of self. This method is introduced here to be extended in child class. In here, it ** does not copy ** the object, but creates a new object of the same class and sets the given kwargs
- __rmul__(other)[source]#
With this method,
*
creates a composite quantum system that containsN=other
many quantum systems with the sametype
asself
.
- Dicke(couplingStrength, subSys1=None, subSys2=None)#
- JC(couplingStrength, subSys1=None, subSys2=None)#
- Rabi(couplingStrength, subSys1=None, subSys2=None)#
- __firstlineno__ = 59#
- __static_attributes__ = ('_QuantumSystem__compSys', '_QuantumSystem__dimension', '_QuantumSystem__terms', '__compOpers', '__compSys', '__dimension', '__dimsAfter', '__dimsBefore', '__terms', '__unitary', '_inpCoef', '_paramBoundBase__matrix', '_paramBoundBase__paramUpdated', '_paramUpdated', 'timeDependency')#
- class Cavity(**kwargs)[source]#
Bases:
QuantumSystem
Cavity class, the only difference from a generic quantum object is that, by default, its operator is the number operator.
- label: str = 'Cavity'#
(class attribute) class label used in default naming
- _internalInstances: int = 0#
(class attribute) number of instances created internally by the library
- _externalInstances: int = 0#
(class attribute) number of instances created explicitly by the user
- _instances: int = 0#
(class attribute) number of total instances = _internalInstances + _externalInstances
- __firstlineno__ = 762#
- __static_attributes__ = ('_QuantumSystem__compSys', 'operator')#
- class Spin(**kwargs)[source]#
Bases:
QuantumSystem
Object for a single Spin system with spin j (jValue).
- label: str = 'Spin'#
(class attribute) class label used in default naming
- _internalInstances: int = 0#
(class attribute) number of instances created internally by the library
- _externalInstances: int = 0#
(class attribute) number of instances created explicitly by the user
- _instances: int = 0#
(class attribute) number of total instances = _internalInstances + _externalInstances
- __jValue#
spin quantum number
- property jValue#
Gets and sets the spin quantum number
- __firstlineno__ = 783#
- __static_attributes__ = ('_QuantumSystem__compSys', '_Spin__jValue', '__jValue', 'dimension', 'operator')#
- class Qubit(**kwargs)[source]#
Bases:
Spin
Spin 1/2 special case of Spin class, i.e. a Qubit.
- __firstlineno__ = 818#
- __static_attributes__ = ('_QuantumSystem__compSys', 'dimension', 'operator')#
- label: str = 'Qubit'#
(class attribute) class label used in default naming
- _internalInstances: int = 0#
(class attribute) number of instances created internally by the library
- _externalInstances: int = 0#
(class attribute) number of instances created explicitly by the user
- _instances: int = 0#
(class attribute) number of total instances = _internalInstances + _externalInstances