Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weighted trajectories #2369

Merged
merged 31 commits into from
May 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
0994713
WIP commit: weighted trajectories
pmenczel Mar 24, 2024
4f86221
Merge branch 'multitraj-improvements' into weighted-trajectories
pmenczel Mar 24, 2024
1ea5a12
WIP commit 2: weighted trajectories
pmenczel Mar 24, 2024
80ec47f
Merge branch 'multitraj-improvements' into weighted-trajectories
pmenczel Mar 25, 2024
b85af2e
Weighted trajectories
pmenczel Mar 28, 2024
4b81f97
Small fixes
pmenczel Mar 29, 2024
e65d497
Merge branch 'qutip:master' into weighted-trajectories
pmenczel Mar 29, 2024
4a79860
More small fixes
pmenczel Mar 29, 2024
24c7952
Code formatting
pmenczel Mar 29, 2024
ab87d6f
Suggestions from code review
pmenczel Apr 1, 2024
ada5c04
photocurrent with weights
pmenczel Apr 1, 2024
66c2ce6
Removed photocurrent from nm_mcsolve tests
pmenczel Apr 1, 2024
b059661
Revert stochastic solvers to Result instead of TrajectoryResult
pmenczel Apr 1, 2024
b7eadd7
Towncrier entry
pmenczel Apr 1, 2024
fedb376
Merging results with weighted trajectories, and mcsolve and nm_mcsolv…
pmenczel Apr 1, 2024
f643fdf
Remove unnecessary fields
pmenczel Apr 3, 2024
d048fef
Moved runs_weights to MultiTrajResult
pmenczel Apr 3, 2024
ba9071b
Updated target tolerance calculation for weighted traj
pmenczel Apr 3, 2024
95caad4
Started adding tests
pmenczel Apr 3, 2024
f4585e8
Added tests for merging multi trajectory results / mcresults / nmmcre…
pmenczel Apr 4, 2024
e60e283
Added improved sampling to nmmcsolve tests
pmenczel Apr 4, 2024
283e060
Fix typo in mcsolve test
pmenczel Apr 4, 2024
5fabdd3
Performance improvement
pmenczel Apr 4, 2024
64b5251
Merge remote-tracking branch 'upstream/master' into weighted-trajecto…
pmenczel Apr 18, 2024
9208fea
Fixed target tolerance calculation
pmenczel Apr 18, 2024
3f774b2
Merge remote-tracking branch 'upstream/master' into weighted-trajecto…
pmenczel Apr 25, 2024
7f72b23
Merge branch 'qutip:master' into weighted-trajectories
pmenczel May 3, 2024
18a75b9
Created multitrajresult module
pmenczel May 6, 2024
bf604c3
Documentation for _TrajectorySum class
pmenczel May 6, 2024
c48b550
Updated nmmcsolve guide and fixed broken links
pmenczel May 6, 2024
cd96a59
Don't fix random seed in test
pmenczel May 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 9 additions & 7 deletions doc/apidoc/classes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -231,20 +231,22 @@ Solver Options and Results
:inherited-members:
:exclude-members: add_processor, add

.. autoclass:: qutip.solver.result.MultiTrajResult
.. autoclass:: qutip.solver.multitrajresult.MultiTrajResult
:members:
:inherited-members:
:exclude-members: add_processor, add, add_end_condition

.. autoclass:: qutip.solver.result.McResult
.. autoclass:: qutip.solver.result.TrajectoryResult
:show-inheritance:
:members:
:inherited-members:
:exclude-members: add_processor, add, add_end_condition

.. autoclass:: qutip.solver.result.NmmcResult
.. autoclass:: qutip.solver.multitrajresult.McResult
:show-inheritance:
:members:

.. autoclass:: qutip.solver.multitrajresult.NmmcResult
:show-inheritance:
:members:
:inherited-members:
:exclude-members: add_processor, add, add_end_condition

.. _classes-piqs:

Expand Down
1 change: 1 addition & 0 deletions doc/changes/2369.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Weighted trajectories in trajectory solvers (enables improved sampling for nm_mcsolve)
12 changes: 6 additions & 6 deletions doc/guide/dynamics/dynamics-intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ quantum systems and indicates the type of object returned by the solver:
* - Monte Carlo evolution
- :func:`~qutip.solver.mcsolve.mcsolve`
- :obj:`~qutip.solver.mcsolve.MCSolver`
- :obj:`~qutip.solver.result.McResult`
- :obj:`~qutip.solver.multitrajresult.McResult`
* - Non-Markovian Monte Carlo
- :func:`~qutip.solver.nm_mcsolve.nm_mcsolve`
- :obj:`~qutip.solver.nm_mcsolve.NonMarkovianMCSolver`
- :obj:`~qutip.solver.result.NmmcResult`
- :obj:`~qutip.solver.multitrajresult.NmmcResult`
* - Bloch-Redfield master equation
- :func:`~qutip.solver.mesolve.brmesolve`
- :obj:`~qutip.solver.mesolve.BRSolver`
- :func:`~qutip.solver.brmesolve.brmesolve`
- :obj:`~qutip.solver.brmesolve.BRSolver`
- :obj:`~qutip.solver.result.Result`
* - Floquet-Markov master equation
- :func:`~qutip.solver.floquet.fmmesolve`
Expand All @@ -61,11 +61,11 @@ quantum systems and indicates the type of object returned by the solver:
* - Stochastic Schrödinger equation
- :func:`~qutip.solver.stochastic.ssesolve`
- :obj:`~qutip.solver.stochastic.SSESolver`
- :obj:`~qutip.solver.result.MultiTrajResult`
- :obj:`~qutip.solver.multitrajresult.MultiTrajResult`
* - Stochastic master equation
- :func:`~qutip.solver.stochastic.smesolve`
- :obj:`~qutip.solver.stochastic.SMESolver`
- :obj:`~qutip.solver.result.MultiTrajResult`
- :obj:`~qutip.solver.multitrajresult.MultiTrajResult`
* - Transfer Tensor Method time-evolution
- :func:`~qutip.solver.nonmarkov.transfertensor.ttmsolve`
- None
Expand Down
6 changes: 5 additions & 1 deletion doc/guide/dynamics/dynamics-nmmonte.rst
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ associated jump rates :math:`\Gamma_n(t)\geq0` appropriate for simulation.
We conclude with a simple example demonstrating the usage of the ``nm_mcsolve``
function. For more elaborate, physically motivated examples, we refer to the
`accompanying tutorial notebook <https://github.com/qutip/qutip-tutorials/blob/main/tutorials-v5/time-evolution/013_nonmarkovian_monte_carlo.md>`_.
Note that the example also demonstrates the usage of the ``improved_sampling``
option (which is explained in the guide for the
:ref:`Monte Carlo Solver<monte>`) in ``nm_mcsolve``.


.. plot::
Expand All @@ -98,10 +101,11 @@ function. For more elaborate, physically motivated examples, we refer to the
ops_and_rates = []
ops_and_rates.append([a0.dag(), gamma1])
ops_and_rates.append([a0, gamma2])
nm_options = {'map': 'parallel', 'improved_sampling': True}
MCSol = nm_mcsolve(H, psi0, times, ops_and_rates,
args={'kappa': 1.0 / 0.129, 'nth': 0.063},
e_ops=[a0.dag() * a0, a0 * a0.dag()],
options={'map': 'parallel'}, ntraj=2500)
options=nm_options, ntraj=2500)

# mesolve integration for comparison
d_ops = [[lindblad_dissipator(a0.dag(), a0.dag()), gamma1],
Expand Down
1 change: 1 addition & 0 deletions qutip/solver/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .result import *
from .multitrajresult import *
from .options import *
import qutip.solver.integrator as integrator
from .integrator import IntegratorException
Expand Down
31 changes: 12 additions & 19 deletions qutip/solver/mcsolve.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from ..core import QobjEvo, spre, spost, Qobj, unstack_columns
from .multitraj import MultiTrajSolver, _MultiTrajRHS
from .solver_base import Solver, Integrator, _solver_deprecation
from .result import McResult, McTrajectoryResult, McResultImprovedSampling
from .multitrajresult import McResult
from .mesolve import mesolve, MESolver
from ._feedback import _QobjFeedback, _DataFeedback, _CollapseFeedback
import qutip.core.data as _data
Expand Down Expand Up @@ -401,7 +401,7 @@ class MCSolver(MultiTrajSolver):
Options for the evolution.
"""
name = "mcsolve"
_trajectory_resultclass = McTrajectoryResult
_resultclass = McResult
_mc_integrator_class = MCIntegrator
solver_options = {
"progress_bar": "text",
Expand Down Expand Up @@ -480,6 +480,9 @@ def _run_one_traj(self, seed, state, tlist, e_ops, **integrator_kwargs):
"""
seed, result = super()._run_one_traj(seed, state, tlist, e_ops,
**integrator_kwargs)
jump_prob_floor = integrator_kwargs.get('jump_prob_floor', 0)
if jump_prob_floor > 0:
result.add_relative_weight(1 - jump_prob_floor)
result.collapse = self._integrator.collapses
return seed, result

Expand All @@ -488,26 +491,23 @@ def run(self, state, tlist, ntraj=1, *,
# Overridden to sample the no-jump trajectory first. Then, the no-jump
# probability is used as a lower-bound for random numbers in future
# monte carlo runs
if not self.options.get("improved_sampling", False):
if not self.options["improved_sampling"]:
return super().run(state, tlist, ntraj=ntraj, args=args,
e_ops=e_ops, timeout=timeout,
target_tol=target_tol, seeds=seeds)
stats, seeds, result, map_func, map_kw, state0 = self._initialize_run(
state,
ntraj,
args=args,
e_ops=e_ops,
timeout=timeout,
target_tol=target_tol,
seeds=seeds,

seeds, result, map_func, map_kw, state0 = self._initialize_run(
state, ntraj, args=args, e_ops=e_ops,
timeout=timeout, target_tol=target_tol, seeds=seeds
)

# first run the no-jump trajectory
start_time = time()
seed0, no_jump_result = self._run_one_traj(seeds[0], state0, tlist,
e_ops, no_jump=True)
_, state, _ = self._integrator.get_state(copy=False)
no_jump_prob = self._integrator._prob_func(state)
result.no_jump_prob = no_jump_prob
no_jump_result.add_absolute_weight(no_jump_prob)
result.add((seed0, no_jump_result))
result.stats['no jump run time'] = time() - start_time

Expand Down Expand Up @@ -542,13 +542,6 @@ def _get_integrator(self):
self._init_integrator_time = time() - _time_start
return mc_integrator

@property
def _resultclass(self):
if self.options.get("improved_sampling", False):
return McResultImprovedSampling
else:
return McResult

@property
def options(self):
"""
Expand Down
9 changes: 5 additions & 4 deletions qutip/solver/multitraj.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .result import Result, MultiTrajResult
from .result import TrajectoryResult
from .multitrajresult import MultiTrajResult
from .parallel import _get_map
from time import time
from .solver_base import Solver
Expand Down Expand Up @@ -50,7 +51,7 @@ class MultiTrajSolver(Solver):
"""
name = "generic multi trajectory"
_resultclass = MultiTrajResult
_trajectory_resultclass = Result
_trajectory_resultclass = TrajectoryResult
_avail_integrators = {}

# Class of option used by the solver
Expand Down Expand Up @@ -148,7 +149,7 @@ def _initialize_run(self, state, ntraj=1, args=None, e_ops=(),
})
state0 = self._prepare_state(state)
stats['preparation time'] += time() - start_time
return stats, seeds, result, map_func, map_kw, state0
return seeds, result, map_func, map_kw, state0

def run(self, state, tlist, ntraj=1, *,
args=None, e_ops=(), timeout=None, target_tol=None, seeds=None):
Expand Down Expand Up @@ -211,7 +212,7 @@ def run(self, state, tlist, ntraj=1, *,
The simulation will end when the first end condition is reached
between ``ntraj``, ``timeout`` and ``target_tol``.
"""
stats, seeds, result, map_func, map_kw, state0 = self._initialize_run(
seeds, result, map_func, map_kw, state0 = self._initialize_run(
state,
ntraj,
args=args,
Expand Down