Qutip Versions Save

QuTiP: Quantum Toolbox in Python

v4.7.6

1 month ago

Release to avoid issues related to scipy 1.13

QuTiP 4.7.6 (2024-04-05)

Bug Fixes

  • Increase countstat stability. (#2323)

Miscellaneous

  • Exclude scipy 1.13 from in the requirements (#2383)

v5.0.1

1 month ago

Patch release fixing small issues, mostly with the migration from self hosting the documentation to using readthedocs.

  • Fix broken links in the documentation when migrating to readthedocs
  • Fix readthedocs search feature
  • Add setuptools to runtime compilation requirements
  • Fix mcsolve documentation for open systems
  • Fix OverFlowError in progress bars

v5.0.0

1 month ago

QuTiP 5.0.0

QuTiP 5 is a redesign of many of the core components of QuTiP (Qobj, QobjEvo, solvers) to make them more consistent and more flexible.

Qobj may now be stored in either sparse or dense representations, and the two may be mixed sensibly as needed. QobjEvo is now used consistently throughout QuTiP, and the implementation has been substantially cleaned up. A new Coefficient class is used to represent the time-dependent factors inside QobjEvo.

The solvers have been rewritten to work well with the new data layer and the concept of Integrators which solve ODEs has been introduced. In future, new data layers may provide their own Integrators specialized to their representation of the underlying data.

Much of the user-facing API of QuTiP remains familiar, but there have had to be many small breaking changes. If we can make changes to easy migrating code from QuTiP 4 to QuTiP 5, please let us know. A notebook to help with migration is available on colab.

An extensive list of changes follows.

Contributors

QuTiP 5 has been a large effort by many people over the last three years.

In particular:

  • Jake Lishman led the implementation of the new data layer and coefficients.
  • Eric Giguère led the implementation of the new QobjEvo interface and solvers.
  • Boxi Li led the updating of QuTiP's QIP support and the creation of qutip_qip.

Other members of the QuTiP Admin team have been heavily involved in reviewing, testing and designing QuTiP 5:

  • Alexander Pitchford
  • Asier Galicia
  • Nathan Shammah
  • Shahnawaz Ahmed
  • Neill Lambert
  • Simon Cross
  • Paul Menczel

Two Google Summer of Code contributors updated the tutorials and benchmarks to QuTiP 5:

During an internship at RIKEN, Patrick Hopf created a new quantum control method and improved the existing methods interface:

Four experimental data layers backends were written either as part of Google Summer of Code or as separate projects. While these are still alpha quality, they helped significantly to test the data layer API:

Finally, Yuji Tamakoshi updated the visualization function and added animation functions as part of Google Summer of Code project.

We have also had many other contributors, whose specific contributions are detailed below:

  • Pieter Eendebak (updated the required SciPy to 1.5+, #1982)
  • Pieter Eendebak (reduced import times by setting logger names, #1981)
  • Pieter Eendebak (Allow scipy 1.12 to be used with qutip, #2354)
  • Xavier Sproken (included C header files in the source distribution, #1971)
  • Christian Staufenbiel (added support for multiple collapse operators to the Floquet solver, #1962)
  • Christian Staufenbiel (fixed the basis used in the Floquet Master Equation solver, #1952)
  • Christian Staufenbiel (allowed the bloch_redfield_tensor function to accept strings and callables for a_ops, #1951)
  • Christian Staufenbiel (Add a guide on Superoperators, Pauli Basis and Channel Contraction, #1984)
  • Henrique Silvéro (allowed qutip_qip to be imported as qutip.qip, #1920)
  • Florian Hopfmueller (added a vastly improved implementations of process_fidelity and average_gate_fidelity, #1712, #1748 , #1788)
  • Felipe Bivort Haiek (fixed inaccuracy in docstring of the dense implementation of negation, #1608)
  • Rajath Shetty (added support for specifying colors for individual points, vectors and states display by qutip.Bloch, #1335)
  • Rochisha Agarwal (Add dtype to printed ouput of qobj, #2352)
  • Kosuke Mizuno (Add arguments of plot_wigner() and plot_wigner_fock_distribution() to specify parameters for wigner(), #2057)
  • Matt Ord (Only pre-compute density matrices if keep_runs_results is False, #2303)
  • Daniel Moreno Galán (Add the possibility to customize point colors as in V4 and fix point plot behavior for 'l' style, #2303)
  • Sola85 (Fixed simdiag not returning orthonormal eigenvectors, #2269)
  • Edward Thomas (Fix LaTeX display of Qobj state in Jupyter cell outputs, #2272)
  • Bogdan Reznychenko (Rework kraus_to_choi making it faster, #2284)
  • gabbence95 (Fix typos in expect documentation, #2331)
  • lklivingstone (Added repr to QobjEvo, #2111)
  • Yuji Tamakoshi (Improve print(qutip.settings) by make it shorter, #2113)
  • khnikhil (Added fermionic annihilation and creation operators, #2166)
  • Daniel Weiss (Improved sampling algorithm for mcsolve, #2218)
  • SJUW (Increase missing colorbar padding for matrix_histogram_complex() from 0 to 0.05, #2181)
  • Valan Baptist Mathuranayagam (Changed qutip-notebooks to qutip-tutorials and fixed the typo in the link redirecting to the changelog section in the PR template, #2107)
  • Gerardo Jose Suarez (Added information on sec_cutoff to the documentation, #2136)
  • Cristian Emiliano Godinez Ramirez (Added inherited members to API doc of MESolver, SMESolver, SSESolver, NonMarkovianMCSolver, #2167)
  • Andrey Rakhubovsky (Corrected grammar in Bloch-Redfield master equation documentation, #2174)
  • Rushiraj Gadhvi (qutip.ipynbtools.version_table() can now be called without Cython installed, #2110)
  • Harsh Khilawala (Moved HTMLProgressBar from qutip/ipynbtools.py to qutip/ui/progressbar.py, #2112)
  • Avatar Srinidhi P V (Added new argument bc_type to take boundary conditions when creating QobjEvo, #2114)
  • Andrey Rakhubovsky (Fix types in docstring of projection(), #2363)

Qobj changes

Previously Qobj data was stored in a SciPy-like sparse matrix. Now the representation is flexible. Implementations for dense and sparse formats are included in QuTiP and custom implementations are possible. QuTiP's performance on dense states and operators is significantly improved as a result.

Some highlights:

  • The data is still acessible via the .data attribute, but is now an instance of the underlying data type instead of a SciPy-like sparse matrix. The operations available in qutip.core.data may be used on .data, regardless of the data type.
  • Qobj with different data types may be mixed in arithmetic and other operations. A sensible output type will be automatically determined.
  • The new .to(...) method may be used to convert a Qobj from one data type to another. E.g. .to("dense") will convert to the dense representation and .to("csr") will convert to the sparse type.
  • Many Qobj methods and methods that create Qobj now accepted a dtype parameter that allows the data type of the returned Qobj to specified.
  • The new & operator may be used to obtain the tensor product.
  • The new @ operator may be used to obtain the matrix / operator product. bar @ ket returns a scalar.
  • The new .contract() method will collapse 1D subspaces of the dimensions of the Qobj.
  • The new .logm() method returns the matrix logarithm of an operator.
  • The methods .set_data, .get_data, .extract_state, .eliminate_states, .evaluate and .check_isunitary have been removed.
  • The property dtype return the representation of the data used.
  • The new data_as allow to obtain the data as a common python formats: numpy array, scipy sparse matrix, JAX Array, etc.

QobjEvo changes

The QobjEvo type for storing time-dependent quantum objects has been significantly expanded, standardized and extended. The time-dependent coefficients are now represented using a new Coefficient type that may be independently created and manipulated if required.

Some highlights:

  • The .compile() method has been removed. Coefficients specified as strings are automatically compiled if possible and the compilation is cached across different Python runs and instances.
  • Mixing coefficient types within a single Qobj is now supported.
  • Many new attributes were added to QobjEvo for convenience. Examples include .dims, .shape, .superrep and .isconstant.
  • Many old attributes such as .cte, .use_cython, .type, .const, and .coeff_file were removed.
  • A new Spline coefficient supports spline interpolations of different orders. The old Cubic_Spline coefficient has been removed.
  • The new .arguments(...) method allows additional arguments to the underlying coefficient functions to be updated.
  • The _step_func_coeff argument has been replaced by the order parameter. _step_func_coeff=False is equivalent to order=3. _step_func_coeff=True is equivalent to order=0. Higher values of order gives spline interpolations of higher orders.
  • The spline type can take bc_type to control the boundary conditions.
  • QobjEvo can be creating from the multiplication of a Qobj with a coefficient: oper * qutip.coefficient(f, args=args) is equivalent to qutip.QobjEvo([[oper, f]], args=args).
  • Coefficient function can be defined in a pythonic manner: def f(t, A, w). The dictionary args second argument is no longer needed. Function using the exact f(t, args) signature will use the old method for backward compatibility.

Solver changes

The solvers in QuTiP have been heavily reworked and standardized. Under the hood solvers now make use of swappable ODE Integrators. Many Integrators are included (see the list below) and custom implementations are possible. Solvers now consistently accept a QobjEvo instance at the Hamiltonian or Liouvillian, or any object which can be passed to the QobjEvo constructor.

A breakdown of highlights follows.

All solvers:

  • Solver options are now supplied in an ordinary Python dict. qutip.Options is deprecated and returns a dict for backwards compatibility.
  • A specific ODE integrator may be selected by supplying a method option.
  • Each solver provides a class interface. Creating an instance of the class allows a solver to be run multiple times for the same system without having to repeatedly reconstruct the right-hand side of the ODE to be integrated.
  • A QobjEvo instance is accepted for most operators, e.g., H, c_ops, e_ops, a_ops.
  • The progress bar is now selected using the progress_bar option. A new progess bar using the tqdm Python library is provided.
  • Dynamic arguments, where the value of an operator depends on the current state of the evolution interface reworked. Now a property of the solver is to be used as an arguments: args={"state": MESolver.StateFeedback(default=rho0)}

Integrators:

  • The SciPy zvode integrator is available with the BDF and Adams methods as bdf and adams.
  • The SciPy dop853 integrator (an eighth order Runge-Kutta method by Dormand & Prince) is available as dop853.
  • The SciPy lsoda integrator is available as lsoda.
  • QuTiP's own implementation of Verner's "most efficient" Runge-Kutta methods of order 7 and 9 are available as vern7 and vern9. See http://people.math.sfu.ca/~jverner/ for a description of the methods.
  • QuTiP's own implementation of a solver that directly diagonalizes the the system to be integrated is available as diag. It only works on time-independent systems and is slow to setup, but once the diagonalization is complete, it generates solutions very quickly.
  • QuTiP's own implementatoin of an approximate Krylov subspace integrator is available as krylov. This integrator is only usable with sesolve.

Result class:

  • A new .e_data attribute provides expectation values as a dictionary. Unlike .expect, the values are provided in a Python list rather than a numpy array, which better supports non-numeric types.
  • The contents of the .stats attribute changed significantly and is now more consistent across solvers.

Monte-Carlo Solver (mcsolve):

  • The system, H, may now be a super-operator.
  • The seed parameter now supports supplying numpy SeedSequence or Generator types.
  • The new timeout and target_tol parameters allow the solver to exit early if a timeout or target tolerance is reached.
  • The ntraj option no longer supports a list of numbers of trajectories. Instead, just run the solver multiple times and use the class MCSolver if setting up the solver uses a significant amount of time.
  • The map_func parameter has been replaced by the map option.
  • A loky based parallel map as been added.
  • A mpi based parallel map as been added.
  • The result returned by mcsolve now supports calculating photocurrents and calculating the steady state over N trajectories.
  • The old parfor parallel execution function has been removed from qutip.parallel. Use parallel_map, loky_map or mpi_pmap instead.
  • Added improved sampling options which converge much faster when the probability of collapse is small.

Non Markovian Monte-Carlo Solver (nm_mcsolve):

  • New Monte-Carlo Solver supporting negative decay rates.
  • Based on the influence martingale approach, Donvil et al., Nat Commun 13, 4140 (2022).
  • Most of the improvements made to the regular Monte-Carlo solver are also available here.
  • The value of the influence martingale is available through the .trace attribute of the result.

Stochastic Equation Solvers (ssesolve, smesolve)

  • Function call greatly changed: many keyword arguments are now options.
  • m_ops and dW_factors are now changed from the default from the new class interface only.
  • Use the same parallel maps as mcsolve: support for loky and mpi map added.
  • End conditions timeout and target_tol added.
  • The seed parameter now supports supplying numpy SeedSequence.
  • Wiener function is now available as a feedback.

Bloch-Redfield Master Equation Solver (brmesolve):

  • The a_ops and spectra support implementations been heavily reworked to reuse the techniques from the new Coefficient and QobjEvo classes.
  • The use_secular parameter has been removed. Use sec_cutoff=-1 instead.
  • The required tolerance is now read from qutip.settings.

Krylov Subspace Solver (krylovsolve):

  • The Krylov solver is now implemented using SESolver and the krylov ODE integrator. The function krylovsolve is maintained for convenience and now supports many more options.
  • The sparse parameter has been removed. Supply a sparse Qobj for the Hamiltonian instead.

Floquet Solver (fsesolve and fmmesolve):

  • The Floquet solver has been rewritten to use a new FloquetBasis class which manages the transformations from lab to Floquet basis and back.
  • Many of the internal methods used by the old Floquet solvers have been removed. The Floquet tensor may still be retried using the function floquet_tensor.
  • The Floquet Markov Master Equation solver has had many changes and new options added. The environment temperature may be specified using w_th, and the result states are stored in the lab basis and optionally in the Floquet basis using store_floquet_state.
  • The spectra functions supplied to fmmesolve must now be vectorized (i.e. accept and return numpy arrays for frequencies and densities) and must accept negative frequence (i.e. usually include a w > 0 factor so that the returned densities are zero for negative frequencies).
  • The number of sidebands to keep, kmax may only be supplied when using the FMESolver
  • The Tsteps parameter has been removed from both fsesolve and fmmesolve. The precompute option to FloquetBasis may be used instead.

Evolution of State Solver (essovle):

  • The function essolve has been removed. Use the diag integration method with sesolve or mesolve instead.

Steady-state solvers (steadystate module):

  • The method parameter and solver parameters have been separated. Previously they were mixed together in the method parameter.
  • The previous options are now passed as parameters to the steady state solver and mostly passed through to the underlying SciPy functions.
  • The logging and statistics have been removed.

Correlation functions (correlation module):

  • A new correlation_3op function has been added. It supports MESolver or BRMESolver.
  • The correlation, correlation_4op, and correlation_ss functions have been removed.
  • Support for calculating correlation with mcsolve has been removed.

Propagators (propagator module):

  • A class interface, qutip.Propagator, has been added for propagators.
  • Propagation of time-dependent systems is now supported using QobjEvo.
  • The unitary_mode and parallel options have been removed.

Correlation spectra (spectrum module):

  • The functions spectrum_ss and spectrum_pi have been removed and are now internal functions.
  • The use_pinv parameter for spectrum has been removed and the functionality merged into the solver parameter. Use solver="pi" instead.

Hierarchical Equation of Motion Solver (HEOM)

  • Updated the solver to use the new QuTiP integrators and data layer.
  • Updated all the HEOM tutorials to QuTiP 5.
  • Added support for combining bosonic and fermionic baths.
  • Sped up the construction of the RHS of the HEOM solver by a factor of 4x.
  • As in QuTiP 4, the HEOM supports arbitrary spectral densities, bosonic and fermionic baths, Páde and Matsubara expansions of the correlation functions, calculating the Matsubara terminator and inspection of the ADOs (auxiliary density operators).

QuTiP core

There have been numerous other small changes to core QuTiP features:

  • qft(...) the function that returns the quantum Fourier transform operator was moved from qutip.qip.algorithm into qutip.
  • The Bloch-Redfield solver tensor, brtensor, has been moved into qutip.core. See the section above on the Bloch-Redfield solver for details.
  • The functions mat2vec and vec2mat for transforming states to and from super-operator states have been renamed to stack_columns and unstack_columns.
  • The function liouvillian_ref has been removed. Used liouvillian instead.
  • The superoperator transforms super_to_choi, choi_to_super, choi_to_kraus, choi_to_chi and chi_to_choi have been removed. Used to_choi, to_super, to_kraus and to_chi instead.
  • All of the random object creation functions now accepted a numpy Generator as a seed.
  • The dims parameter of all random object creation functions has been removed. Supply the dimensions as the first parameter if explicit dimensions are required.
  • The function rand_unitary_haar has been removed. Use rand_unitary(distribution="haar") instead.
  • The functions rand_dm_hs and rand_dm_ginibre have been removed. Use rand_dm(distribution="hs") and rand_dm(distribution="ginibre") instead.
  • The function rand_ket_haar has been removed. Use rand_ket(distribution="haar") instead.
  • The measurement functions have had the target parameter for expanding the measurement operator removed. Used expand_operator to expand the operator instead.
  • qutip.Bloch now supports applying colours per-point, state or vector in add_point, add_states, and add_vectors.
  • Dimensions use a class instead of layered lists.
  • Allow measurement functions to support degenerate operators.
  • Add qeye_like and qzero_like.
  • Added fermionic annihilation and creation operators.

QuTiP settings

Previously qutip.settings was an ordinary module. Now qutip.settings is an instance of a settings class. All the runtime modifiable settings for core operations are in qutip.settings.core. The other settings are not modifiable at runtime.

  • Removed load. reset and save functions.
  • Removed .debug, .fortran, .openmp_thresh.
  • New .compile stores the compilation options for compiled coefficients.
  • New .core["rtol"] core option gives the default relative tolerance used by QuTiP.
  • The absolute tolerance setting .atol has been moved to .core["atol"].

Visualization

  • Added arguments to plot_wigner and plot_wigner_fock_distribution to specify parameters for wigner.
  • Removed Bloch3D. The same functionality is provided by Bloch.
  • Added fig, ax and cmap keyword arguments to all visualization functions.
  • Most visualization functions now respect the colorblind_safe setting.
  • Added new functions to create animations from a list of Qobj or directly from solver results with saved states.

Package reorganization

  • qutip.qip has been moved into its own package, qutip-qip. Once installed, qutip-qip is available as either qutip.qip or qutip_qip. Some widely useful gates have been retained in qutip.gates.
  • qutip.control has been moved to qutip-qtrl and once installed qutip-qtrl is available as either qutip.control or qutip_qtrl. Note that quitp_qtrl is provided primarily for backwards compatibility. Improvements to optimal control will take place in the new qutip_qoc package.
  • qutip.lattice has been moved into its own package, qutip-lattice. It is available from <https://github.com/qutip/qutip-lattice>.
  • qutip.sparse has been removed. It contained the old sparse matrix representation and is replaced by the new implementation in qutip.data.
  • qutip.piqs functions are no longer available from the qutip namespace. They are accessible from qutip.piqs instead.

Miscellaneous

  • Support has been added for 64-bit integer sparse matrix indices, allowing sparse matrices with up to 2**63 rows and columns. This support needs to be enabled at compilation time by calling setup.py and passing --with-idxint-64.

Feature removals

  • Support for OpenMP has been removed. If there is enough demand and a good plan for how to organize it, OpenMP support may return in a future QuTiP release.
  • The qutip.parfor function has been removed. Use qutip.parallel_map instead.
  • qutip.graph has been removed and replaced by SciPy's graph functions.
  • qutip.topology has been removed. It contained only one function berry_curvature.
  • The ~/.qutip/qutiprc config file is no longer supported. It contained settings for the OpenMP support.
  • Deprecate three_level_atom
  • Deprecate orbital

Changes from QuTiP 5.0.0b1:

Features

  • Add dtype to printed ouput of qobj (#2352 by Rochisha Agarwal)

Miscellaneous

  • Allow scipy 1.12 to be used with qutip. (#2354 by Pieter Eendebak)

v5.0.0b1

2 months ago

Features

  • Create a Dimension class (#1996)
  • Add arguments of plot_wigner() and plot_wigner_fock_distribution() to specify parameters for wigner(). (#2057, by Kosuke Mizuno)
  • Restore feedback to solvers (#2210)
  • Added mpi_pmap, which uses the mpi4py module to run computations in parallel through the MPI interface. (#2296, by Paul)
  • Only pre-compute density matrices if keep_runs_results is False (#2303, by Matt Ord)

Bug Fixes

  • Add the possibility to customize point colors as in V4 and fix point plot behavior for 'l' style (#1974, by Daniel Moreno Galán)
  • Disabled broken "improved sampling" for nm_mcsolve. (#2234, by Paul)
  • Fixed result objects storing a reference to the solver through options._feedback. (#2262, by Paul)
  • Fixed simdiag not returning orthonormal eigenvectors. (#2269, by Sola85)
  • Fix LaTeX display of Qobj state in Jupyter cell outputs (#2272, by Edward Thomas)
  • Improved behavior of parallel_map and loky_pmap in the case of timeouts, errors or keyboard interrupts (#2280, by Paul)
  • Ignore deprecation warnings from cython 0.29.X in tests. (#2288)
  • Fixed two problems with the steady_state() solver in the HEOM method. (#2333)

Miscellaneous

  • Improve fidelity doc-string (#2257)
  • Improve documentation in guide/dynamics (#2271)
  • Improve states and operator parameters documentation. (#2289)
  • Rework kraus_to_choi making it faster (#2284, by Bogdan Reznychenko)
  • Remove Bloch3D: redundant to Bloch (#2306)
  • Allow tests to run without matplotlib and ipython. (#2311)
  • Add too small step warnings in fixed dt SODE solver (#2313)
  • Add dtype to Qobj and QobjEvo (#2325)
  • Fix typos in expect documentation (#2331, by gabbence95)
  • Allow measurement functions to support degenerate operators. (#2342)

v4.7.5

3 months ago

The is a patch for QuTiP 4.7.X to support scipy 1.12.

Bug Fixes

  • Remove use of scipy. in parallel.py, incompatible with scipy==1.12 (#2305 by Evan McKinney)

v4.7.4

3 months ago

This is a bugfix release for QuTiP 4.7.X.

Bug Fixes

  • Adapt to deprecation from matplotlib 3.8 (#2243, reported by Bogdan Reznychenko)
  • Fix name of temp files for removal after use. (#2251, reported by Qile Su)
  • Avoid integer overflow in Qobj creation. (#2252, reported by KianHwee-Lim)
  • Ignore DeprecationWarning from pyximport (#2287)
  • Add partial support and tests for python 3.12. (#2294)

Miscellaneous

  • Rework choi_to_kraus, making it rely on an eigenstates solver that can choose eigh if the Choi matrix is Hermitian, as it is more numerically stable. (#2276, by Bogdan Reznychenko)
  • Rework kraus_to_choi, making it faster (#2283, by Bogdan Reznychenko and Rafael Haenel)

v5.0.0a2

8 months ago

This is a pre-release.

Continuation of the QuTiP 5 redesign.

It include fixing bugs and polishing features introduced in the alpha 1 release, updated stochastic solvers, a new solver: nm_mcsolve and animation functions.

Features

  • Add support for different spectra types for bloch_redfield_tensor (#1951)
  • Improve qutip import times by setting logger names explicitly. (#1981, by Pieter Eendebak)
  • Change the order of parameters in expand_operator (#1991)
  • Add svn and solve to dispatched (#2002)
  • Added nm_mcsolve to provide support for Monte-Carlo simulations of master equations with possibly negative rates. The method implemented here is described in arXiv:2209.08958 [quant-ph]. (#2070 by pmenczel)
  • Add support for combining bosinic and fermionic HEOM baths (#2089)
  • Added __repr__ to QobjEvo (#2111 by lklivingstone)
  • Improve print(qutip.settings) by make it shorter (#2113 by tamakoshi2001)
  • Create the trace_oper_ket operation (#2126)
  • Speed up the construction of the RHS of the HEOM solver by a factor of 4x by converting the final step to Cython. (#2128)
  • Rewrite the stochastic solver to use the v5 solver interface. (#2131)
  • Add Qobj.data_as to extract underlying data in original format. (#2141)
  • Add qeye_like and qzero_like (#2153)
  • Add capacity to dispatch on Data (#2157)
  • Added fermionic annihilation and creation operators. (#2166 by khnikhil)
  • Changed arguments and applied colorblind_safe to functions in visualization.py (#2170 by Yuji Tamakoshi)
  • Changed arguments and applied colorblind_safe to plot_wigner_sphere and matrix_histogram in visualization.py (#2193 by Yuji Tamakoshi)
  • Added Dia data layer which represents operators as multi-diagonal matrices. (#2196)
  • Added support for animated plots. (#2203 by Yuji Tamakoshi)
  • Improved sampling algorithm for mcsolve (#2218 by Daniel Weiss)
  • Added support for early termination of map functions. (#2222)

Bug Fixes

  • Add missing state transformation to floquet_markov_mesolve (#1952 by christian512)
  • Added default _isherm value (True) for momentum and position operators. (#2032 by Asier Galicia)
  • Changed qutip-notebooks to qutip-tutorials and fixed the typo in the link redirecting to the changelog section in the PR template. (#2107 by Valan Baptist Mathuranayagam)
  • Increase missing colorbar padding for matrix_histogram_complex() from 0 to 0.05. (#2181 by SJUW)
  • Raise error on insufficient memory. (#2224)
  • Fixed fallback to fsesolve call in fmmesolve (#2225)

Removals

  • Remove qutip.control and replace with qutip_qtrl. (#2116)
  • Deleted _solve in countstat.py and used _data.solve. (#2120 by Yuji Tamakoshi)
  • Deprecate three_level_atom (#2221)
  • Deprecate orbital (#2223)

Documentation

  • Add a guide on Superoperators, Pauli Basis and Channel Contraction. (#1984 by christian512)
  • Added information on sec_cutoff to the documentation (#2136 by Gerardo Jose Suarez)
  • Added inherited members to API doc of MESolver, SMESolver, SSESolver, NonMarkovianMCSolver (#2167 by Cristian Emiliano Godinez Ramirez)
  • Corrected grammar in Bloch-Redfield master equation documentation (#2174 by Andrey Rakhubovsky)

Miscellaneous

  • Update scipy version requirement to 1.5+ (#1982 by Pieter Eendebak)
  • Added all to qutip/measurements.py and qutip/core/semidefinite.py (#2103 by Rushiraj Gadhvi)
  • Restore towncrier check (#2105)
  • qutip.ipynbtools.version_table() can now be called without Cython installed (#2110 by Rushiraj Gadhvi)
  • Moved HTMLProgressBar from qutip/ipynbtools.py to qutip/ui/progressbar.py (#2112 by Harsh Khilawala)
  • Added new argument bc_type to take boundary conditions when creating QobjEvo (#2114 by Avatar Srinidhi P V )
  • Remove Windows build warning suppression. (#2119)
  • Optimize dispatcher by dispatching on positional only args. (#2135)
  • Clean semidefinite (#2138)
  • Migrate transfertensor.py to solver (#2142)
  • Add a test for progress_bar (#2150)
  • Enable cython 3 (#2151)
  • Added tests for visualization.py (#2192 by Yuji Tamakoshi)
  • Sorted arguments of sphereplot so that the order is similar to those of plot_spin_distribution (#2219 by Yuji Tamakoshi)

v4.7.3

8 months ago

This is a bugfix release for QuTiP 4.7.X.

Bug Fixes

  • Non-oper qobj + scalar raise an error. (#2208 reported by vikramkashyap)
  • Fixed issue where extract_states did not preserve hermiticity. Fixed issue where rand_herm did not set the private attribute _isherm to True. (#2214 by AGaliciaMartinez)
  • ssesolve average states to density matrices (#2216 reported by BenjaminDAnjou)

Miscellaneous

  • Exclude cython 3.0.0 from requirement (#2204)
  • Run in no cython mode with cython >=3.0.0 (#2207)

v4.7.2

10 months ago

This is a bugfix release for QuTiP 4.7.X. It adds support for numpy 1.25 and scipy 1.11.

Bug Fixes

  • Fix setting of sso.m_ops in heterodyne smesolver and passing through of sc_ops to photocurrent solver. (#2081 by Bogdan Reznychenko and Simon Cross)
  • Update calls to SciPy eigvalsh and eigsh to pass the range of eigenvalues to return using subset_by_index=. (#2081 by Simon Cross)
  • Fixed bug where some matrices were wrongly found to be hermitian. (#2082 by AGaliciaMartinez)

Miscellaneous

  • Fixed typo in stochastic.py (#2049, by eltociear)
  • ptrace always return density matrix (#2185, issue by udevd)
  • mesolve can support mixed callable and Qobj for e_ops (#2184 issue by balopat)

v5.0.0a1

1 year ago

This is a pre-release.

QuTiP 5 is a redesign of many of the core components of QuTiP (Qobj, QobjEvo, solvers) to make them more consistent and more flexible.

Qobj may now be stored in either sparse or dense representations, and the two may be mixed sensibly as needed. QobjEvo is now used consistently throughout QuTiP, and the implementation has been substantially cleaned up. A new Coefficient class is used to represent the time-dependent factors inside QobjEvo.

The solvers have been rewritten to work well with the new data layer and the concept of Integrators which solve ODEs has been introduced. In future, new data layers may provide their own Integrators specialized to their representation of the underlying data.

Much of the user-facing API of QuTiP remains familiar, but there have had to be many small breaking changes. If we can make changes to easy migrating code from QuTiP 4 to QuTiP 5, please let us know.

Any extensive list of changes follows.

Contributors

QuTiP 5 has been a large effort by many people over the last three years.

In particular:

  • Jake Lishman led the implementation of the new data layer and coefficients.
  • Eric Giguère led the implementation of the new QobjEvo interface and solvers.
  • Boxi Li led the updating of QuTiP's QIP support and the creation of qutip_qip.

Other members of the QuTiP Admin team have been heavily involved in reviewing, testing and designing QuTiP 5:

  • Alexander Pitchford
  • Asier Galicia
  • Nathan Shammah
  • Shahnawaz Ahmed
  • Neill Lambert
  • Simon Cross

Two Google Summer of Code contributors updated the tutorials and benchmarks to QuTiP 5:

Four experimental data layers backends were written either as part of Google Summer of Code or as separate projects. While these are still alpha quality, the helped significantly to test the data layer API:

We have also had many other contributors, whose specific contributions are detailed below:

  • Pieter Eendebak (updated the required SciPy to 1.4+, #1982).
  • Pieter Eendebak (reduced import times by setting logger names, #1981)
  • Xavier Sproken (included C header files in the source distribution, #1971)
  • Christian Staufenbiel (added support for multiple collapse operators to the Floquet solver, #1962)
  • Christian Staufenbiel (fixed the basis used in the Floquet Master Equation solver, #1952)
  • Christian Staufenbiel (allowed the bloch_redfield_tensor function to accept strings and callables for a_ops, #1951)
  • Henrique Silvéro (allowed qutip_qip to be imported as qutip.qip, #1920)
  • Florian Hopfmueller (added a vastly improved implementations of process_fidelity and average_gate_fidelity, #1712, #1748, #1788)
  • Felipe Bivort Haiek (fixed inaccuracy in docstring of the dense implementation of negation, #1608)
  • Rajath Shetty (added support for specifying colors for individual points, vectors and states display by qutip.Bloch, #1335)

Qobj changes

Previously Qobj data was stored in a SciPy-like sparse matrix. Now the representation is flexible. Implementations for dense and sparse formats are included in QuTiP and custom implementations are possible. QuTiP's performance on dense states and operators is significantly improved as a result.

Some highlights:

  • The data is still acessible via the .data attribute, but is now an instance of the underlying data type instead of a SciPy-like sparse matrix. The operations available in qutip.core.data may be used on .data, regardless of the data type.
  • Qobj with different data types may be mixed in arithmetic and other operations. A sensible output type will be automatically determined.
  • The new .to(...) method may be used to convert a Qobj from one data type to another. E.g. .to("dense") will convert to the dense representation and .to("csr") will convert to the sparse type.
  • Many Qobj methods and methods that create Qobj now accepted a dtype parameter that allows the data type of the returned Qobj to specified.
  • The new & operator may be used to obtain the tensor product.
  • The new @ operator may be used to obtain the matrix / operator product. bar @ ket returns a scalar.
  • The new .contract() method will collapse 1D subspaces of the dimensions of the Qobj.
  • The new .logm() method returns the matrix logarithm of an operator.
  • The methods .set_data, .get_data, .extract_state, .eliminate_states, .evaluate and .check_isunitary have been removed.

QobjEvo changes

The QobjEvo type for storing time-dependent quantum objects has been significantly expanded, standardized and extended. The time-dependent coefficients are now represented using a new Coefficient type that may be independently created and manipulated if required.

Some highlights:

  • The .compile() method has been removed. Coefficients specified as strings are automatically compiled if possible and the compilation is cached across different Python runs and instances.
  • Mixing coefficient types within a single Qobj is now supported.
  • Many new attributes were added to QobjEvo for convenience. Examples include .dims, .shape, .superrep and .isconstant.
  • Many old attributes such as .cte, .use_cython, .type, .const, and .coeff_file were removed.
  • A new Spline coefficient supports spline interpolations of different orders. The old Cubic_Spline coefficient has been removed.
  • The new .arguments(...) method allows additional arguments to the underlying coefficient functions to be updated.
  • The _step_func_coeff argument has been replaced by the order parameter. _step_func_coeff=False is equivalent to order=3. _step_func_coeff=True is equivalent to order=0. Higher values of order gives spline interpolations of higher orders.

Solver changes

The solvers in QuTiP have been heavily reworked and standardized. Under the hood solvers now make use of swappable ODE Integrators. Many Integrators are included (see the list below) and custom implementations are possible. Solvers now consistently accept a QobjEvo instance at the Hamiltonian or Liouvillian, or any object which can be passed to the QobjEvo constructor.

A breakdown of highlights follows.

All solvers:

  • Solver options are now supplied in an ordinary Python dict. qutip.Options is deprecated and returns a dict for backwards compatibility.
  • A specific ODE integrator may be selected by supplying a method option.
  • Each solver provides a class interface. Creating an instance of the class allows a solver to be run multiple times for the same system without having to repeatedly reconstruct the right-hand side of the ODE to be integrated.
  • A QobjEvo instance is accepted for most operators, e.g., H, c_ops, e_ops, a_ops.
  • The progress bar is now selected using the progress_bar option. A new progess bar using the tqdm Python library is provided.
  • Dynamic arguments, where the value of an operator depends on the current state of the evolution, have been removed. They may be re-implemented later if there is demand for them.

Integrators:

  • The SciPy zvode integrator is available with the BDF and Adams methods as bdf and adams.
  • The SciPy dop853 integrator (an eighth order Runge-Kutta method by Dormand & Prince) is available as dop853.
  • The SciPy lsoda integrator is available as lsoda.
  • QuTiP's own implementation of Verner's "most efficient" Runge-Kutta methods of order 7 and 9 are available as vern7 and vern9. See http://people.math.sfu.ca/~jverner/ for a description of the methods.
  • QuTiP's own implementation of a solver that directly diagonalizes the the system to be integrated is available as diag. It only works on time-independent systems and is slow to setup, but once the diagonalization is complete, it generates solutions very quickly.
  • QuTiP's own implementatoin of an approximate Krylov subspace integrator is available as krylov. This integrator is only usable with sesolve.

Result class:

  • A new .e_data attribute provides expectation values as a dictionary. Unlike .expect, the values are provided in a Python list rather than a numpy array, which better supports non-numeric types.
  • The contents of the .stats attribute changed significantly and is now more consistent across solvers.

Monte-Carlo Solver (mcsolve):

  • The system, H, may now be a super-operator.
  • The seed parameter now supports supplying numpy SeedSequence or Generator types.
  • The new timeout and target_tol parameters allow the solver to exit early if a timeout or target tolerance is reached.
  • The ntraj option no longer supports a list of numbers of trajectories. Instead, just run the solver multiple times and use the class MCSolver if setting up the solver uses a significant amount of time.
  • The map_func parameter has been replaced by the map option. In addition to the existing serial and parallel values, the value loky may be supplied to use the loky package to parallelize trajectories.
  • The result returned by mcsolve now supports calculating photocurrents and calculating the steady state over N trajectories.
  • The old parfor parallel execution function has been removed from qutip.parallel. Use parallel_map or loky_map instead.

Bloch-Redfield Master Equation Solver (brmesolve):

  • The a_ops and spectra support implementaitons been heavily reworked to reuse the techniques from the new Coefficient and QobjEvo classes.
  • The use_secular parameter has been removed. Use sec_cutoff=-1 instead.
  • The required tolerance is now read from qutip.settings.

Krylov Subspace Solver (krylovsolve):

  • The Krylov solver is now implemented using SESolver and the krylov ODE integrator. The function krylovsolve is maintained for convenience and now supports many more options.
  • The sparse parameter has been removed. Supply a sparse Qobj for the Hamiltonian instead.

Floquet Solver (fsesolve and fmmesolve):

  • The Floquet solver has been rewritten to use a new FloquetBasis class which manages the transformations from lab to Floquet basis and back.
  • Many of the internal methods used by the old Floquet solvers have been removed. The Floquet tensor may still be retried using the function floquet_tensor.
  • The Floquet Markov Master Equation solver has had many changes and new options added. The environment temperature may be specified using w_th, and the result states are stored in the lab basis and optionally in the Floquet basis using store_floquet_state.
  • The spectra functions supplied to fmmesolve must now be vectorized (i.e. accept and return numpy arrays for frequencies and densities) and must accept negative frequence (i.e. usually include a w > 0 factor so that the returned densities are zero for negative frequencies).
  • The number of sidebands to keep, kmax may only be supplied when using the FMESolver
  • The Tsteps parameter has been removed from both fsesolve and fmmesolve. The precompute option to FloquetBasis may be used instead.

Evolution of State Solver (essovle):

  • The function essolve has been removed. Use the diag integration method with sesolve or mesolve instead.

Steady-state solvers (steadystate module):

  • The method parameter and solver parameters have been separated. Previously they were mixed together in the method parameter.
  • The previous options are now passed as parameters to the steady state solver and mostly passed through to the underlying SciPy functions.
  • The logging and statistics have been removed.

Correlation functions (correlation module):

  • A new correlation_3op function has been added. It supports MESolver or BRMESolver.
  • The correlation, correlation_4op, and correlation_ss functions have been removed.
  • Support for calculating correlation with mcsolve has been removed.

Propagators (propagator module):

  • A class interface, qutip.Propagator, has been added for propagators.
  • Propagation of time-dependent systems is now supported using QobjEvo.
  • The unitary_mode and parallel options have been removed.

Correlation spectra (spectrum module):

  • The functions spectrum_ss and spectrum_pi have been removed and are now internal functions.
  • The use_pinv parameter for spectrum has been removed and the functionality merged into the solver parameter. Use solver="pi" instead.

QuTiP core

There have been numerous other small changes to core QuTiP features:

  • qft(...) the function that returns the quantum Fourier transform operator was moved from qutip.qip.algorithm into qutip.
  • The Bloch-Redfield solver tensor, brtensor, has been moved into qutip.core. See the section above on the Bloch-Redfield solver for details.
  • The functions mat2vec and vec2mat for transforming states to and from super-operator states have been renamed to stack_columns and unstack_columns.
  • The function liouvillian_ref has been removed. Used liouvillian instead.
  • The superoperator transforms super_to_choi, choi_to_super, choi_to_kraus, choi_to_chi and chi_to_choi have been removed. Used to_choi, to_super, to_kraus and to_chi instead.
  • All of the random object creation functions now accepted a numpy Generator as a seed.
  • The dims parameter of all random object creation functions has been removed. Supply the dimensions as the first parameter if explicit dimensions are required.
  • The function rand_unitary_haar has been removed. Use rand_unitary(distribution="haar") instead.
  • The functions rand_dm_hs and rand_dm_ginibre have been removed. Use rand_dm(distribution="hs") and rand_dm(distribution="ginibre") instead.
  • The function rand_ket_haar has been removed. Use rand_ket(distribution="haar") instead.
  • The measurement functions have had the target parameter for expanding the measurement operator removed. Used expand_operator to expand the operator instead.
  • qutip.Bloch now supports applying colours per-point, state or vector in add_point, add_states, and add_vectors.

QuTiP settings

Previously qutip.settings was an ordinary module. Now qutip.settings is an instance of a settings class. All the runtime modifiable settings for core operations are in qutip.settings.core. The other settings are not modifiable at runtime.

  • Removed load. reset and save functions.
  • Removed .debug, .fortran, .openmp_thresh.
  • New .compile stores the compilation options for compiled coefficients.
  • New .core["rtol"] core option gives the default relative tolerance used by QuTiP.
  • The absolute tolerance setting .atol has been moved to .core["atol"].

Package reorganization

  • qutip.qip has been moved into its own package, qutip-qip. Once installed, qutip-qip is available as either qutip.qip or qutip_qip. Some widely useful gates have been retained in qutip.gates.
  • qutip.lattice has been moved into its own package, qutip-lattice. It is available from <https://github.com/qutip/qutip-lattice>.
  • qutip.sparse has been removed. It contained the old sparse matrix representation and is replaced by the new implementation in qutip.data.
  • qutip.piqs functions are no longer available from the qutip namespace. They are accessible from qutip.piqs instead.

Miscellaneous

  • Support has been added for 64-bit integer sparse matrix indices, allowing sparse matrices with up to 2**63 rows and columns. This support needs to be enabled at compilation time by calling setup.py and passing --with-idxint-64.

Feature removals

  • Support for OpenMP has been removed. If there is enough demand and a good plan for how to organize it, OpenMP support may return in a future QuTiP release.
  • The qutip.parfor function has been removed. Use qutip.parallel_map instead.
  • qutip.graph has been removed and replaced by SciPy's graph functions.
  • qutip.topology has been removed. It contained only one function berry_curvature.
  • The ~/.qutip/qutiprc config file is no longer supported. It contained settings for the OpenMP support.