westpa 2022.12__cp313-cp313-macosx_11_0_arm64.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/__init__.py +14 -0
- westpa/_version.py +21 -0
- westpa/analysis/__init__.py +5 -0
- westpa/analysis/core.py +746 -0
- westpa/analysis/statistics.py +27 -0
- westpa/analysis/trajectories.py +360 -0
- westpa/cli/__init__.py +0 -0
- westpa/cli/core/__init__.py +0 -0
- westpa/cli/core/w_fork.py +152 -0
- westpa/cli/core/w_init.py +230 -0
- westpa/cli/core/w_run.py +77 -0
- westpa/cli/core/w_states.py +212 -0
- westpa/cli/core/w_succ.py +99 -0
- westpa/cli/core/w_truncate.py +68 -0
- westpa/cli/tools/__init__.py +0 -0
- westpa/cli/tools/ploterr.py +506 -0
- westpa/cli/tools/plothist.py +706 -0
- westpa/cli/tools/w_assign.py +596 -0
- westpa/cli/tools/w_bins.py +166 -0
- westpa/cli/tools/w_crawl.py +119 -0
- westpa/cli/tools/w_direct.py +547 -0
- westpa/cli/tools/w_dumpsegs.py +94 -0
- westpa/cli/tools/w_eddist.py +506 -0
- westpa/cli/tools/w_fluxanl.py +376 -0
- westpa/cli/tools/w_ipa.py +833 -0
- westpa/cli/tools/w_kinavg.py +127 -0
- westpa/cli/tools/w_kinetics.py +96 -0
- westpa/cli/tools/w_multi_west.py +414 -0
- westpa/cli/tools/w_ntop.py +213 -0
- westpa/cli/tools/w_pdist.py +515 -0
- westpa/cli/tools/w_postanalysis_matrix.py +82 -0
- westpa/cli/tools/w_postanalysis_reweight.py +53 -0
- westpa/cli/tools/w_red.py +491 -0
- westpa/cli/tools/w_reweight.py +780 -0
- westpa/cli/tools/w_select.py +226 -0
- westpa/cli/tools/w_stateprobs.py +111 -0
- westpa/cli/tools/w_trace.py +599 -0
- westpa/core/__init__.py +0 -0
- westpa/core/_rc.py +673 -0
- westpa/core/binning/__init__.py +55 -0
- westpa/core/binning/_assign.cpython-313-darwin.so +0 -0
- westpa/core/binning/assign.py +455 -0
- westpa/core/binning/binless.py +96 -0
- westpa/core/binning/binless_driver.py +54 -0
- westpa/core/binning/binless_manager.py +190 -0
- westpa/core/binning/bins.py +47 -0
- westpa/core/binning/mab.py +506 -0
- westpa/core/binning/mab_driver.py +54 -0
- westpa/core/binning/mab_manager.py +198 -0
- westpa/core/data_manager.py +1694 -0
- westpa/core/extloader.py +74 -0
- westpa/core/h5io.py +995 -0
- westpa/core/kinetics/__init__.py +24 -0
- westpa/core/kinetics/_kinetics.cpython-313-darwin.so +0 -0
- westpa/core/kinetics/events.py +147 -0
- westpa/core/kinetics/matrates.py +156 -0
- westpa/core/kinetics/rate_averaging.py +266 -0
- westpa/core/progress.py +218 -0
- westpa/core/propagators/__init__.py +54 -0
- westpa/core/propagators/executable.py +719 -0
- westpa/core/reweight/__init__.py +14 -0
- westpa/core/reweight/_reweight.cpython-313-darwin.so +0 -0
- westpa/core/reweight/matrix.py +126 -0
- westpa/core/segment.py +119 -0
- westpa/core/sim_manager.py +835 -0
- westpa/core/states.py +359 -0
- westpa/core/systems.py +93 -0
- westpa/core/textio.py +74 -0
- westpa/core/trajectory.py +330 -0
- westpa/core/we_driver.py +910 -0
- westpa/core/wm_ops.py +43 -0
- westpa/core/yamlcfg.py +391 -0
- westpa/fasthist/__init__.py +34 -0
- westpa/fasthist/_fasthist.cpython-313-darwin.so +0 -0
- westpa/mclib/__init__.py +271 -0
- westpa/mclib/__main__.py +28 -0
- westpa/mclib/_mclib.cpython-313-darwin.so +0 -0
- westpa/oldtools/__init__.py +4 -0
- westpa/oldtools/aframe/__init__.py +35 -0
- westpa/oldtools/aframe/atool.py +75 -0
- westpa/oldtools/aframe/base_mixin.py +26 -0
- westpa/oldtools/aframe/binning.py +178 -0
- westpa/oldtools/aframe/data_reader.py +560 -0
- westpa/oldtools/aframe/iter_range.py +200 -0
- westpa/oldtools/aframe/kinetics.py +117 -0
- westpa/oldtools/aframe/mcbs.py +153 -0
- westpa/oldtools/aframe/output.py +39 -0
- westpa/oldtools/aframe/plotting.py +90 -0
- westpa/oldtools/aframe/trajwalker.py +126 -0
- westpa/oldtools/aframe/transitions.py +469 -0
- westpa/oldtools/cmds/__init__.py +0 -0
- westpa/oldtools/cmds/w_ttimes.py +361 -0
- westpa/oldtools/files.py +34 -0
- westpa/oldtools/miscfn.py +23 -0
- westpa/oldtools/stats/__init__.py +4 -0
- westpa/oldtools/stats/accumulator.py +35 -0
- westpa/oldtools/stats/edfs.py +129 -0
- westpa/oldtools/stats/mcbs.py +96 -0
- westpa/tools/__init__.py +33 -0
- westpa/tools/binning.py +472 -0
- westpa/tools/core.py +340 -0
- westpa/tools/data_reader.py +159 -0
- westpa/tools/dtypes.py +31 -0
- westpa/tools/iter_range.py +198 -0
- westpa/tools/kinetics_tool.py +340 -0
- westpa/tools/plot.py +283 -0
- westpa/tools/progress.py +17 -0
- westpa/tools/selected_segs.py +154 -0
- westpa/tools/wipi.py +751 -0
- westpa/trajtree/__init__.py +4 -0
- westpa/trajtree/_trajtree.cpython-313-darwin.so +0 -0
- westpa/trajtree/trajtree.py +117 -0
- westpa/westext/__init__.py +0 -0
- westpa/westext/adaptvoronoi/__init__.py +3 -0
- westpa/westext/adaptvoronoi/adaptVor_driver.py +214 -0
- westpa/westext/hamsm_restarting/__init__.py +3 -0
- westpa/westext/hamsm_restarting/example_overrides.py +35 -0
- westpa/westext/hamsm_restarting/restart_driver.py +1165 -0
- westpa/westext/stringmethod/__init__.py +11 -0
- westpa/westext/stringmethod/fourier_fitting.py +69 -0
- westpa/westext/stringmethod/string_driver.py +253 -0
- westpa/westext/stringmethod/string_method.py +306 -0
- westpa/westext/weed/BinCluster.py +180 -0
- westpa/westext/weed/ProbAdjustEquil.py +100 -0
- westpa/westext/weed/UncertMath.py +247 -0
- westpa/westext/weed/__init__.py +10 -0
- westpa/westext/weed/weed_driver.py +192 -0
- westpa/westext/wess/ProbAdjust.py +101 -0
- westpa/westext/wess/__init__.py +6 -0
- westpa/westext/wess/wess_driver.py +217 -0
- westpa/work_managers/__init__.py +57 -0
- westpa/work_managers/core.py +396 -0
- westpa/work_managers/environment.py +134 -0
- westpa/work_managers/mpi.py +318 -0
- westpa/work_managers/processes.py +187 -0
- westpa/work_managers/serial.py +28 -0
- westpa/work_managers/threads.py +79 -0
- westpa/work_managers/zeromq/__init__.py +20 -0
- westpa/work_managers/zeromq/core.py +641 -0
- westpa/work_managers/zeromq/node.py +131 -0
- westpa/work_managers/zeromq/work_manager.py +526 -0
- westpa/work_managers/zeromq/worker.py +320 -0
- westpa-2022.12.dist-info/AUTHORS +22 -0
- westpa-2022.12.dist-info/LICENSE +21 -0
- westpa-2022.12.dist-info/METADATA +193 -0
- westpa-2022.12.dist-info/RECORD +149 -0
- westpa-2022.12.dist-info/WHEEL +6 -0
- westpa-2022.12.dist-info/entry_points.txt +29 -0
- westpa-2022.12.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
'''
|
|
2
|
+
Created on May 29, 2015
|
|
3
|
+
|
|
4
|
+
@author: mzwier
|
|
5
|
+
'''
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import multiprocessing
|
|
9
|
+
import os
|
|
10
|
+
import signal
|
|
11
|
+
import threading
|
|
12
|
+
|
|
13
|
+
from .core import ZMQCore, Message, ZMQWMTimeout, PassiveMultiTimer, Task, Result, TIMEOUT_MASTER_BEACON
|
|
14
|
+
|
|
15
|
+
import zmq
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
log = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ZMQWorker(ZMQCore):
|
|
22
|
+
'''This is the outward facing worker component of the ZMQ work manager. This
|
|
23
|
+
forms the interface to the master. This process cannot hang or crash due to an
|
|
24
|
+
error in tasks it executes, so tasks are isolated in ZMQExecutor, which
|
|
25
|
+
communicates with ZMQWorker via (what else?) ZeroMQ.'''
|
|
26
|
+
|
|
27
|
+
def __init__(self, rr_endpoint, ann_endpoint):
|
|
28
|
+
super().__init__()
|
|
29
|
+
|
|
30
|
+
# Upstream endpoints
|
|
31
|
+
self.rr_endpoint = rr_endpoint
|
|
32
|
+
self.ann_endpoint = ann_endpoint
|
|
33
|
+
|
|
34
|
+
# Downstream endpoints
|
|
35
|
+
self.task_endpoint = self.make_internal_endpoint()
|
|
36
|
+
self.result_endpoint = self.make_internal_endpoint()
|
|
37
|
+
|
|
38
|
+
self.master_id = None
|
|
39
|
+
self.identified = False
|
|
40
|
+
|
|
41
|
+
# The task currently being processed
|
|
42
|
+
self.pending_task = None
|
|
43
|
+
|
|
44
|
+
# Executor process
|
|
45
|
+
|
|
46
|
+
self.shutdown_timeout = 5.0 # Five second wait between shutdown message and SIGINT and SIGINT and SIGKILL
|
|
47
|
+
self.executor_process = None
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def is_master(self):
|
|
51
|
+
return False
|
|
52
|
+
|
|
53
|
+
def update_master_info(self, msg):
|
|
54
|
+
if self.master_id is None:
|
|
55
|
+
self.master_id = msg.master_id
|
|
56
|
+
self.timers.reset(TIMEOUT_MASTER_BEACON)
|
|
57
|
+
|
|
58
|
+
def identify(self, rr_socket):
|
|
59
|
+
if self.master_id is None or self.identified or self.timers.expired(TIMEOUT_MASTER_BEACON):
|
|
60
|
+
return
|
|
61
|
+
self.send_message(rr_socket, Message.IDENTIFY, payload=self.get_identification())
|
|
62
|
+
self.recv_ack(rr_socket, timeout=self.master_beacon_period * self.timeout_factor * 1000)
|
|
63
|
+
self.identified = True
|
|
64
|
+
|
|
65
|
+
def request_task(self, rr_socket, task_socket):
|
|
66
|
+
if self.master_id is None:
|
|
67
|
+
return
|
|
68
|
+
elif self.pending_task is not None:
|
|
69
|
+
return
|
|
70
|
+
elif self.timers.expired(TIMEOUT_MASTER_BEACON):
|
|
71
|
+
return
|
|
72
|
+
else:
|
|
73
|
+
self.send_message(rr_socket, Message.TASK_REQUEST)
|
|
74
|
+
reply = self.recv_message(rr_socket, timeout=self.master_beacon_period * self.timeout_factor * 1000)
|
|
75
|
+
self.update_master_info(reply)
|
|
76
|
+
if reply.message == Message.NAK:
|
|
77
|
+
# No task available
|
|
78
|
+
return
|
|
79
|
+
else:
|
|
80
|
+
with self.message_validation(reply):
|
|
81
|
+
assert isinstance(reply.payload, Task)
|
|
82
|
+
task = reply.payload
|
|
83
|
+
self.pending_task = task
|
|
84
|
+
self.send_message(task_socket, Message.TASK, task)
|
|
85
|
+
|
|
86
|
+
def handle_reconfigure_timeout(self, msg, timers):
|
|
87
|
+
with self.message_validation(msg):
|
|
88
|
+
assert msg.payload is not None
|
|
89
|
+
timer, new_period = msg.payload
|
|
90
|
+
timers.change_duration(timer, new_period)
|
|
91
|
+
timers.reset(timer)
|
|
92
|
+
|
|
93
|
+
def handle_result(self, result_socket, rr_socket):
|
|
94
|
+
msg = self.recv_message(result_socket)
|
|
95
|
+
with self.message_validation(msg):
|
|
96
|
+
assert msg.message == Message.RESULT
|
|
97
|
+
assert isinstance(msg.payload, Result)
|
|
98
|
+
assert msg.payload.task_id == self.pending_task.task_id
|
|
99
|
+
|
|
100
|
+
msg.src_id = self.node_id
|
|
101
|
+
self.pending_task = None
|
|
102
|
+
self.send_message(rr_socket, msg)
|
|
103
|
+
reply = self.recv_ack(rr_socket, timeout=self.master_beacon_period * self.timeout_factor * 1000)
|
|
104
|
+
self.update_master_info(reply)
|
|
105
|
+
|
|
106
|
+
def comm_loop(self):
|
|
107
|
+
'''Master communication loop for the worker process.'''
|
|
108
|
+
|
|
109
|
+
rr_socket = self.context.socket(zmq.REQ)
|
|
110
|
+
|
|
111
|
+
ann_socket = self.context.socket(zmq.SUB)
|
|
112
|
+
ann_socket.setsockopt(zmq.SUBSCRIBE, b'')
|
|
113
|
+
inproc_socket = self.context.socket(zmq.SUB)
|
|
114
|
+
inproc_socket.setsockopt(zmq.SUBSCRIBE, b'')
|
|
115
|
+
|
|
116
|
+
task_socket = self.context.socket(zmq.PUSH)
|
|
117
|
+
result_socket = self.context.socket(zmq.PULL)
|
|
118
|
+
|
|
119
|
+
self.log.info('This is {}'.format(self.node_description))
|
|
120
|
+
|
|
121
|
+
timers = self.timers = PassiveMultiTimer()
|
|
122
|
+
timers.add_timer(TIMEOUT_MASTER_BEACON, 86400)
|
|
123
|
+
timers.add_timer('worker_beacon', self.worker_beacon_period)
|
|
124
|
+
timers.add_timer('startup_timeout', self.startup_timeout)
|
|
125
|
+
peer_found = False
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
rr_socket.connect(self.rr_endpoint)
|
|
129
|
+
ann_socket.connect(self.ann_endpoint)
|
|
130
|
+
inproc_socket.bind(self.inproc_endpoint)
|
|
131
|
+
task_socket.connect(self.task_endpoint)
|
|
132
|
+
result_socket.bind(self.result_endpoint)
|
|
133
|
+
|
|
134
|
+
poller = zmq.Poller()
|
|
135
|
+
poller.register(ann_socket, zmq.POLLIN)
|
|
136
|
+
poller.register(inproc_socket, zmq.POLLIN)
|
|
137
|
+
poller.register(result_socket, zmq.POLLIN)
|
|
138
|
+
|
|
139
|
+
timers.reset()
|
|
140
|
+
while True:
|
|
141
|
+
# If a timer is already expired, next_expiration_in() will return 0, which
|
|
142
|
+
# zeromq interprets as infinite wait; so instead we select a 1 ms wait in this
|
|
143
|
+
# case.
|
|
144
|
+
poll_results = dict(poller.poll((timers.next_expiration_in() or 0.001) * 1000))
|
|
145
|
+
|
|
146
|
+
if poll_results and not peer_found:
|
|
147
|
+
timers.remove_timer('startup_timeout')
|
|
148
|
+
peer_found = True
|
|
149
|
+
timers.change_duration(TIMEOUT_MASTER_BEACON, self.master_beacon_period * self.timeout_factor)
|
|
150
|
+
timers.reset(TIMEOUT_MASTER_BEACON)
|
|
151
|
+
|
|
152
|
+
announcements = []
|
|
153
|
+
|
|
154
|
+
# Check for internal messages first
|
|
155
|
+
if inproc_socket in poll_results:
|
|
156
|
+
announcements.extend(self.recv_all(inproc_socket))
|
|
157
|
+
|
|
158
|
+
# Process announcements
|
|
159
|
+
if ann_socket in poll_results:
|
|
160
|
+
announcements.extend(self.recv_all(ann_socket))
|
|
161
|
+
|
|
162
|
+
# announcements = Message.coalesce_announcements(announcements)
|
|
163
|
+
# self.log.debug('received {:d} announcements'.format(len(announcements)))
|
|
164
|
+
|
|
165
|
+
messages_by_tag = {}
|
|
166
|
+
for msg in announcements:
|
|
167
|
+
messages_by_tag.setdefault(msg.message, list()).append(msg)
|
|
168
|
+
|
|
169
|
+
# Check for shutdown messages
|
|
170
|
+
if Message.SHUTDOWN in messages_by_tag:
|
|
171
|
+
self.log.debug('received shutdown message')
|
|
172
|
+
return
|
|
173
|
+
elif Message.TASKS_AVAILABLE in messages_by_tag:
|
|
174
|
+
self.update_master_info(messages_by_tag[Message.TASKS_AVAILABLE][0])
|
|
175
|
+
elif Message.MASTER_BEACON in messages_by_tag:
|
|
176
|
+
self.update_master_info(messages_by_tag[Message.MASTER_BEACON][0])
|
|
177
|
+
|
|
178
|
+
if self.master_id is not None and timers.expired('worker_beacon'):
|
|
179
|
+
self.identify(rr_socket)
|
|
180
|
+
timers.reset('worker_beacon')
|
|
181
|
+
|
|
182
|
+
# Handle results, so that we clear ourselves of completed tasks
|
|
183
|
+
# before asking for more
|
|
184
|
+
if result_socket in poll_results:
|
|
185
|
+
self.handle_result(result_socket, rr_socket)
|
|
186
|
+
# immediately request another task if available
|
|
187
|
+
if not timers.expired(TIMEOUT_MASTER_BEACON):
|
|
188
|
+
self.request_task(rr_socket, task_socket)
|
|
189
|
+
|
|
190
|
+
# Handle any remaining messages
|
|
191
|
+
for tag, msgs in messages_by_tag.items():
|
|
192
|
+
if tag == Message.MASTER_BEACON:
|
|
193
|
+
self.identify(rr_socket)
|
|
194
|
+
elif tag == Message.RECONFIGURE_TIMEOUT:
|
|
195
|
+
for msg in msgs:
|
|
196
|
+
self.handle_reconfigure_timeout(msg, timers)
|
|
197
|
+
elif tag == Message.TASKS_AVAILABLE:
|
|
198
|
+
self.request_task(rr_socket, task_socket)
|
|
199
|
+
|
|
200
|
+
del announcements, messages_by_tag
|
|
201
|
+
|
|
202
|
+
if timers.expired(TIMEOUT_MASTER_BEACON):
|
|
203
|
+
self.log.error('no contact from master; shutting down')
|
|
204
|
+
return
|
|
205
|
+
|
|
206
|
+
if not peer_found and timers.expired('startup_timeout'):
|
|
207
|
+
self.log.error('startup phase elapsed with no contact from master; shutting down')
|
|
208
|
+
break
|
|
209
|
+
|
|
210
|
+
except ZMQWMTimeout:
|
|
211
|
+
# both handle_result() and request_task() have receive timeouts set to
|
|
212
|
+
# self.master_beacon_period*self.timeout_factor, and timeout exceptions
|
|
213
|
+
# propagate to this point.
|
|
214
|
+
self.log.error('timeout communicating with peer; shutting down')
|
|
215
|
+
finally:
|
|
216
|
+
self.shutdown_executor()
|
|
217
|
+
self.executor_process.join()
|
|
218
|
+
self.context.destroy(linger=1)
|
|
219
|
+
self.context = None
|
|
220
|
+
self.remove_ipc_endpoints()
|
|
221
|
+
|
|
222
|
+
def shutdown_executor(self):
|
|
223
|
+
if self.context is not None:
|
|
224
|
+
try:
|
|
225
|
+
self.log.debug('sending shutdown task to executor')
|
|
226
|
+
task_socket = self.context.socket(zmq.PUSH)
|
|
227
|
+
task_socket.connect(self.task_endpoint)
|
|
228
|
+
self.send_message(task_socket, Message.SHUTDOWN)
|
|
229
|
+
task_socket.close(linger=1)
|
|
230
|
+
except Exception:
|
|
231
|
+
pass
|
|
232
|
+
|
|
233
|
+
pid = self.executor_process.pid
|
|
234
|
+
self.executor_process.join(self.shutdown_timeout)
|
|
235
|
+
# is_alive() is prone to a race condition so catch the case that the PID is already dead
|
|
236
|
+
if self.executor_process.is_alive():
|
|
237
|
+
self.log.debug('sending SIGTERM to worker process {:d}'.format(pid))
|
|
238
|
+
self.executor_process.terminate()
|
|
239
|
+
# try:
|
|
240
|
+
# os.kill(self.executor_process.pid, signal.SIGINT)
|
|
241
|
+
# except ProcessLookupError:
|
|
242
|
+
# self.log.debug('worker process {:d} already dead'.format(pid))
|
|
243
|
+
self.executor_process.join(self.shutdown_timeout)
|
|
244
|
+
if self.executor_process.is_alive():
|
|
245
|
+
self.executor_process.kill()
|
|
246
|
+
self.log.warning('sending SIGKILL to worker process {:d}'.format(pid))
|
|
247
|
+
# try:
|
|
248
|
+
# os.kill(self.executor_process.pid, signal.SIGKILL)
|
|
249
|
+
# except ProcessLookupError:
|
|
250
|
+
# self.log.debug('worker process {:d} already dead'.format(pid))
|
|
251
|
+
self.executor_process.join()
|
|
252
|
+
self.log.debug('worker process {:d} terminated'.format(pid))
|
|
253
|
+
else:
|
|
254
|
+
self.log.debug('worker process {:d} terminated gracefully with code {:d}'.format(pid, self.executor_process.exitcode))
|
|
255
|
+
|
|
256
|
+
def install_signal_handlers(self, signals=None):
|
|
257
|
+
if not signals:
|
|
258
|
+
signals = {signal.SIGINT, signal.SIGQUIT, signal.SIGTERM}
|
|
259
|
+
|
|
260
|
+
for sig in signals:
|
|
261
|
+
signal.signal(sig, signal.SIG_IGN)
|
|
262
|
+
|
|
263
|
+
def startup(self, process_index=None):
|
|
264
|
+
self.install_signal_handlers()
|
|
265
|
+
executor = ZMQExecutor(self.task_endpoint, self.result_endpoint)
|
|
266
|
+
self.executor_process = multiprocessing.Process(target=executor.startup, args=(process_index,))
|
|
267
|
+
self.executor_process.start()
|
|
268
|
+
self.context = zmq.Context()
|
|
269
|
+
self.comm_thread = threading.Thread(target=self.comm_loop)
|
|
270
|
+
self.comm_thread.start()
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class ZMQExecutor(ZMQCore):
|
|
274
|
+
'''The is the component of the ZMQ WM worker that actually executes tasks.
|
|
275
|
+
This is isolated in a separate process and controlled via ZMQ from
|
|
276
|
+
the ZMQWorker.'''
|
|
277
|
+
|
|
278
|
+
def __init__(self, task_endpoint, result_endpoint):
|
|
279
|
+
super().__init__()
|
|
280
|
+
|
|
281
|
+
self.task_endpoint = task_endpoint
|
|
282
|
+
self.result_endpoint = result_endpoint
|
|
283
|
+
|
|
284
|
+
def comm_loop(self):
|
|
285
|
+
task_socket = self.context.socket(zmq.PULL)
|
|
286
|
+
result_socket = self.context.socket(zmq.PUSH)
|
|
287
|
+
|
|
288
|
+
task_socket.bind(self.task_endpoint)
|
|
289
|
+
result_socket.connect(self.result_endpoint)
|
|
290
|
+
|
|
291
|
+
self.log.info('This is {}'.format(self.node_description))
|
|
292
|
+
|
|
293
|
+
try:
|
|
294
|
+
while True:
|
|
295
|
+
try:
|
|
296
|
+
msg = self.recv_message(task_socket, timeout=100)
|
|
297
|
+
except KeyboardInterrupt:
|
|
298
|
+
break
|
|
299
|
+
except ZMQWMTimeout:
|
|
300
|
+
continue
|
|
301
|
+
else:
|
|
302
|
+
if msg.message == Message.TASK:
|
|
303
|
+
task = msg.payload
|
|
304
|
+
result = task.execute()
|
|
305
|
+
self.send_message(result_socket, Message.RESULT, result)
|
|
306
|
+
elif msg.message == Message.SHUTDOWN:
|
|
307
|
+
break
|
|
308
|
+
finally:
|
|
309
|
+
self.context.destroy(linger=0)
|
|
310
|
+
self.context = None
|
|
311
|
+
|
|
312
|
+
def startup(self, process_index=None):
|
|
313
|
+
if process_index is not None:
|
|
314
|
+
from westpa.work_managers import environment
|
|
315
|
+
|
|
316
|
+
pi_name = '{}_PROCESS_INDEX'.format(environment.WMEnvironment.env_prefix)
|
|
317
|
+
self.log.debug('Setting {}={}'.format(pi_name, process_index))
|
|
318
|
+
os.environ[pi_name] = str(process_index)
|
|
319
|
+
self.context = zmq.Context()
|
|
320
|
+
self.comm_loop()
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
WESTPA development is led by Lillian Chong (ltchong@pitt.edu)
|
|
2
|
+
in collaboration with Daniel Zuckerman (zuckermd@ohsu.edu)
|
|
3
|
+
|
|
4
|
+
The original version of WESTPA was written by Matthew Zwier (matthew.zwier@drake.edu)
|
|
5
|
+
as part of his Ph.D. dissertation with Lillian Chong.
|
|
6
|
+
|
|
7
|
+
Other core contributors are the following (in alphabetical order)
|
|
8
|
+
|
|
9
|
+
Joshua Adelman
|
|
10
|
+
Anthony Bogetti
|
|
11
|
+
Jeremy Leung
|
|
12
|
+
AJ Pratt
|
|
13
|
+
John Russo
|
|
14
|
+
Ali Saglam
|
|
15
|
+
Jeff Thompson
|
|
16
|
+
Kim Wong
|
|
17
|
+
Darian Yang
|
|
18
|
+
She Zhang
|
|
19
|
+
|
|
20
|
+
The work manager interface is derived from the ``concurrent.futures`` module
|
|
21
|
+
of Python 3.2 by Brian Quinlan, (C) 2011 the Python Software Foundation.
|
|
22
|
+
See http://docs.python.org/3/license.html for more information.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013 WESTPA Developers
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: westpa
|
|
3
|
+
Version: 2022.12
|
|
4
|
+
Summary: WESTPA is a package for constructing and running stochastic simulations using the "weighted ensemble" approach of Huber and Kim (1996).
|
|
5
|
+
Home-page: http://github.com/westpa/westpa
|
|
6
|
+
License: MIT
|
|
7
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: Intended Audience :: Science/Research
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Operating System :: POSIX
|
|
12
|
+
Classifier: Programming Language :: Python
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Cython
|
|
15
|
+
Requires-Python: >=3.9
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
License-File: AUTHORS
|
|
18
|
+
Requires-Dist: numpy<3,>=1.25.0; python_version >= "3.10"
|
|
19
|
+
Requires-Dist: numpy<2,>=1.25.0; python_version < "3.10"
|
|
20
|
+
Requires-Dist: scipy>=0.19.1
|
|
21
|
+
Requires-Dist: h5py>=2.10
|
|
22
|
+
Requires-Dist: mdtraj>=1.9.5
|
|
23
|
+
Requires-Dist: pyyaml
|
|
24
|
+
Requires-Dist: pyzmq
|
|
25
|
+
Requires-Dist: matplotlib
|
|
26
|
+
Requires-Dist: blessings
|
|
27
|
+
Requires-Dist: ipykernel
|
|
28
|
+
Requires-Dist: tqdm
|
|
29
|
+
Requires-Dist: pandas
|
|
30
|
+
Requires-Dist: tables
|
|
31
|
+
Provides-Extra: tests
|
|
32
|
+
Requires-Dist: pytest; extra == "tests"
|
|
33
|
+
Requires-Dist: pytest-cov; extra == "tests"
|
|
34
|
+
Requires-Dist: pytest-rerunfailures; extra == "tests"
|
|
35
|
+
Requires-Dist: pytest-timeout; extra == "tests"
|
|
36
|
+
Provides-Extra: mpi
|
|
37
|
+
Requires-Dist: mpi4py; extra == "mpi"
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: pytest; extra == "dev"
|
|
40
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
41
|
+
Requires-Dist: pytest-rerunfailures; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest-timeout; extra == "dev"
|
|
43
|
+
Requires-Dist: pre-commit; extra == "dev"
|
|
44
|
+
Dynamic: classifier
|
|
45
|
+
Dynamic: description
|
|
46
|
+
Dynamic: home-page
|
|
47
|
+
Dynamic: keywords
|
|
48
|
+
Dynamic: license
|
|
49
|
+
Dynamic: provides-extra
|
|
50
|
+
Dynamic: requires-dist
|
|
51
|
+
Dynamic: requires-python
|
|
52
|
+
Dynamic: summary
|
|
53
|
+
|
|
54
|
+
===============
|
|
55
|
+
WESTPA 2.0
|
|
56
|
+
===============
|
|
57
|
+
|
|
58
|
+
|ghactions| |anaconda| |tutorial|
|
|
59
|
+
|
|
60
|
+
|docs| |usersgroup| |develgroup|
|
|
61
|
+
|
|
62
|
+
.. |ghactions| image:: https://github.com/westpa/westpa/actions/workflows/test.yaml/badge.svg?branch=westpa2
|
|
63
|
+
:target: https://github.com/westpa/westpa/actions/workflows/test.yaml
|
|
64
|
+
:alt: GitHub Actions
|
|
65
|
+
|
|
66
|
+
.. |docs| image:: https://readthedocs.org/projects/westpa/badge/?version=latest
|
|
67
|
+
:target: https://westpa.readthedocs.io/en/latest/?badge=latest
|
|
68
|
+
:alt: Documentation Status
|
|
69
|
+
|
|
70
|
+
.. |tutorial| image:: https://img.shields.io/badge/WESTPA-tutorials-blueviolet.svg
|
|
71
|
+
:target: https://github.com/westpa/tutorials
|
|
72
|
+
:alt: WESTPA Tutorials GitHub
|
|
73
|
+
|
|
74
|
+
.. |usersgroup| image:: https://img.shields.io/badge/Google%20Group-Users-lightgrey.svg
|
|
75
|
+
:target: http://groups.google.com/group/westpa-users
|
|
76
|
+
:alt: Users Google Group
|
|
77
|
+
|
|
78
|
+
.. |develgroup| image:: https://img.shields.io/badge/Google%20Group-Developers-lightgrey.svg
|
|
79
|
+
:target: https://groups.google.com/g/westpa-devel
|
|
80
|
+
:alt: Developers Google Group
|
|
81
|
+
|
|
82
|
+
.. |anaconda| image:: https://anaconda.org/conda-forge/westpa/badges/version.svg
|
|
83
|
+
:alt: Anaconda
|
|
84
|
+
:target: https://anaconda.org/conda-forge/westpa
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
--------
|
|
88
|
+
Overview
|
|
89
|
+
--------
|
|
90
|
+
|
|
91
|
+
WESTPA is a package for constructing and running stochastic simulations using the "weighted ensemble" approach
|
|
92
|
+
of Huber and Kim (1996). For use of WESTPA please cite the following:
|
|
93
|
+
|
|
94
|
+
Zwier, M.C., Adelman, J.L., Kaus, J.W., Pratt, A.J., Wong, K.F., Rego, N.B., Suarez, E., Lettieri, S.,
|
|
95
|
+
Wang, D.W., Grabe, M., Zuckerman, D.M., and Chong, L.T. "WESTPA: An Interoperable, Highly
|
|
96
|
+
Scalable Software Package For Weighted Ensemble Simulation and Analysis," J. Chem. Theory Comput., 11: 800−809 (2015).
|
|
97
|
+
|
|
98
|
+
Russo, J. D., Zhang, S., Leung, J.M.G., Bogetti, A.T., Thompson, J.P., DeGrave, A.J., Torrillo, P.A., Pratt, A.J.,
|
|
99
|
+
Wong, K.F., Xia, J., Copperman, J., Adelman, J.L., Zwier, M.C., LeBard, D.N., Zuckerman, D.M., Chong, L.T.
|
|
100
|
+
WESTPA 2.0: High-Performance Upgrades for Weighted Ensemble Simulations and Analysis of Longer-Timescale Applications.
|
|
101
|
+
J. Chem. Theory Comput., 18 (2): 638–649 (2022).
|
|
102
|
+
|
|
103
|
+
See this page_ and this powerpoint_ for an overview of weighted ensemble simulation.
|
|
104
|
+
|
|
105
|
+
To help us fund development and improve WESTPA please fill out a one-minute survey_ and consider
|
|
106
|
+
contributing documentation or code to the WESTPA community.
|
|
107
|
+
|
|
108
|
+
WESTPA is free software, licensed under the terms of the MIT License. See the file ``LICENSE`` for more information.
|
|
109
|
+
|
|
110
|
+
.. _survey: https://docs.google.com/forms/d/e/1FAIpQLSfWaB2aryInU06cXrCyAFmhD_gPibgOfFk-dspLEsXuS9-RGQ/viewform
|
|
111
|
+
.. _page: https://westpa.github.io/westpa/overview.html
|
|
112
|
+
.. _powerpoint: https://docs.google.com/presentation/d/1PKsklN5aYLlLSTDOLdNGti6pcGs4Rgxm/edit?usp=sharing&ouid=117278498028744119802&rtpof=true&sd=true
|
|
113
|
+
|
|
114
|
+
------------
|
|
115
|
+
Requirements
|
|
116
|
+
------------
|
|
117
|
+
|
|
118
|
+
WESTPA is written in Python and requires version 3.9 or later. WESTPA also requires a number of Python scientific software packages.
|
|
119
|
+
The simplest way to meet these requirements is to download the
|
|
120
|
+
Anaconda Python distribution from www.anaconda.com (free for all users).
|
|
121
|
+
|
|
122
|
+
WESTPA currently runs on Unix-like operating systems, including Linux and
|
|
123
|
+
Mac OS X. It is developed and tested on x86_64 machines running Linux.
|
|
124
|
+
|
|
125
|
+
--------------------------------
|
|
126
|
+
Obtaining and Installing WESTPA
|
|
127
|
+
--------------------------------
|
|
128
|
+
|
|
129
|
+
WESTPA is developed and tested on Unix-like operating systems, including Linux and Mac OS X.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
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::
|
|
133
|
+
|
|
134
|
+
conda create -n westpa python=3.11
|
|
135
|
+
conda activate westpa
|
|
136
|
+
|
|
137
|
+
Then, we recommend installing WESTPA through conda or pip. Execute either of the following::
|
|
138
|
+
|
|
139
|
+
conda install -c conda-forge westpa
|
|
140
|
+
|
|
141
|
+
or::
|
|
142
|
+
|
|
143
|
+
python -m pip install westpa
|
|
144
|
+
|
|
145
|
+
See the install instructions on our `wiki`_ for more detailed information.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
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::
|
|
149
|
+
|
|
150
|
+
tar xvzf westpa-2022.11.tar.gz
|
|
151
|
+
cd westpa
|
|
152
|
+
python -m pip install -e .
|
|
153
|
+
|
|
154
|
+
.. _`releases page`: https://github.com/westpa/westpa/releases
|
|
155
|
+
.. _`Anaconda Python distribution`: https://www.anaconda.com/download
|
|
156
|
+
.. _`wiki`: https://github.com/westpa/westpa/wiki/Installing-WESTPA
|
|
157
|
+
|
|
158
|
+
---------------
|
|
159
|
+
Getting started
|
|
160
|
+
---------------
|
|
161
|
+
|
|
162
|
+
High-level tutorials of how to use the WESTPA software can be found here_.
|
|
163
|
+
Further, all WESTPA command-line tools provide detailed help when
|
|
164
|
+
given the -h/--help option.
|
|
165
|
+
|
|
166
|
+
Finally, while WESTPA is a powerful tool that enables expert simulators to access much longer
|
|
167
|
+
timescales than is practical with standard simulations, there can be a steep learning curve to
|
|
168
|
+
figuring out how to effectively run the simulations on your computing resource of choice.
|
|
169
|
+
For serious users who have completed the online tutorials and are ready for production simulations
|
|
170
|
+
of their system, we invite you to contact Lillian Chong (ltchong AT pitt DOT edu) about spending
|
|
171
|
+
a few days with her lab and/or setting up video conferencing sessions to help you get your
|
|
172
|
+
simulations off the ground.
|
|
173
|
+
|
|
174
|
+
.. _here: https://github.com/westpa/westpa/wiki/Tutorials
|
|
175
|
+
|
|
176
|
+
------------
|
|
177
|
+
Getting help
|
|
178
|
+
------------
|
|
179
|
+
|
|
180
|
+
WESTPA FAQ_
|
|
181
|
+
|
|
182
|
+
A mailing list for WESTPA is available, at which one can ask questions (or see
|
|
183
|
+
if a question one has was previously addressed). This is the preferred means
|
|
184
|
+
for obtaining help and support. See http://groups.google.com/group/westpa-users
|
|
185
|
+
to sign up or search archived messages.
|
|
186
|
+
|
|
187
|
+
.. _FAQ: https://github.com/westpa/westpa/wiki/Frequently-Asked-Questions
|
|
188
|
+
|
|
189
|
+
----------
|
|
190
|
+
Developers
|
|
191
|
+
----------
|
|
192
|
+
|
|
193
|
+
Search archived messages or post to the westpa-devel Google group: https://groups.google.com/group/westpa-devel.
|