westpa 2022.8__cp311-cp311-macosx_10_9_x86_64.whl → 2022.10__cp311-cp311-macosx_10_9_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of westpa might be problematic. Click here for more details.

westpa/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-04-15T22:37:00-0400",
11
+ "date": "2024-05-30T14:33:52-0400",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "587296bd42835960dc67dc3e91ead8f4dd2c6d97",
15
- "version": "2022.08"
14
+ "full-revisionid": "40fe71e4e393b47e0a231b178add25696e469405",
15
+ "version": "2022.10"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
westpa/analysis/core.py CHANGED
@@ -298,8 +298,8 @@ class Iteration:
298
298
  def basis_state_summaries(self):
299
299
  """pd.DataFrame: Basis state summary data."""
300
300
  df = pd.DataFrame(self.h5group['ibstates']['bstate_index'][:])
301
- df['label'] = tostr(df['label'].str)
302
- df['auxref'] = tostr(df['auxref'].str)
301
+ df['label'] = df['label'].str.decode('UTF-8')
302
+ df['auxref'] = df['auxref'].str.decode('UTF-8')
303
303
  return df
304
304
 
305
305
  @property
@@ -325,7 +325,7 @@ class Iteration:
325
325
  """pd.DataFrame or None: Target state summary data."""
326
326
  if self.has_target_states:
327
327
  df = pd.DataFrame(self.h5group['tstates']['index'][:])
328
- df['label'] = tostr(df['label'].str)
328
+ df['label'] = df['label'].str.decode('UTF-8')
329
329
 
330
330
  return df
331
331
  else:
@@ -157,7 +157,7 @@ def initialize(mode, bstates, _bstate_file, tstates, _tstate_file):
157
157
  bstate.probability *= pscale
158
158
 
159
159
  # Assign progress coordinates to basis states
160
- sim_manager.get_bstate_pcoords(basis_states, n_iter)
160
+ sim_manager.get_bstate_pcoords(basis_states)
161
161
  data_manager.create_ibstate_group(basis_states, n_iter)
162
162
  sim_manager.report_basis_states(basis_states)
163
163
 
westpa/cli/tools/w_ipa.py CHANGED
@@ -157,11 +157,11 @@ class WIPI(WESTParallelTool):
157
157
  # print(str(to_hash).encode('base64'))
158
158
  if self.debug_mode:
159
159
  for iarg, arg in enumerate(to_hash):
160
- if not isinstance(arg, list):
161
- print('arg {num:02d} -- {arg:<20}'.format(num=iarg, arg=arg))
162
- else:
160
+ if isinstance(arg, list):
163
161
  for il, l in enumerate(arg):
164
- print('arg {num:02d} -- {arg:<20}'.format(num=il + iarg, arg=l))
162
+ print('arg {num:02d} -- {arg:<20}'.format(num=il + iarg, arg=h5io.tostr(l)))
163
+ else:
164
+ print('arg {num:02d} -- {arg:<20}'.format(num=iarg, arg=h5io.tostr(arg)))
165
165
  # print('args: {}'.format(to_hash))
166
166
  # This SHOULD produce the same output, maybe? That would be nice, anyway.
167
167
  # But we'll need to test it more.
@@ -423,7 +423,10 @@ Command-line options
423
423
  lb, ub = self.data_range[idim]
424
424
  # Advance just beyond the upper bound of the range, so that we catch
425
425
  # the maximum in the histogram
426
- ub *= 1.01
426
+ if ub > 0:
427
+ ub *= 1.01
428
+ else:
429
+ ub /= 1.01
427
430
 
428
431
  boundset = np.linspace(lb, ub, bins + 1)
429
432
  midpoints = (boundset[:-1] + boundset[1:]) / 2.0
@@ -440,7 +443,10 @@ Command-line options
440
443
  lb, ub = self.data_range[idim]
441
444
  # Advance just beyond the upper bound of the range, so that we catch
442
445
  # the maximum in the histogram
443
- ub *= 1.01
446
+ if ub > 0:
447
+ ub *= 1.01
448
+ else:
449
+ ub /= 1.01
444
450
 
445
451
  boundset = np.linspace(lb, ub, bins[idim] + 1)
446
452
  midpoints = (boundset[:-1] + boundset[1:]) / 2.0
westpa/core/_rc.py CHANGED
@@ -1,12 +1,13 @@
1
1
  """WEST run control and configuration routines"""
2
2
 
3
- import errno
4
- import logging
5
3
  import math
6
4
  import os
7
5
  import sys
6
+ import errno
7
+ import logging
8
8
  import warnings
9
9
  from copy import deepcopy
10
+ from datetime import timedelta
10
11
 
11
12
  import numpy as np
12
13
 
@@ -231,6 +232,21 @@ class WESTRC:
231
232
  self.config_logging()
232
233
  self.config['args'] = {k: v for k, v in args.__dict__.items() if not k.startswith('_')}
233
234
  self.process_config()
235
+ self.time_config()
236
+
237
+ def time_config(self):
238
+ '''Convert non-pyYAML accepted time formats into seconds'''
239
+ max_run_wallclock = self.config.get(['west', 'propagation', 'max_run_wallclock'], None)
240
+ if isinstance(max_run_wallclock, str):
241
+ time_formats = ['days', 'hours', 'minutes', 'seconds']
242
+ wallclock_str = max_run_wallclock.split(':')
243
+ kwargs = {key: int(val) for key, val in zip(time_formats[-len(wallclock_str) :], wallclock_str)}
244
+ try:
245
+ diff = int(timedelta(**kwargs).total_seconds())
246
+ self.config['west']['propagation']['max_run_wallclock'] = diff
247
+ log.debug(f'Automatically converted {max_run_wallclock=} to {diff}')
248
+ except ValueError:
249
+ log.debug(f'Failed to convert {max_run_wallclock=} to seconds.')
234
250
 
235
251
  def process_config(self):
236
252
  log.debug('config: {!r}'.format(self.config))
@@ -8,21 +8,161 @@ from os.path import expandvars
8
8
  log = logging.getLogger(__name__)
9
9
 
10
10
 
11
+ class MABBinMapper(FuncBinMapper):
12
+ """
13
+ Adaptively place bins in between minimum and maximum segments along
14
+ the progress coordinte. Extrema and bottleneck segments are assigned
15
+ to their own bins.
16
+
17
+ """
18
+
19
+ def __init__(
20
+ self,
21
+ nbins,
22
+ direction=None,
23
+ skip=None,
24
+ bottleneck=True,
25
+ pca=False,
26
+ mab_log=False,
27
+ bin_log=False,
28
+ bin_log_path="$WEST_SIM_ROOT/binbounds.log",
29
+ ):
30
+ """
31
+ Parameters
32
+ ----------
33
+ nbins : list of int
34
+ List of int for nbins in each dimension.
35
+ direction : Union(list of int, None), default: None
36
+ List of int for 'direction' in each dimension.
37
+ Direction options are as follows:
38
+ 0 : default split at leading and lagging boundaries
39
+ 1 : split at leading boundary only
40
+ -1 : split at lagging boundary only
41
+ 86 : no splitting at either leading or lagging boundary
42
+ skip : Union(list of int, None), default: None
43
+ List of int for each dimension. Default None for skip=0.
44
+ Set to 1 to 'skip' running mab in a dimension.
45
+ bottleneck : bool, default: True
46
+ Whether to turn on or off bottleneck walker splitting.
47
+ pca : bool, default: False
48
+ Can be True or False (default) to run PCA on pcoords before bin assignment.
49
+ mab_log : bool, default: False
50
+ Whether to output mab info to west.log.
51
+ bin_log : bool, default: False
52
+ Whether to output mab bin boundaries to bin_log_path file.
53
+ bin_log_path : str, default: "$WEST_SIM_ROOT/binbounds.log"
54
+ Path to output bin boundaries.
55
+
56
+ """
57
+ # Verifying parameters
58
+ if nbins is None:
59
+ raise ValueError("nbins_per_dim is missing")
60
+ ndim = len(nbins)
61
+
62
+ if direction is None:
63
+ direction = [0] * ndim
64
+ elif len(direction) != ndim:
65
+ direction = [0] * ndim
66
+ log.warning("Direction list is not the correct dimensions, setting to defaults.")
67
+
68
+ if skip is None:
69
+ skip = [0] * ndim
70
+ elif len(skip) != ndim:
71
+ skip = [0] * ndim
72
+ log.warning("Skip list is not the correct dimensions, setting to defaults.")
73
+
74
+ kwargs = dict(
75
+ nbins_per_dim=nbins,
76
+ direction=direction,
77
+ skip=skip,
78
+ bottleneck=bottleneck,
79
+ pca=pca,
80
+ mab_log=mab_log,
81
+ bin_log=bin_log,
82
+ bin_log_path=bin_log_path,
83
+ )
84
+
85
+ n_total_bins = self.determine_total_bins(**kwargs)
86
+
87
+ super().__init__(map_mab, n_total_bins, kwargs=kwargs)
88
+
89
+ def determine_total_bins(self, nbins_per_dim, direction, skip, bottleneck, **kwargs):
90
+ """
91
+ The following is neccessary because functional bin mappers need to "reserve"
92
+ bins and tell the sim manager how many bins they will need to use, this is
93
+ determined by taking all direction/skipping info into account.
94
+
95
+ Parameters
96
+ ----------
97
+ nbins_per_dim : int
98
+ Number of total bins in each direction.
99
+ direction : list of int
100
+ Direction in each dimension. See __init__ for more information.
101
+ skip : list of int
102
+ List of 0s and 1s indicating whether to skip each dimension.
103
+ bottleneck : bool
104
+ Whether to include separate bin for bottleneck walker(s).
105
+ **kwargs : dict
106
+ Arbitary keyword arguments. Contains unneeded MAB parameters.
107
+
108
+ Returns
109
+ -------
110
+ n_total_bins : int
111
+ Number of total bins.
112
+
113
+ """
114
+ n_total_bins = np.prod(nbins_per_dim)
115
+ ndim = len(nbins_per_dim)
116
+ for i in range(ndim):
117
+ if skip[i] == 0:
118
+ if direction[i] != 0:
119
+ n_total_bins += 1 + 1 * bottleneck
120
+ else:
121
+ n_total_bins += 2 + 2 * bottleneck
122
+ else:
123
+ n_total_bins -= nbins_per_dim[i] - 1
124
+ n_total_bins += 1 * ndim # or else it will be one bin short
125
+ return n_total_bins
126
+
127
+
11
128
  def map_mab(coords, mask, output, *args, **kwargs):
12
- '''Binning which adaptively places bins based on the positions of extrema segments and
129
+ """
130
+ Binning which adaptively places bins based on the positions of extrema segments and
13
131
  bottleneck segments, which are where the difference in probability is the greatest
14
132
  along the progress coordinate. Operates per dimension and places a fixed number of
15
133
  evenly spaced bins between the segments with the min and max pcoord values. Extrema and
16
- bottleneck segments are assigned their own bins.'''
17
-
18
- pca = kwargs.get("pca")
19
- bottleneck = kwargs.get("bottleneck")
20
- direction = kwargs.get("direction")
21
- skip = kwargs.get("skip")
134
+ bottleneck segments are assigned their own bins.
135
+
136
+ Parameters
137
+ ----------
138
+ coords : ndarray
139
+ An array with pcoord and weight info.
140
+ mask : ndarray
141
+ Array of 1 (True) and 0 (False), to filter out unwanted segment info.
142
+ output : list
143
+ The main list that, for each segment, holds the bin assignment.
144
+ *args : list
145
+ Variable length arguments.
146
+ **kwargs : dict
147
+ Arbitary keyword arguments. Contains most of the MAB-needed parameters.
148
+
149
+ Returns
150
+ ------
151
+ output : list
152
+ The main list that, for each segment, holds the bin assignment.
153
+
154
+ """
155
+
156
+ # Argument Processing
22
157
  nbins_per_dim = kwargs.get("nbins_per_dim")
23
- mab_log = kwargs.get("mab_log")
24
- bin_log = kwargs.get("bin_log")
25
158
  ndim = len(nbins_per_dim)
159
+ pca = kwargs.get("pca", False)
160
+ bottleneck = kwargs.get("bottleneck", True)
161
+ direction = kwargs.get("direction", ([0] * ndim))
162
+ skip = kwargs.get("skip", ([0] * ndim))
163
+ mab_log = kwargs.get("mab_log", False)
164
+ bin_log = kwargs.get("bin_log", False)
165
+ bin_log_path = kwargs.get("bin_log_path", "$WEST_SIM_ROOT/binbounds.log")
26
166
 
27
167
  if not np.any(mask):
28
168
  return output
@@ -135,12 +275,18 @@ def map_mab(coords, mask, output, *args, **kwargs):
135
275
  # which is two per dimension unless there is a direction specified
136
276
  # in a particluar dimension, then it's just one
137
277
  bottleneck_base = boundary_base
278
+ n_bottleneck_filled = 0
138
279
 
139
280
  for i in range(0, ndim):
140
- if direction[i] != 0:
281
+ # for single direction, 1 boundary walker
282
+ if direction[i] == 1 or direction[i] == -1:
141
283
  bottleneck_base += 1
142
- else:
284
+ # 2 boundary walkers with 0 direction
285
+ elif direction[i] == 0:
143
286
  bottleneck_base += 2
287
+ # for 86 direction, no boundary walkers so offset of 0
288
+ elif direction[i] == 86:
289
+ bottleneck_base += 0
144
290
 
145
291
  # if a dimension is being "skipped", leave only one bin total as
146
292
  # the offset
@@ -167,36 +313,42 @@ def map_mab(coords, mask, output, *args, **kwargs):
167
313
 
168
314
  # assign bottlenecks, taking directionality into account
169
315
  if bottleneck:
170
- if direction[n] < 0:
316
+ if direction[n] == -1:
171
317
  if coord == flipdifflist[n]:
172
318
  holder = bottleneck_base + n
173
319
  special = True
320
+ n_bottleneck_filled += 1
174
321
  break
175
322
 
176
- if direction[n] > 0:
323
+ if direction[n] == 1:
177
324
  if coord == difflist[n]:
178
325
  holder = bottleneck_base + n
179
326
  special = True
327
+ n_bottleneck_filled += 1
180
328
  break
181
329
 
182
- if direction[n] == 0:
330
+ # both directions when using 0 or with
331
+ # special value of 86 for no lead/lag split
332
+ if direction[n] == 0 or direction[n] == 86:
183
333
  if coord == difflist[n]:
184
334
  holder = bottleneck_base + n
185
335
  special = True
336
+ n_bottleneck_filled += 1
186
337
  break
187
338
  elif coord == flipdifflist[n]:
188
339
  holder = bottleneck_base + n + 1
189
340
  special = True
341
+ n_bottleneck_filled += 1
190
342
  break
191
343
 
192
344
  # assign boundary walkers, taking directionality into account
193
- if direction[n] < 0:
345
+ if direction[n] == -1:
194
346
  if coord == minlist[n]:
195
347
  holder = boundary_base + n
196
348
  special = True
197
349
  break
198
350
 
199
- elif direction[n] > 0:
351
+ elif direction[n] == 1:
200
352
  if coord == maxlist[n]:
201
353
  holder = boundary_base + n
202
354
  special = True
@@ -212,6 +364,14 @@ def map_mab(coords, mask, output, *args, **kwargs):
212
364
  special = True
213
365
  break
214
366
 
367
+ # special value for direction with no lead/lag split
368
+ elif direction[n] == 86:
369
+ # westpa.rc.pstatus(f"No lead/lag split for dim {n}")
370
+ # westpa.rc.pflush()
371
+ # nornmally adds to special bin but here just leaving it forever empty
372
+ # holder = boundary_base + n
373
+ break
374
+
215
375
  # the following are for the "linear" portion
216
376
  if not special:
217
377
  for n in range(ndim):
@@ -248,56 +408,20 @@ def map_mab(coords, mask, output, *args, **kwargs):
248
408
 
249
409
  if bin_log and report:
250
410
  if westpa.rc.sim_manager.n_iter:
251
- with open(expandvars("$WEST_SIM_ROOT/binbounds.log"), 'a') as bb_file:
252
- bb_file.write(f'{westpa.rc.sim_manager.n_iter}\n') # Iteration Number
411
+ with open(expandvars(bin_log_path), 'a') as bb_file:
412
+ # Iteration Number
413
+ bb_file.write(f'iteration: {westpa.rc.sim_manager.n_iter}\n')
414
+ bb_file.write('bin boundaries: ')
253
415
  for n in range(ndim):
254
- bb_file.write(f'{np.linspace(minlist[n], maxlist[n], nbins_per_dim[n] + 1)}\t') # Write binbounds per dim
255
- bb_file.write(f'\n{minlist} {maxlist}\n') # Min/Max pcoord
256
- if bottleneck_base > boundary_base:
257
- bb_file.write(f'{flipdifflist} {difflist}\n\n') # Bottlenecks
416
+ # Write binbounds per dim
417
+ bb_file.write(f'{np.linspace(minlist[n], maxlist[n], nbins_per_dim[n] + 1)}\t')
418
+ # Min/Max pcoord
419
+ bb_file.write(f'\nmin/max pcoord: {minlist} {maxlist}\n')
420
+ bb_file.write(f'bottleneck bins: {n_bottleneck_filled}\n')
421
+ if n_bottleneck_filled > 0:
422
+ # Bottlenecks bins exist (passes any of the if bottleneck: checks)
423
+ bb_file.write(f'bottleneck pcoord: {flipdifflist} {difflist}\n\n')
258
424
  else:
259
425
  bb_file.write('\n')
260
426
 
261
427
  return output
262
-
263
-
264
- class MABBinMapper(FuncBinMapper):
265
- '''Adaptively place bins in between minimum and maximum segments along
266
- the progress coordinte. Extrema and bottleneck segments are assigned
267
- to their own bins.'''
268
-
269
- def __init__(self, nbins, direction=None, skip=None, bottleneck=True, pca=False, mab_log=False, bin_log=False):
270
- # Verifying parameters
271
- if nbins is None:
272
- raise ValueError("nbins_per_dim is missing")
273
- ndim = len(nbins)
274
-
275
- if direction is None:
276
- direction = [0] * ndim
277
- elif len(direction) != ndim:
278
- direction = [0] * ndim
279
- log.warning("Direction list is not the correct dimensions, setting to defaults.")
280
-
281
- if skip is None:
282
- skip = [0] * ndim
283
- elif len(skip) != ndim:
284
- skip = [0] * ndim
285
- log.warning("Skip list is not the correct dimensions, setting to defaults.")
286
-
287
- kwargs = dict(
288
- nbins_per_dim=nbins, direction=direction, skip=skip, bottleneck=bottleneck, pca=pca, mab_log=mab_log, bin_log=bin_log
289
- )
290
- # the following is neccessary because functional bin mappers need to "reserve"
291
- # bins and tell the sim manager how many bins they will need to use, this is
292
- # determined by taking all direction/skipping info into account
293
- n_total_bins = np.prod(nbins)
294
- for i in range(0, ndim):
295
- if skip[i] == 0:
296
- if direction[i] != 0:
297
- n_total_bins += 1 + 1 * bottleneck
298
- else:
299
- n_total_bins += 2 + 2 * bottleneck
300
- else:
301
- n_total_bins -= nbins[i] - 1
302
- n_total_bins += 1 * ndim # or else it will be one bin short
303
- super().__init__(map_mab, n_total_bins, kwargs=kwargs)
@@ -11,7 +11,10 @@ log = logging.getLogger(__name__)
11
11
 
12
12
 
13
13
  class MABSimManager(WESimManager):
14
+ '''Subclass of WESimManager, modifying it so bin assignments will be done after all segments are done propagating.'''
15
+
14
16
  def initialize_simulation(self, basis_states, target_states, start_states, segs_per_state=1, suppress_we=False):
17
+ '''Making sure that that the MABBinMapper is not the outer bin.'''
15
18
  if len(target_states) > 0:
16
19
  if isinstance(self.system.bin_mapper, MABBinMapper):
17
20
  log.error("MABBinMapper cannot be an outer binning scheme with a target state\n")
@@ -47,6 +47,7 @@ import posixpath
47
47
  import sys
48
48
  import threading
49
49
  import time
50
+ import builtins
50
51
  from operator import attrgetter
51
52
  from os.path import relpath, dirname
52
53
 
@@ -1523,7 +1524,10 @@ def normalize_dataset_options(dsopts, path_prefix='', n_iter=0):
1523
1524
  dtype = dsopts.get('dtype')
1524
1525
  if dtype:
1525
1526
  if isinstance(dtype, str):
1526
- dsopts['dtype'] = np.dtype(getattr(np, dtype))
1527
+ try:
1528
+ dsopts['dtype'] = np.dtype(getattr(np, dtype))
1529
+ except AttributeError:
1530
+ dsopts['dtype'] = np.dtype(getattr(builtins, dtype))
1527
1531
  else:
1528
1532
  dsopts['dtype'] = np.dtype(dtype)
1529
1533
 
westpa/core/h5io.py CHANGED
@@ -9,14 +9,15 @@ import socket
9
9
  import sys
10
10
  import time
11
11
  import logging
12
+ import warnings
12
13
 
13
14
  import h5py
14
15
  import numpy as np
15
16
  from numpy import index_exp
17
+ from tables import NaturalNameWarning
16
18
 
17
19
  from mdtraj import Trajectory, join as join_traj
18
20
  from mdtraj.utils import in_units_of, import_, ensure_type
19
- from mdtraj.utils.six import string_types
20
21
  from mdtraj.formats import HDF5TrajectoryFile
21
22
  from mdtraj.formats.hdf5 import _check_mode, Frames
22
23
 
@@ -28,6 +29,7 @@ except ImportError:
28
29
  psutil = None
29
30
 
30
31
  log = logging.getLogger(__name__)
32
+ warnings.filterwarnings('ignore', category=NaturalNameWarning)
31
33
 
32
34
  #
33
35
  # Constants and globals
@@ -551,7 +553,7 @@ class WESTIterationFile(HDF5TrajectoryFile):
551
553
  node = self._get_node(where='/', name=name)
552
554
  data = get_item(node, slice)
553
555
  in_units = node.attrs.units
554
- if not isinstance(in_units, string_types):
556
+ if not isinstance(in_units, str):
555
557
  in_units = in_units.decode()
556
558
  data = in_units_of(data, in_units, out_units)
557
559
  return data
@@ -277,18 +277,19 @@ class ExecutablePropagator(WESTPropagator):
277
277
  }
278
278
  self.data_info['log'] = {'name': 'seglog', 'loader': seglog_loader, 'enabled': store_h5, 'filename': None, 'dir': False}
279
279
 
280
- dataset_configs = config.get(['west', 'executable', 'datasets']) or []
280
+ # Grab config from west.executable.datasets, else fallback to west.data.datasets.
281
+ dataset_configs = config.get(["west", "executable", "datasets"], config.get(['west', 'data', 'datasets'], {}))
281
282
  for dsinfo in dataset_configs:
282
283
  try:
283
284
  dsname = dsinfo['name']
284
285
  except KeyError:
285
286
  raise ValueError('dataset specifications require a ``name`` field')
286
287
 
287
- if dsname != 'pcoord':
288
- check_bool(dsinfo.setdefault('enabled', True))
289
- else:
288
+ if dsname == 'pcoord':
290
289
  # can never disable pcoord collection
291
290
  dsinfo['enabled'] = True
291
+ else:
292
+ check_bool(dsinfo.setdefault('enabled', True))
292
293
 
293
294
  loader_directive = dsinfo.get('loader', None)
294
295
  if callable(loader_directive):
@@ -1,12 +1,12 @@
1
- from datetime import timedelta
2
- from itertools import zip_longest
3
1
  import logging
4
2
  import math
5
3
  import operator
6
- from pickle import PickleError
7
4
  import random
8
5
  import time
9
-
6
+ from datetime import timedelta
7
+ from pickle import PickleError
8
+ from itertools import zip_longest
9
+ from collections import Counter
10
10
 
11
11
  import numpy as np
12
12
 
@@ -114,28 +114,40 @@ class WESimManager:
114
114
  # handles specifically the problem that causes in plugin loading.
115
115
  try:
116
116
  # Before checking for set membership of (priority, function.__name__, function), just check
117
- # function names for collisions in this hook.
118
- hook_function_names = [callback[1] for callback in self._callback_table[hook]]
117
+ # function hash for collisions in this hook.
118
+ hook_function_hash = [hash(callback[2]) for callback in self._callback_table[hook]]
119
119
  except KeyError:
120
120
  # If there's no entry in self._callback_table for this hook, then there definitely aren't any collisions
121
121
  # because no plugins are registered to it yet in the first place.
122
122
  pass
123
123
  else:
124
- # If there are plugins registered to this hook, check for duplicate names.
125
- if function.__name__ in hook_function_names:
126
- log.debug("This plugin has already been loaded, skipping")
127
- return
124
+ # If there are plugins registered to this hook, check for duplicate hash, which will definitely have the same name, module, function.
125
+ try:
126
+ if hash(function) in hook_function_hash:
127
+ log.info('{!r} has already been loaded, skipping'.format(function))
128
+ return
129
+ except KeyError:
130
+ pass
128
131
 
129
132
  try:
130
133
  self._callback_table[hook].add((priority, function.__name__, function))
131
134
  except KeyError:
132
135
  self._callback_table[hook] = set([(priority, function.__name__, function)])
133
136
 
137
+ # Raise warning if there are multiple callback with same priority.
138
+ for priority, count in Counter([callback[0] for callback in self._callback_table[hook]]).items():
139
+ if count > 1:
140
+ log.warning(
141
+ f'{count} callbacks in {hook} have identical priority {priority}. The order of callback execution is not guaranteed.'
142
+ )
143
+ log.warning(f'{hook}: {self._callback_table[hook]}')
144
+
134
145
  log.debug('registered callback {!r} for hook {!r}'.format(function, hook))
135
146
 
136
147
  def invoke_callbacks(self, hook, *args, **kwargs):
137
148
  callbacks = self._callback_table.get(hook, [])
138
- sorted_callbacks = sorted(callbacks)
149
+ # Sort by priority, function name, then module name
150
+ sorted_callbacks = sorted(callbacks, key=lambda x: (x[0], x[1], x[2].__module__))
139
151
  for priority, name, fn in sorted_callbacks:
140
152
  log.debug('invoking callback {!r} for hook {!r}'.format(fn, hook))
141
153
  fn(*args, **kwargs)
@@ -404,7 +416,7 @@ class WESimManager:
404
416
  )
405
417
 
406
418
  total_prob = float(sum(segment.weight for segment in segments))
407
- pstatus(f'1-prob: {1-total_prob:.4e}')
419
+ pstatus(f'1-prob: {1 - total_prob:.4e}')
408
420
 
409
421
  target_counts = self.we_driver.bin_target_counts
410
422
  # Do not include bins with target count zero (e.g. sinks, never-filled bins) in the (non)empty bins statistics
Binary file
@@ -9,6 +9,7 @@ from westpa.cli.core import w_run
9
9
  from westpa.core.extloader import get_object
10
10
  from westpa.core.segment import Segment
11
11
  from westpa import analysis
12
+ from westpa.core._rc import bins_from_yaml_dict
12
13
 
13
14
  import json
14
15
 
@@ -266,6 +267,10 @@ def msmwe_compute_ss(plugin_config, west_files):
266
267
  basis_pcoord_bounds = np.array(plugin_config.get('basis_pcoord_bounds', np.nan), dtype=float)
267
268
  target_pcoord_bounds = np.array(plugin_config.get('target_pcoord_bounds', np.nan), dtype=float)
268
269
 
270
+ user_bin_mapper = plugin_config.get('user_bin_mapper', None)
271
+ if user_bin_mapper is not None:
272
+ user_bin_mapper = bins_from_yaml_dict(user_bin_mapper)
273
+
269
274
  if np.isnan(basis_pcoord_bounds).any() or np.isnan(target_pcoord_bounds).any():
270
275
  log.critical(
271
276
  "Target and/or basis pcoord bounds were not specified. "
@@ -330,7 +335,7 @@ def msmwe_compute_ss(plugin_config, west_files):
330
335
  else:
331
336
  # FIXME: This gives the wrong shape, but loading from the clusterfile gives the right shape
332
337
  log.debug("clustering coordinates into " + str(n_clusters) + " clusters...")
333
- model.cluster_coordinates(n_clusters, streaming=streaming)
338
+ model.cluster_coordinates(n_clusters, streaming=streaming, user_bin_mapper=user_bin_mapper)
334
339
 
335
340
  first_iter = 1
336
341
  model.get_fluxMatrix(n_lag, first_iter, last_iter) # extracts flux matrix, output model.fluxMatrixRaw
@@ -790,7 +795,7 @@ class RestartDriver:
790
795
 
791
796
  westpa.rc.pstatus(
792
797
  f"\n\n===== Restart {restart_state['restarts_completed']}, "
793
- + f"Run {restart_state['runs_completed']+1} initializing =====\n"
798
+ + f"Run {restart_state['runs_completed'] + 1} initializing =====\n"
794
799
  )
795
800
 
796
801
  westpa.rc.pstatus(
@@ -811,7 +816,7 @@ class RestartDriver:
811
816
  log.info("New WE run ready!")
812
817
  westpa.rc.pstatus(
813
818
  f"\n\n===== Restart {restart_state['restarts_completed']}, "
814
- + f"Run {restart_state['runs_completed']+1} running =====\n"
819
+ + f"Run {restart_state['runs_completed'] + 1} running =====\n"
815
820
  )
816
821
 
817
822
  w_run.run_simulation()
@@ -1144,7 +1149,7 @@ class RestartDriver:
1144
1149
  westpa.rc.pstatus(
1145
1150
  f"\n\n"
1146
1151
  f"===== Restart {restart_state['restarts_completed']}, "
1147
- + f"Run {restart_state['runs_completed']+1} initializing =====\n"
1152
+ + f"Run {restart_state['runs_completed'] + 1} initializing =====\n"
1148
1153
  )
1149
1154
 
1150
1155
  westpa.rc.pstatus(
@@ -1,7 +1,11 @@
1
1
  from abc import ABCMeta, abstractmethod, abstractproperty
2
- from collections import Iterable
3
2
  import logging
4
3
 
4
+ try:
5
+ from collections.abc import Iterable
6
+ except ImportError:
7
+ from collections import Iterable
8
+
5
9
  import numpy as np
6
10
 
7
11
 
@@ -1,11 +1,11 @@
1
- import logging
2
- import multiprocessing
3
1
  import os
4
- import random
5
- import signal
6
2
  import sys
3
+ import random
4
+ import logging
7
5
  import threading
8
6
  import traceback
7
+ import multiprocessing
8
+ from multiprocessing.queues import Empty
9
9
 
10
10
  import westpa.work_managers as work_managers
11
11
  from .core import WorkManager, WMFuture
@@ -61,7 +61,7 @@ class ProcessWorkManager(WorkManager):
61
61
  self.receive_thread = None
62
62
  self.pending = None
63
63
 
64
- self.shutdown_received = False
64
+ self.shutdown_received = threading.Event()
65
65
  self.shutdown_timeout = shutdown_timeout or 1
66
66
 
67
67
  def task_loop(self):
@@ -74,37 +74,38 @@ class ProcessWorkManager(WorkManager):
74
74
  # (re)initialize random number generator in this process
75
75
  random.seed()
76
76
 
77
- while not self.shutdown_received:
78
- message, task_id, fn, args, kwargs = self.task_queue.get()[:5]
77
+ while not self.shutdown_received.is_set():
78
+ if not self.task_queue.empty():
79
+ message, task_id, fn, args, kwargs = self.task_queue.get()[:5]
79
80
 
80
- if message == 'shutdown':
81
- break
82
-
83
- try:
84
- result = fn(*args, **kwargs)
85
- except BaseException as e:
86
- result_tuple = ('exception', task_id, (e, traceback.format_exc()))
87
- else:
88
- result_tuple = ('result', task_id, result)
89
- self.result_queue.put(result_tuple)
81
+ if message == 'shutdown':
82
+ break
83
+ try:
84
+ result = fn(*args, **kwargs)
85
+ except BaseException as e:
86
+ result_tuple = ('exception', task_id, (e, traceback.format_exc()))
87
+ else:
88
+ result_tuple = ('result', task_id, result)
89
+ self.result_queue.put(result_tuple)
90
90
 
91
91
  log.debug('exiting task_loop')
92
92
  return
93
93
 
94
94
  def results_loop(self):
95
- while not self.shutdown_received:
96
- message, task_id, payload = self.result_queue.get()[:3]
97
-
98
- if message == 'shutdown':
99
- break
100
- elif message == 'exception':
101
- future = self.pending.pop(task_id)
102
- future._set_exception(*payload)
103
- elif message == 'result':
104
- future = self.pending.pop(task_id)
105
- future._set_result(payload)
106
- else:
107
- raise AssertionError('unknown message {!r}'.format((message, task_id, payload)))
95
+ while not self.shutdown_received.is_set():
96
+ if not self.result_queue.empty():
97
+ message, task_id, payload = self.result_queue.get()[:3]
98
+
99
+ if message == 'shutdown':
100
+ break
101
+ elif message == 'exception':
102
+ future = self.pending.pop(task_id)
103
+ future._set_exception(*payload)
104
+ elif message == 'result':
105
+ future = self.pending.pop(task_id)
106
+ future._set_result(payload)
107
+ else:
108
+ raise AssertionError('unknown message {!r}'.format((message, task_id, payload)))
108
109
 
109
110
  log.debug('exiting results_loop')
110
111
 
@@ -142,36 +143,38 @@ class ProcessWorkManager(WorkManager):
142
143
  self.receive_thread.start()
143
144
 
144
145
  def _empty_queues(self):
145
- while not self.task_queue.empty():
146
- try:
147
- self.task_queue.get(block=False)
148
- except multiprocessing.queues.Empty:
149
- break
146
+ '''Empty self.task_queue and self.result_queue until queue is empty'''
147
+ try:
148
+ while True:
149
+ self.task_queue.get_nowait()
150
+ except Empty:
151
+ pass
150
152
 
151
- while not self.result_queue.empty():
152
- try:
153
- self.result_queue.get(block=False)
154
- except multiprocessing.queues.Empty:
155
- break
153
+ try:
154
+ while True:
155
+ self.result_queue.get_nowait()
156
+ except Empty:
157
+ pass
156
158
 
157
159
  def shutdown(self):
158
- if self.running:
160
+ while self.running:
159
161
  log.debug('shutting down {!r}'.format(self))
162
+ self.shutdown_received.set()
160
163
  self._empty_queues()
161
164
 
162
165
  # Send shutdown signal
163
166
  for _i in range(self.n_workers):
164
- self.task_queue.put(task_shutdown_sentinel, block=False)
167
+ self.task_queue.put_nowait(task_shutdown_sentinel)
165
168
 
166
169
  for worker in self.workers:
167
170
  worker.join(self.shutdown_timeout)
168
171
  if worker.is_alive():
169
172
  log.debug('sending SIGINT to worker process {:d}'.format(worker.pid))
170
- os.kill(worker.pid, signal.SIGINT)
173
+ worker.terminate()
171
174
  worker.join(self.shutdown_timeout)
172
175
  if worker.is_alive():
173
176
  log.warning('sending SIGKILL to worker process {:d}'.format(worker.pid))
174
- os.kill(worker.pid, signal.SIGKILL)
177
+ worker.kill()
175
178
  worker.join()
176
179
 
177
180
  log.debug('worker process {:d} terminated with code {:d}'.format(worker.pid, worker.exitcode))
@@ -180,4 +183,5 @@ class ProcessWorkManager(WorkManager):
180
183
 
181
184
  self._empty_queues()
182
185
  self.result_queue.put(result_shutdown_sentinel)
186
+
183
187
  self.running = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: westpa
3
- Version: 2022.8
3
+ Version: 2022.10
4
4
  Summary: WESTPA is a package for constructing and running stochastic simulations using the "weighted ensemble" approach of Huber and Kim (1996).
5
5
  Home-page: http://github.com/westpa/westpa
6
6
  License: MIT
@@ -121,8 +121,8 @@ WESTPA is developed and tested on Unix-like operating systems, including Linux a
121
121
 
122
122
  Regardless of the chosen method of installation, before installing WESTPA, we recommend you to first install the Python 3 version provided by the latest free `Anaconda Python distribution`_. After installing Anaconda, create a new python environment for the WESTPA install with the following::
123
123
 
124
- conda create -n westpa-2.0 python=3.9
125
- conda activate westpa-2.0
124
+ conda create -n westpa python=3.11
125
+ conda activate westpa
126
126
 
127
127
  Then, we recommend installing WESTPA through conda or pip. Execute either of the following::
128
128
 
@@ -137,12 +137,12 @@ See the install instructions on our `wiki`_ for more detailed information.
137
137
 
138
138
  To install from source (**not recommended**), start by downloading the corresponding tar.gz file from the `releases page`_. After downloading the file, unpack the file and install WESTPA by executing the following::
139
139
 
140
- tar xvzf westpa-main.tar.gz
140
+ tar xvzf westpa-2022.09.tar.gz
141
141
  cd westpa
142
142
  python -m pip install -e .
143
143
 
144
144
  .. _`releases page`: https://github.com/westpa/westpa/releases
145
- .. _`Anaconda Python distribution`: https://www.anaconda.com/products/individual
145
+ .. _`Anaconda Python distribution`: https://www.anaconda.com/download
146
146
  .. _`wiki`: https://github.com/westpa/westpa/wiki/Installing-WESTPA
147
147
 
148
148
  ---------------
@@ -1,6 +1,6 @@
1
- westpa/_version.py,sha256=ynQYEhRU4LpCFtVDYsxdHaJVVMjwxfKjIU7OxbyGJwA,499
1
+ westpa/_version.py,sha256=59zLCh9LAH2F-_2LpdnyAOIoxNag6VO6D7dhZZILmMY,499
2
2
  westpa/__init__.py,sha256=xyNfYIcP2ncBLu_foO1NKmJrQh8-uYdwvMuM0HsOG1M,329
3
- westpa/fasthist/_fasthist.cpython-311-darwin.so,sha256=4qtQZmsMgBNNwegcsVOy47X8sh6yVk4cFhrZD6-zacc,268808
3
+ westpa/fasthist/_fasthist.cpython-311-darwin.so,sha256=xxfTOjuXK4sKQas1xaWfK9fV8ddwxfO5GXoAZ41mfXg,246408
4
4
  westpa/fasthist/__init__.py,sha256=oWj0gKEkKfHjGHwkzmpgAxDz55h2ze_sqQVzWSsOP6s,1071
5
5
  westpa/fasthist/__main__.py,sha256=7XCBZvrKbBG3KEuQMpZD0jXa3vVMEVfZJTG8MmdbsrM,3902
6
6
  westpa/westext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -11,14 +11,14 @@ westpa/westext/weed/BinCluster.py,sha256=sx9xzZy_ot54TkFuBrCXzAtdAwT89TQEpj2cexx
11
11
  westpa/westext/weed/ProbAdjustEquil.py,sha256=eOs1lPB6hjBD44iU8KwVxR1OnaU7Kr0cuxuMVBA5PY0,4218
12
12
  westpa/westext/adaptvoronoi/adaptVor_driver.py,sha256=xZdBJo-VcX8USB-vpBZWh1qDCMwP-_GMl7V04zaxXN4,8827
13
13
  westpa/westext/adaptvoronoi/__init__.py,sha256=Zk7CiLsUJr3qZwZPKSqOBTOVV8uUvsMXkCbiTflMLHA,88
14
- westpa/westext/stringmethod/string_method.py,sha256=HEjrck6l_mNvbcY3ZbltmTp6guN2bw-ll1LqOxgW1RY,10344
14
+ westpa/westext/stringmethod/string_method.py,sha256=C89D7LScQz7CZcB83kHEy3Cc8RagZNLt-rmd6yGq5WU,10415
15
15
  westpa/westext/stringmethod/string_driver.py,sha256=8z4pEuflwRx0mb-KaRaqEk98cYUd2cvjglXDp4BRNQQ,9369
16
16
  westpa/westext/stringmethod/__init__.py,sha256=1Nk3Uygs6GWr_FJbNH0Rss2DENurIm4WGx86V0qXxy8,310
17
17
  westpa/westext/stringmethod/fourier_fitting.py,sha256=499B3GdZ_pYuFP6kK7ICDnL8StMHSKgrjPX9Xyl1NL8,2256
18
18
  westpa/westext/wess/__init__.py,sha256=5nw6mcZx7eI4szw0v2q8XBusvb0Q2MUCgGKQUx2j0DE,153
19
19
  westpa/westext/wess/ProbAdjust.py,sha256=zc0H_SURBTgxvZFQCFrXeq_pHzRDAG-ejnD6WKQGt5o,3233
20
20
  westpa/westext/wess/wess_driver.py,sha256=3CvHfnfap3TAZGVZvkNODxozcIOEhaobn4YN_ZS-htY,8984
21
- westpa/westext/hamsm_restarting/restart_driver.py,sha256=dl9D3Bp9GuOZTSRx0KmAjkJqTlqLBlbLkaR_IltstDQ,50032
21
+ westpa/westext/hamsm_restarting/restart_driver.py,sha256=c5D1I82NVo93_zPcGVtA12c2P10mK_NmkBx06upz-GU,50284
22
22
  westpa/westext/hamsm_restarting/__init__.py,sha256=0vhEngHBLOp89Mp1CVvt9BYDPosrc1nWGZVNicKFuf8,59
23
23
  westpa/westext/hamsm_restarting/example_overrides.py,sha256=3eDzKh_F0yNVm0lN4u0Pnrnj_WR9y4JDXa1-CU7qlbY,1065
24
24
  westpa/tools/binning.py,sha256=oFtc_ld8b9JJUYt-AEMe4Z1L8XJ48Lsr8Iw6nTYgGNs,20718
@@ -35,45 +35,45 @@ westpa/tools/iter_range.py,sha256=nVQIvqJ9oXOALyQIFsFp_UqMjW5BBQUd1ShZttb20xo,87
35
35
  westpa/core/systems.py,sha256=pb9YNFUcDhx3Fvhb0NcjlPCdhSUk41IhI0Sqdtr91q8,3693
36
36
  westpa/core/we_driver.py,sha256=uxPTAyhZG28EfBSjKdq1EcMNhcYrvGzVK6t5jYHyKSA,40688
37
37
  westpa/core/wm_ops.py,sha256=o_pc0BHpfCkbveTO5h76hxjXJpQgw1S-zIzVmM_u-Qc,1529
38
- westpa/core/_rc.py,sha256=x74n2f88SFP_It70SmxxpOdBnL6gpQk5ktbqsU6QvvA,24621
38
+ westpa/core/_rc.py,sha256=yPdvgqZKRS10iOWTS_TYma7Y3sdKnCDDFw5AnQvog9s,25508
39
39
  westpa/core/textio.py,sha256=lqohyyyfMTkFvTdQ8V45yUpASiJsWTh42XAG15K63dA,2434
40
40
  westpa/core/extloader.py,sha256=yxyJN-lHo3Zjd6jS6_uhC1fIl52H-h8sbV9zYJfEWGg,2239
41
- westpa/core/sim_manager.py,sha256=-dbsf74Q6eSA9SZKUtcPYAekl6OSYKMTpB45VhVMcE0,37906
41
+ westpa/core/sim_manager.py,sha256=eeCg5dALUyZ_Rm1eRRBSOpR_0UDBnyQlBvPkWY4IlzE,38653
42
42
  westpa/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- westpa/core/h5io.py,sha256=x-n0jgekFhIi1tD7Ob7u_WUmATsulnMXsOvHkdUTHVg,37011
43
+ westpa/core/h5io.py,sha256=s3_Rt8ZjvCpumyDMKctQl406dmo8muRiHHd0L34Qtyk,37077
44
44
  westpa/core/trajectory.py,sha256=DL7rsowKxBc1jwT7FPZFlfCWKuwagttZxd3SPgxZKU0,10913
45
45
  westpa/core/segment.py,sha256=Gd_5htIZ6xKxxCms9XMtJncehGvMVxZeNdy4drxrnpc,4421
46
46
  westpa/core/progress.py,sha256=tEDDn-JPY6ZNzYqyrdgA7peo7pDu8kOMvqfyiHWUgps,6753
47
- westpa/core/data_manager.py,sha256=xeqt1MtjMGSRs7QN2zxRi0KrQ1cIV4L7JlOnBx-DEYE,71783
47
+ westpa/core/data_manager.py,sha256=fHgdILXZoiDyrDv34DjZqS5YyqqG6bbnUBLouqYwOFQ,71924
48
48
  westpa/core/states.py,sha256=umsdgSrYjt2vjw-1kQeiILWmureOBmBaOgg0nQxUVmA,13318
49
49
  westpa/core/yamlcfg.py,sha256=B78OEr1n_sIkW6kDzl3FO63tiugaT-1VutAgLxU0i7A,12696
50
50
  westpa/core/kinetics/matrates.py,sha256=1sf7L6ojLE8yT2sFfgeB8eqgjMHdMK2O_Xgyz_RjCzc,5554
51
51
  westpa/core/kinetics/events.py,sha256=VqYBN5rVOf3hAYUA6xQ6UN7GP6tVgRFIoP69tfGhkTo,6511
52
52
  westpa/core/kinetics/__init__.py,sha256=djtiki7X5-IEzwjwswbdgrolwUIzVAHKxCiI5B3WH28,510
53
- westpa/core/kinetics/_kinetics.cpython-311-darwin.so,sha256=yYTqnN_kD4rQh9q2ltR5f37oHIvIC-VSzBES2SwEXH4,431408
53
+ westpa/core/kinetics/_kinetics.cpython-311-darwin.so,sha256=pY8XITycgjA-tA9EZ9VS9GvSRLnL0ntTqsfjba6d8a8,387512
54
54
  westpa/core/kinetics/rate_averaging.py,sha256=gIKDXBAOSDI6KythepoC4QipUPksTRBc9zbM7DRtwo4,10300
55
55
  westpa/core/binning/binless_driver.py,sha256=T5qWpLnjxCS9RdKeWf7eVCC_s6TQFDENL7X3VG6JIYo,2231
56
56
  westpa/core/binning/mab_driver.py,sha256=azSqc9pqHk_zc1ptGNjXARDbK-UAnPVmCiYwebi5mPY,2223
57
- westpa/core/binning/_assign.cpython-311-darwin.so,sha256=FrtUK91d13RiOuUgwe-j83XO2WZA805wosT_29sUqME,293056
57
+ westpa/core/binning/_assign.cpython-311-darwin.so,sha256=W-tc8fTncvcN1YvVjb2h_KG3TZMJs_62csr19qJEijg,264480
58
58
  westpa/core/binning/binless.py,sha256=Fb9TI5swQntzXjmlWFbYQ9yjzjLxDKNVVdmRxRqOnIY,4056
59
59
  westpa/core/binning/__init__.py,sha256=XmjBP6fg_id_vDELkcWW3u2GeuL5OPWblvX-kc7mINk,1297
60
- westpa/core/binning/mab_manager.py,sha256=PUSA9J-dzmQdWQ9h5DEB9Eed6GVETf1EE43r6AvZLwI,9617
60
+ westpa/core/binning/mab_manager.py,sha256=-bb9CdSXrx6XV8NWHa6Q1CTWVaGa4coAZn_lDlvHCkM,9815
61
61
  westpa/core/binning/assign.py,sha256=e1YWyU3R12evLAoIWUrEvv3uvdKFo4u_mfKGDcK5AVU,18028
62
62
  westpa/core/binning/binless_manager.py,sha256=XgsLaYhknzWA9IHCqOvmnLXSgM303KnKOUjLe1NM0Zw,9414
63
- westpa/core/binning/mab.py,sha256=YgNWCistmKPFbQp9TpFgnpgGWc-HZTvSwB6ZugPS0Oo,11614
63
+ westpa/core/binning/mab.py,sha256=X7L1jx--nNJTNA-PeJGDpwSa2PDMoMb4OtLpjffXQ4A,16046
64
64
  westpa/core/binning/bins.py,sha256=WDj7DNX3MTVkRvkgAooa9G8VThxw32uIfMTuk9sS194,1460
65
65
  westpa/core/reweight/matrix.py,sha256=219sRxkML1V9niPIndSoRvJAC0fUmpG0PLDKpmfWW-g,5509
66
66
  westpa/core/reweight/__init__.py,sha256=8goYojsHMcJCZblBC2sc2fcj-NUNVEstbSLswKNlVfg,284
67
- westpa/core/reweight/_reweight.cpython-311-darwin.so,sha256=xisaXsja3l_6VwN78wchnrxSoAUxkOLxF1NKj3PReyI,350032
67
+ westpa/core/reweight/_reweight.cpython-311-darwin.so,sha256=vx_WN-ID46Bs1tyF4NZ5CWHliwM5tTdBI9jXZUL2wXU,303264
68
68
  westpa/core/propagators/__init__.py,sha256=rx_kkeg3Tbb_rI0uhLGCD3OwSYj9QuhxF8QGN3mILrg,2373
69
- westpa/core/propagators/executable.py,sha256=B9jU6RKkApr5cqH56n49IQ1i_cUcJUMfx6fmBZoWgPk,32071
69
+ westpa/core/propagators/executable.py,sha256=6YuNMZ7if4jGtZ2OV0k_7jmBvtHFfdaIX-LLQJ_KIc8,32201
70
70
  westpa/analysis/__init__.py,sha256=CcmVPCB9OSEib0mJ4U-s9v3nrj4h-T_9AGApAbPnn8I,268
71
- westpa/analysis/core.py,sha256=P_m5-sU1RURAtWQVlV_Y2pgPvwUjyCqFS-E4O3fsD4E,22399
71
+ westpa/analysis/core.py,sha256=rZ7xcrskpPwy2lrB27gXT4mSQRbqnPj9D8yA-Utve-M,22426
72
72
  westpa/analysis/statistics.py,sha256=M3Gj1bOiAu_SA4upR7gENYEOP2gnIEaSOZeGyoIxAc8,789
73
73
  westpa/analysis/trajectories.py,sha256=jyrbbKOVyZ3GjHQushDS_G8C4IRXlUmxa-WzmEEVGwc,12878
74
74
  westpa/mclib/__init__.py,sha256=NskP81wKw-tHTniyJ8QbgKAHah5JdpCrnPKJo1T-nLw,11513
75
75
  westpa/mclib/__main__.py,sha256=cKqfE9koMcrHkslEPpFISA4Eblwl0mllaxn7pFeyX1A,881
76
- westpa/mclib/_mclib.cpython-311-darwin.so,sha256=3rmp7AmrHQkUA_Yv21z8_1RKoCoP0sFdAapr5Hvhpt8,272456
76
+ westpa/mclib/_mclib.cpython-311-darwin.so,sha256=2X97cU0ZN3L63HW27Ha2d1Jd8w2MKdRm1l9n8mTFtEw,246144
77
77
  westpa/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
78
  westpa/cli/tools/w_direct.py,sha256=5Z9eQpvpKM-40XdiI0L3t0O3jpjMx7tk8ndYAaJxvrc,22361
79
79
  westpa/cli/tools/w_dumpsegs.py,sha256=uv0WxvKGauyW6VT3zGyALUXVqSXwDrhwbF3ZVSJV9Mo,3952
@@ -93,13 +93,13 @@ westpa/cli/tools/plothist.py,sha256=2jpAk_-T2XoWUExUyUNk0JOucPjQX51JxtntXRlQ54I,
93
93
  westpa/cli/tools/w_kinetics.py,sha256=ALx8t9GGARfdMxgkPEqQzWoRVQkqJneM4EZF2ur_oPk,3542
94
94
  westpa/cli/tools/w_fluxanl.py,sha256=a_swklwO2BGW4kwyJHz2RdKNyadfBQgV_wTTBcfS1XA,15564
95
95
  westpa/cli/tools/w_reweight.py,sha256=McIhF9qeqUbJ8SFbskw6fn8OtJ9zFLaDQSqLm8xWarY,33410
96
- westpa/cli/tools/w_pdist.py,sha256=eObPha2I-lFknrUna770i_OqYVIEQHs6ZnhXpLfyzow,20677
97
- westpa/cli/tools/w_ipa.py,sha256=8YQbk_hSsR_QI0rk3PUctGoKXgrbNhIDruYp_CLcGok,37462
96
+ westpa/cli/tools/w_pdist.py,sha256=I7yGHMvmU--jjuZNMSxtTSR_vLVhYvhJpjluzcjPGaQ,20821
97
+ westpa/cli/tools/w_ipa.py,sha256=4ToZGmZxw6PM635lVEVMTwI15VcKMSSy6b9CQHET3Rs,37482
98
98
  westpa/cli/tools/w_bins.py,sha256=e9YMvQoQ5jjzBK8zlZgXNDCDhFGMMKgb2b-UdyI_qgQ,6801
99
99
  westpa/cli/tools/w_stateprobs.py,sha256=fOaHZe7RYCNsIJmbXQqkdU6_cxqKcQLrKh2sxdaYvIQ,3872
100
100
  westpa/cli/tools/w_postanalysis_reweight.py,sha256=lFjSuBWZ-25AKwA6_ee168BfINjbnVmxPDxYKJHFUkw,1808
101
101
  westpa/cli/core/w_fork.py,sha256=UZVY6nUdMRRbKPfNFGAfEAu7tVhu7NewopPdQ0s8cz8,5693
102
- westpa/cli/core/w_states.py,sha256=doVARhxDh_trSs3xsP8q0_J9QOGhAWXOKmjH3MBEdQY,9441
102
+ westpa/cli/core/w_states.py,sha256=Fkr0WdUut59vPtj0_TZWAmY5_qf5H_WsoiusO7Slz50,9433
103
103
  westpa/cli/core/w_run.py,sha256=9fLOJjCYQadB28gdsKwGxwjJtSB5u0DRITzAWmL3rJg,2159
104
104
  westpa/cli/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  westpa/cli/core/w_truncate.py,sha256=-CHFOBr4NAZwGQ8-O5F7B0dPowpnFpm-mF9Us1gBgfo,1654
@@ -107,7 +107,7 @@ westpa/cli/core/w_init.py,sha256=V_CvlAuq8flg-zUO01sbMGYkLqrEDD4DU9sV90bYFus,879
107
107
  westpa/cli/core/w_succ.py,sha256=ZK1MHHu7t53VdBrRgJUe7b1R8DnhMKPjHOqbbOjC_As,3074
108
108
  westpa/trajtree/__init__.py,sha256=K64Ok5bUP-fXo1H2rigJqxCnm-U23tJlRngNOnzR3gs,96
109
109
  westpa/trajtree/trajtree.py,sha256=sLf4kTi0QyvFdbSR__YcPwOR2wcOxtlkC4IPUFcq-9M,4497
110
- westpa/trajtree/_trajtree.cpython-311-darwin.so,sha256=eGHeJoq0xw7StCmzP25YHoYpT8_rXrNhjbD9lPXG1w8,154960
110
+ westpa/trajtree/_trajtree.cpython-311-darwin.so,sha256=6gDd_uxe9JYOUfSpLCYCeQ3pkfXAahplN_lkRxEnfPg,131000
111
111
  westpa/oldtools/files.py,sha256=JmLtZqxD88cybEHcOU6kodAeOJYxylpYFl4OQqU13Hs,944
112
112
  westpa/oldtools/miscfn.py,sha256=595W28JazmiU9ioDgOKU9ZxtXJue_q-8WcpOKTgkikQ,909
113
113
  westpa/oldtools/__init__.py,sha256=rxAxsQNQMADy5j8xrqW_7Vk3D9ajM7lfDjHaKQHRDTI,62
@@ -131,7 +131,7 @@ westpa/oldtools/stats/accumulator.py,sha256=AZ1RshALSHjdhfDXidE5_yHaDEsdDXfSzsmo
131
131
  westpa/oldtools/stats/mcbs.py,sha256=yMgvdEu70j-h1_kTqYakypFV3s7AtWqJioWuy2bLUFI,3387
132
132
  westpa/work_managers/__init__.py,sha256=nHbI9PmRosOeZ11gCHIwpv9qwgXbwUnGt9vIZ0nLtOg,1670
133
133
  westpa/work_managers/core.py,sha256=NVe9XhcfizBzXjkymgeo0xLzNLP0tP6-VoTE0uxu91U,15061
134
- westpa/work_managers/processes.py,sha256=zcHKanvTYnCNuU46F4EpqaRdj1XjtCe6ltw3g3bqRhg,6770
134
+ westpa/work_managers/processes.py,sha256=iZRaOW7DEuggDcb92D0goGAbLvYjkSwamdpADx2zooM,6960
135
135
  westpa/work_managers/threads.py,sha256=-Xktf-LPqVRf7sMW7Yqdc_ayO_4x_f0zA9iZS_G-fuI,2335
136
136
  westpa/work_managers/mpi.py,sha256=ArxswC1CMgBc5rZ1nr4cQQvwHlCWAcN-BkZt8ilhSgk,9511
137
137
  westpa/work_managers/serial.py,sha256=fo5Sql5wO4PdFy2VbcssWy0G459MJwKjRWkklK6nDxo,694
@@ -141,10 +141,10 @@ westpa/work_managers/zeromq/__init__.py,sha256=rrl4YbEaZr2AiEBTMlhvEFH83dBlAwWR_
141
141
  westpa/work_managers/zeromq/core.py,sha256=K3Iyrz5u2Dy-GgZFL3ZXDN2iaaLm7qL-A3cm4PdBiF8,22907
142
142
  westpa/work_managers/zeromq/work_manager.py,sha256=UB_WvnejDRVi1ZU2QWpP9uzhnccOH7b3qHgU-wSstTY,22425
143
143
  westpa/work_managers/zeromq/node.py,sha256=CeoJhXVqrZxrV3lMnDtm3LNkGFxjS4dr3E6wd7ZQRTE,4877
144
- westpa-2022.8.dist-info/RECORD,,
145
- westpa-2022.8.dist-info/LICENSE,sha256=I2wUldIRJmflTYUxmSiITSZEKvlovlMPrE3JU5IslkY,1074
146
- westpa-2022.8.dist-info/AUTHORS,sha256=YMi91-Fs-vFgZKUaItfh20uXthT9oe2Kq6CQXmqMGqg,671
147
- westpa-2022.8.dist-info/WHEEL,sha256=3Ij8bI-sb8yCMxXItr4MLlNoRGZb2WoUxQe9xIFR_DQ,111
148
- westpa-2022.8.dist-info/entry_points.txt,sha256=0Ym8meKTdYbUEMtUHF_4zaZP__4ldfFnoYXyYlKRB6s,1428
149
- westpa-2022.8.dist-info/top_level.txt,sha256=otaLnQtwo9jKCJmja4iOOsOVDThUvPfjJaeLrgGEhlE,7
150
- westpa-2022.8.dist-info/METADATA,sha256=mr5Ug2g18LvcWV8tCqcsU9e4990CspZUnMexqT9O5bE,7577
144
+ westpa-2022.10.dist-info/RECORD,,
145
+ westpa-2022.10.dist-info/LICENSE,sha256=I2wUldIRJmflTYUxmSiITSZEKvlovlMPrE3JU5IslkY,1074
146
+ westpa-2022.10.dist-info/AUTHORS,sha256=YMi91-Fs-vFgZKUaItfh20uXthT9oe2Kq6CQXmqMGqg,671
147
+ westpa-2022.10.dist-info/WHEEL,sha256=3Ij8bI-sb8yCMxXItr4MLlNoRGZb2WoUxQe9xIFR_DQ,111
148
+ westpa-2022.10.dist-info/entry_points.txt,sha256=0Ym8meKTdYbUEMtUHF_4zaZP__4ldfFnoYXyYlKRB6s,1428
149
+ westpa-2022.10.dist-info/top_level.txt,sha256=otaLnQtwo9jKCJmja4iOOsOVDThUvPfjJaeLrgGEhlE,7
150
+ westpa-2022.10.dist-info/METADATA,sha256=17fr3iDNghuqnwUeEVWPaoG_OF-pta25C9bYblf8UiU,7563