A tool for cluster expansion solver.
Project description
Quick guide to QCLS
QCLS: Cluster Expansion Based Solver for Open Quantum System
Install
Requirement
-
C++ Build environment (Simply download VSBuildTools and install C++ build tools if you don't know how to configure it.)
-
Python 3.7 and later version
-
Scipy 1.4.1 and later version
-
numpy 1.16.5 and later version
Quick install
pip install -r requirements.txt
Setup
Install manually
Run the following code under the path ./cluster_py
python ./setup.py install
Install via pip
pip install QCLSolver
Install via conda (python<3.9)
conda install -c yesunhuang qclsolver
Suggested way of import
from QCLSolver.solver import Solve
from QCLSolver.data import Data
from QCLSolver.tool import*
Genernal procedure
Using QCLS
is quite similar to using the mesolve
in QuTip
, a quite simple procedure can be followed:
-
Create lists for representing the Hamiltonian, collapse operators and the initial state. Determine the tracking operators and the required cluster-expansion order.
(We are using the upper class English letters to represent creation operators and lower class ones to represent the annihilation operators. The system will automatically detect how many different letters u have inputted and assume the same number of modes in the system. )
-
Derive the equations for the systems using the construct function of
Data
class and store the instance. -
Feed the
Data
instance into theSolve
method and evolve the system. -
Process the and visualize the result.
Quick Example
The following code shows how to use QCLS
to simulate the Janes-Cumming model. (See also the same title notebooks from Quantum mechanics lectures with QuTiP)
The Hamiltonian can be expressed as
#parameters
wc = 1.0 * 2 * pi # cavity frequency
wa = 1.0 * 2 * pi # atom frequency
g = 0.05 * 2 * pi # coupling strength
kappa = 0.005 # cavity dissipation rate
gamma = 0.05
#Create the time list
tlist = np.linspace(0,25,101) #numpy has been imported as np
#Build up the Hamiltonian operators
Hamilton = [['Aa',wc],['Bb',wa],['Ab',g],['aB',g]]
#Build up the Collapse operators
Co_ps = [['a',kappa ],['b',gamma ]]
#Define the inital states (Only folk states are supported now)
psi0 = [0,1]
#Add the tracking operators (The result will be returned at the same order of the operators in T_o)
T_o = ['Aa','Bb']
#Derive the equations under the expanson order of 2
data = Data(Hamilton ,Co_ps , T_o , 2)
#Evolve the system (We are using the ODE solver `solve_vip` from scipy, thus the parameters and the output forms are almost identity )
sol = Solve(data , psi0, (0,25), t_eval = tlist )
#Visualize the result via matplotlib
fig, axes = plt.subplots(1, 1, figsize=(10,6))
axes.plot(tlist, np.real(sol.y[0]),color='red',linestyle='--',label="Cavity(QCLS)")
axes.plot(tlist, np.real(sol.y[1]),color='blue',linestyle='--',label="Atom excited state(QCLS)")
axes.legend(loc=0)
axes.set_xlabel('Time')
axes.set_ylabel('Occupation probability')
plt.show()
API
1.Data Class
1.1 Constructor
-
Prototype
class Data: def __init__(self, H, Co_ps, trackList, maxOPLen)
-
Parameters
- H: The list of Hamiltonian, the form should be of [['Operators','Coefficient']], Coefficient can be a complex number or a function
- Co_ps: Collapse operators, the form is the same as Hamiltonian.
- trackOp: The list of the operators whose mean value you are going to track.
- maxOPLen: The order of cluster expansion
1.2 UpdateInitialState(...)
-
Prototype
def UpdateInitialState(self, initialState)
-
Parameters
- initialState: A list of initial folk states. The order of mode is following the alphabet order of the letters u used to represent the operators.
-
Return
A list of new current mean value of tracking operators calculated based on the initial state.
1.3 Calculate(...)
-
Prototype
Calculate(self)
-
Parameters
None
-
Return
A list of the slope values using to evolve the mean value of operators
1.4 SetCoefHOList(...)
Warning: this function is for advanced use and might still have bugs.
-
Prototype
SetCoefHOList(self, coefHOList, args=None, t=0, ow=True)
-
Parameters
- coefHoList: New list of Hamiltonian' s coefficient.
Other default parameters is for helper use. Plz do not modify them.
-
Important
Run
UpdateCoef
withForceUpdate=true
after running this method.
1.5 SetCoefCOList(...)
Warning: this function is for advanced use and might still have bugs.
-
Prototype
SetCoefCOList(self, coefCOList, args=None, t=0, ow=True)
-
Parameters
- coefCOList: New list of collapse operators' coefficient.
Other default parameters is for helper use. Plz do not modify them.
-
Important
Run
UpdateCoef
withForceUpdate=true
after running this method.
1.6 SetCurrentValue(...)
Warning: this function is for advanced use and might still have bugs.
-
Prototype
def SetCurrentValue(self, curValueList)
-
Parameters
- curValueList: New list of the mean value of tracking operators.
-
Important
Please be noted that after the deriving process, the
T_o
list not only contains the initial tracking operators but all the operators needed to calculate the evolution.
1.7 GetCurrentValue(...)
Warning: this function is for advanced use and might still have bugs.
-
Prototype
def GetCurrentValue(self)
-
Important
Please be noted that after the deriving process, the
T_o
list not only contains the initial tracking operators but all the operators needed to calculate the evolution.
1.8 UpdateCoef(...)
Warning: this function is for advanced use and might still have bugs.
-
Prototype
def UpdateCoef(self, t, args=None, ForceUpdate=False)
-
Parameters
1.t: current time point.
2.ForceUpdate: Force an advanced update to the coefficient list.
2.Solve method
This function is simply connecting QCLS
to outer solver.
-
Prototype
def Solve(ddata, Initial_State, t_span, user_args=None, method='RK45', t_eval=None, dense_output=False, events=None, vectorized=False, **options)
-
Parameters
1.ddata: The
Data
instance. 2.Initial_State: A list for representing the initial state.
3.other paramters: the same as the parameters requested by
solve_ivp
from Scipy -
Return:
The same as the parameters requested by
solve_ivp
from Scipy. The result of y will be returned at the same order of the operators in T_o. -
Advanced
- If u wanna use another solver, u need to implement a convert function following the examples above.
def ConvertToSolver(t,y,data): data.SetCurrentValue(y.tolist()) dy=np.asarray(data.Calculate()) return dy
- Or if you are building your own solver.
def NaiveSolver(data,pace,t_range,initialState): data.UpdateInitialState(initialState) y0=data.GetCurrentValue() n=int((t_range[1]-t_range[0])//pace) tlist=np.linspace(t_range[0],t_range[1],n) y=np.zeros([len(y0),n],dtype=complex) for i in range(0,len(y0)): y[i,0]=y0[i] for i in range(1,n): k1=np.asarray(data.Calculate()) y_s=y[...,i-1]+k1*pace*0.5 data.SetCurrentValue(y_s.tolist()) k2=np.asarray(data.Calculate()) y_s=y[...,i-1]+k2*pace*0.5 data.SetCurrentValue(y_s.tolist()) k3=np.asarray(data.Calculate()) y_s=y[...,i-1]+k3*pace data.SetCurrentValue(y_s.tolist()) k4=np.asarray(data.Calculate()) dy=(k1+2*k2+2*k3+k4)/6 y[...,i]=y[...,i-1]+dy*pace data.SetCurrentValue(y[...,i].tolist()) return (y,tlist)
3.cluster_expansion method
This function is used to investigate cluster expansion.
-
Prototype
def cluster_expansion(op: str, max_op_len: int = 5) -> Tuple[List[int], Dict[str, int], List[Tuple[complex, Tuple[int]]]]:
-
Parameters
1.op: The string representation of operator.
2.max_op_len:order of cluster expansion(please be noted that the operator inputted will be expanded for at least one time.)
-
Return:
The information of the cluster expansion form of inputted operator.
More Information
-
Check out the source codes and the jupyter notebook files.
-
See also the published paper.
-
If your are interesting in the implement, check up the ImplementDetail pdfs. (Warm prompt: those files are so messy and suck.)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file QCLSolver-1.0.5.tar.gz
.
File metadata
- Download URL: QCLSolver-1.0.5.tar.gz
- Upload date:
- Size: 48.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7e28a363ef2b115c55b800da97cf1a79928b5cf898e2b68a56fee8b268db10db |
|
MD5 | 1b7f3c90569de9ea062207ca5a528ac7 |
|
BLAKE2b-256 | 1fc6f76f848ebbcb75f4c3a02caf17f75d02f6697137bd38933b49cb4b7fce15 |