westpa 2022.10__cp312-cp312-manylinux_2_17_x86_64.manylinux2014_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.

Files changed (150) hide show
  1. westpa/__init__.py +14 -0
  2. westpa/_version.py +21 -0
  3. westpa/analysis/__init__.py +5 -0
  4. westpa/analysis/core.py +746 -0
  5. westpa/analysis/statistics.py +27 -0
  6. westpa/analysis/trajectories.py +360 -0
  7. westpa/cli/__init__.py +0 -0
  8. westpa/cli/core/__init__.py +0 -0
  9. westpa/cli/core/w_fork.py +152 -0
  10. westpa/cli/core/w_init.py +230 -0
  11. westpa/cli/core/w_run.py +77 -0
  12. westpa/cli/core/w_states.py +212 -0
  13. westpa/cli/core/w_succ.py +99 -0
  14. westpa/cli/core/w_truncate.py +59 -0
  15. westpa/cli/tools/__init__.py +0 -0
  16. westpa/cli/tools/ploterr.py +506 -0
  17. westpa/cli/tools/plothist.py +706 -0
  18. westpa/cli/tools/w_assign.py +596 -0
  19. westpa/cli/tools/w_bins.py +166 -0
  20. westpa/cli/tools/w_crawl.py +119 -0
  21. westpa/cli/tools/w_direct.py +547 -0
  22. westpa/cli/tools/w_dumpsegs.py +94 -0
  23. westpa/cli/tools/w_eddist.py +506 -0
  24. westpa/cli/tools/w_fluxanl.py +378 -0
  25. westpa/cli/tools/w_ipa.py +833 -0
  26. westpa/cli/tools/w_kinavg.py +127 -0
  27. westpa/cli/tools/w_kinetics.py +96 -0
  28. westpa/cli/tools/w_multi_west.py +414 -0
  29. westpa/cli/tools/w_ntop.py +213 -0
  30. westpa/cli/tools/w_pdist.py +515 -0
  31. westpa/cli/tools/w_postanalysis_matrix.py +82 -0
  32. westpa/cli/tools/w_postanalysis_reweight.py +53 -0
  33. westpa/cli/tools/w_red.py +486 -0
  34. westpa/cli/tools/w_reweight.py +780 -0
  35. westpa/cli/tools/w_select.py +226 -0
  36. westpa/cli/tools/w_stateprobs.py +111 -0
  37. westpa/cli/tools/w_trace.py +599 -0
  38. westpa/core/__init__.py +0 -0
  39. westpa/core/_rc.py +673 -0
  40. westpa/core/binning/__init__.py +55 -0
  41. westpa/core/binning/_assign.cpython-312-x86_64-linux-gnu.so +0 -0
  42. westpa/core/binning/assign.py +449 -0
  43. westpa/core/binning/binless.py +96 -0
  44. westpa/core/binning/binless_driver.py +54 -0
  45. westpa/core/binning/binless_manager.py +190 -0
  46. westpa/core/binning/bins.py +47 -0
  47. westpa/core/binning/mab.py +427 -0
  48. westpa/core/binning/mab_driver.py +54 -0
  49. westpa/core/binning/mab_manager.py +198 -0
  50. westpa/core/data_manager.py +1694 -0
  51. westpa/core/extloader.py +74 -0
  52. westpa/core/h5io.py +995 -0
  53. westpa/core/kinetics/__init__.py +24 -0
  54. westpa/core/kinetics/_kinetics.cpython-312-x86_64-linux-gnu.so +0 -0
  55. westpa/core/kinetics/events.py +147 -0
  56. westpa/core/kinetics/matrates.py +156 -0
  57. westpa/core/kinetics/rate_averaging.py +266 -0
  58. westpa/core/progress.py +218 -0
  59. westpa/core/propagators/__init__.py +54 -0
  60. westpa/core/propagators/executable.py +715 -0
  61. westpa/core/reweight/__init__.py +14 -0
  62. westpa/core/reweight/_reweight.cpython-312-x86_64-linux-gnu.so +0 -0
  63. westpa/core/reweight/matrix.py +126 -0
  64. westpa/core/segment.py +119 -0
  65. westpa/core/sim_manager.py +830 -0
  66. westpa/core/states.py +359 -0
  67. westpa/core/systems.py +93 -0
  68. westpa/core/textio.py +74 -0
  69. westpa/core/trajectory.py +330 -0
  70. westpa/core/we_driver.py +908 -0
  71. westpa/core/wm_ops.py +43 -0
  72. westpa/core/yamlcfg.py +391 -0
  73. westpa/fasthist/__init__.py +34 -0
  74. westpa/fasthist/__main__.py +110 -0
  75. westpa/fasthist/_fasthist.cpython-312-x86_64-linux-gnu.so +0 -0
  76. westpa/mclib/__init__.py +264 -0
  77. westpa/mclib/__main__.py +28 -0
  78. westpa/mclib/_mclib.cpython-312-x86_64-linux-gnu.so +0 -0
  79. westpa/oldtools/__init__.py +4 -0
  80. westpa/oldtools/aframe/__init__.py +35 -0
  81. westpa/oldtools/aframe/atool.py +75 -0
  82. westpa/oldtools/aframe/base_mixin.py +26 -0
  83. westpa/oldtools/aframe/binning.py +178 -0
  84. westpa/oldtools/aframe/data_reader.py +560 -0
  85. westpa/oldtools/aframe/iter_range.py +200 -0
  86. westpa/oldtools/aframe/kinetics.py +117 -0
  87. westpa/oldtools/aframe/mcbs.py +146 -0
  88. westpa/oldtools/aframe/output.py +39 -0
  89. westpa/oldtools/aframe/plotting.py +90 -0
  90. westpa/oldtools/aframe/trajwalker.py +126 -0
  91. westpa/oldtools/aframe/transitions.py +469 -0
  92. westpa/oldtools/cmds/__init__.py +0 -0
  93. westpa/oldtools/cmds/w_ttimes.py +358 -0
  94. westpa/oldtools/files.py +34 -0
  95. westpa/oldtools/miscfn.py +23 -0
  96. westpa/oldtools/stats/__init__.py +4 -0
  97. westpa/oldtools/stats/accumulator.py +35 -0
  98. westpa/oldtools/stats/edfs.py +129 -0
  99. westpa/oldtools/stats/mcbs.py +89 -0
  100. westpa/tools/__init__.py +33 -0
  101. westpa/tools/binning.py +472 -0
  102. westpa/tools/core.py +340 -0
  103. westpa/tools/data_reader.py +159 -0
  104. westpa/tools/dtypes.py +31 -0
  105. westpa/tools/iter_range.py +198 -0
  106. westpa/tools/kinetics_tool.py +340 -0
  107. westpa/tools/plot.py +283 -0
  108. westpa/tools/progress.py +17 -0
  109. westpa/tools/selected_segs.py +154 -0
  110. westpa/tools/wipi.py +751 -0
  111. westpa/trajtree/__init__.py +4 -0
  112. westpa/trajtree/_trajtree.cpython-312-x86_64-linux-gnu.so +0 -0
  113. westpa/trajtree/trajtree.py +117 -0
  114. westpa/westext/__init__.py +0 -0
  115. westpa/westext/adaptvoronoi/__init__.py +3 -0
  116. westpa/westext/adaptvoronoi/adaptVor_driver.py +214 -0
  117. westpa/westext/hamsm_restarting/__init__.py +3 -0
  118. westpa/westext/hamsm_restarting/example_overrides.py +35 -0
  119. westpa/westext/hamsm_restarting/restart_driver.py +1165 -0
  120. westpa/westext/stringmethod/__init__.py +11 -0
  121. westpa/westext/stringmethod/fourier_fitting.py +69 -0
  122. westpa/westext/stringmethod/string_driver.py +253 -0
  123. westpa/westext/stringmethod/string_method.py +306 -0
  124. westpa/westext/weed/BinCluster.py +180 -0
  125. westpa/westext/weed/ProbAdjustEquil.py +100 -0
  126. westpa/westext/weed/UncertMath.py +247 -0
  127. westpa/westext/weed/__init__.py +10 -0
  128. westpa/westext/weed/weed_driver.py +182 -0
  129. westpa/westext/wess/ProbAdjust.py +101 -0
  130. westpa/westext/wess/__init__.py +6 -0
  131. westpa/westext/wess/wess_driver.py +207 -0
  132. westpa/work_managers/__init__.py +57 -0
  133. westpa/work_managers/core.py +396 -0
  134. westpa/work_managers/environment.py +134 -0
  135. westpa/work_managers/mpi.py +318 -0
  136. westpa/work_managers/processes.py +187 -0
  137. westpa/work_managers/serial.py +28 -0
  138. westpa/work_managers/threads.py +79 -0
  139. westpa/work_managers/zeromq/__init__.py +20 -0
  140. westpa/work_managers/zeromq/core.py +641 -0
  141. westpa/work_managers/zeromq/node.py +131 -0
  142. westpa/work_managers/zeromq/work_manager.py +526 -0
  143. westpa/work_managers/zeromq/worker.py +320 -0
  144. westpa-2022.10.dist-info/AUTHORS +22 -0
  145. westpa-2022.10.dist-info/LICENSE +21 -0
  146. westpa-2022.10.dist-info/METADATA +183 -0
  147. westpa-2022.10.dist-info/RECORD +150 -0
  148. westpa-2022.10.dist-info/WHEEL +6 -0
  149. westpa-2022.10.dist-info/entry_points.txt +29 -0
  150. westpa-2022.10.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 contributors are the following (In alphabetical order)
8
+
9
+ Joshua Adelman
10
+ Alex DeGrave
11
+ Page Harrison
12
+ Joseph Kaus
13
+ Patrick Pisciuneri
14
+ A. J. Pratt
15
+ Nicholas Rego
16
+ Ali Saglam
17
+ David Wang
18
+ Kim Wong
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,183 @@
1
+ Metadata-Version: 2.1
2
+ Name: westpa
3
+ Version: 2022.10
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.6
16
+ License-File: LICENSE
17
+ License-File: AUTHORS
18
+ Requires-Dist: numpy <2,>=1.16.0
19
+ Requires-Dist: scipy >=0.19.1
20
+ Requires-Dist: h5py >=2.10
21
+ Requires-Dist: mdtraj >=1.9.5
22
+ Requires-Dist: pyyaml
23
+ Requires-Dist: pyzmq
24
+ Requires-Dist: matplotlib
25
+ Requires-Dist: blessings
26
+ Requires-Dist: ipykernel
27
+ Requires-Dist: tqdm
28
+ Requires-Dist: pandas
29
+ Requires-Dist: tables
30
+ Provides-Extra: dev
31
+ Requires-Dist: pytest ; extra == 'dev'
32
+ Requires-Dist: pytest-cov ; extra == 'dev'
33
+ Requires-Dist: pytest-rerunfailures ; extra == 'dev'
34
+ Requires-Dist: pytest-timeout ; extra == 'dev'
35
+ Requires-Dist: pre-commit ; extra == 'dev'
36
+ Provides-Extra: mpi
37
+ Requires-Dist: mpi4py ; extra == 'mpi'
38
+ Provides-Extra: tests
39
+ Requires-Dist: pytest ; extra == 'tests'
40
+ Requires-Dist: pytest-cov ; extra == 'tests'
41
+ Requires-Dist: pytest-rerunfailures ; extra == 'tests'
42
+ Requires-Dist: pytest-timeout ; extra == 'tests'
43
+
44
+ ===============
45
+ WESTPA 2.0
46
+ ===============
47
+
48
+ |ghactions| |anaconda| |tutorial|
49
+
50
+ |docs| |usersgroup| |develgroup|
51
+
52
+ .. |ghactions| image:: https://github.com/westpa/westpa/actions/workflows/test.yaml/badge.svg?branch=westpa2
53
+ :target: https://github.com/westpa/westpa/actions/workflows/test.yaml
54
+ :alt: GitHub Actions
55
+
56
+ .. |docs| image:: https://readthedocs.org/projects/westpa/badge/?version=latest
57
+ :target: https://westpa.readthedocs.io/en/latest/?badge=latest
58
+ :alt: Documentation Status
59
+
60
+ .. |tutorial| image:: https://img.shields.io/badge/WESTPA-tutorials-blueviolet.svg
61
+ :target: https://github.com/westpa/tutorials
62
+ :alt: WESTPA Tutorials GitHub
63
+
64
+ .. |usersgroup| image:: https://img.shields.io/badge/Google%20Group-Users-lightgrey.svg
65
+ :target: http://groups.google.com/group/westpa-users
66
+ :alt: Users Google Group
67
+
68
+ .. |develgroup| image:: https://img.shields.io/badge/Google%20Group-Developers-lightgrey.svg
69
+ :target: https://groups.google.com/g/westpa-devel
70
+ :alt: Developers Google Group
71
+
72
+ .. |anaconda| image:: https://anaconda.org/conda-forge/westpa/badges/version.svg
73
+ :alt: Anaconda
74
+ :target: https://anaconda.org/conda-forge/westpa
75
+
76
+
77
+ --------
78
+ Overview
79
+ --------
80
+
81
+ WESTPA is a package for constructing and running stochastic simulations using the "weighted ensemble" approach
82
+ of Huber and Kim (1996). For use of WESTPA please cite the following:
83
+
84
+ Zwier, M.C., Adelman, J.L., Kaus, J.W., Pratt, A.J., Wong, K.F., Rego, N.B., Suarez, E., Lettieri, S.,
85
+ Wang, D.W., Grabe, M., Zuckerman, D.M., and Chong, L.T. "WESTPA: An Interoperable, Highly
86
+ Scalable Software Package For Weighted Ensemble Simulation and Analysis," J. Chem. Theory Comput., 11: 800−809 (2015).
87
+
88
+ Russo, J. D., Zhang, S., Leung, J.M.G., Bogetti, A.T., Thompson, J.P., DeGrave, A.J., Torrillo, P.A., Pratt, A.J.,
89
+ Wong, K.F., Xia, J., Copperman, J., Adelman, J.L., Zwier, M.C., LeBard, D.N., Zuckerman, D.M., Chong, L.T.
90
+ WESTPA 2.0: High-Performance Upgrades for Weighted Ensemble Simulations and Analysis of Longer-Timescale Applications.
91
+ J. Chem. Theory Comput., 18 (2): 638–649 (2022).
92
+
93
+ See this page_ and this powerpoint_ for an overview of weighted ensemble simulation.
94
+
95
+ To help us fund development and improve WESTPA please fill out a one-minute survey_ and consider
96
+ contributing documentation or code to the WESTPA community.
97
+
98
+ WESTPA is free software, licensed under the terms of the MIT License. See the file ``LICENSE`` for more information.
99
+
100
+ .. _survey: https://docs.google.com/forms/d/e/1FAIpQLSfWaB2aryInU06cXrCyAFmhD_gPibgOfFk-dspLEsXuS9-RGQ/viewform
101
+ .. _page: https://westpa.github.io/westpa/overview.html
102
+ .. _powerpoint: https://docs.google.com/presentation/d/1PKsklN5aYLlLSTDOLdNGti6pcGs4Rgxm/edit?usp=sharing&ouid=117278498028744119802&rtpof=true&sd=true
103
+
104
+ ------------
105
+ Requirements
106
+ ------------
107
+
108
+ WESTPA is written in Python and requires version 3.7 or later. WESTPA also requires a number of Python scientific software packages.
109
+ The simplest way to meet these requirements is to download the
110
+ Anaconda Python distribution from www.anaconda.com (free for all users).
111
+
112
+ WESTPA currently runs on Unix-like operating systems, including Linux and
113
+ Mac OS X. It is developed and tested on x86_64 machines running Linux.
114
+
115
+ --------------------------------
116
+ Obtaining and Installing WESTPA
117
+ --------------------------------
118
+
119
+ WESTPA is developed and tested on Unix-like operating systems, including Linux and Mac OS X.
120
+
121
+
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
+
124
+ conda create -n westpa python=3.11
125
+ conda activate westpa
126
+
127
+ Then, we recommend installing WESTPA through conda or pip. Execute either of the following::
128
+
129
+ conda install -c conda-forge westpa
130
+
131
+ or::
132
+
133
+ python -m pip install westpa
134
+
135
+ See the install instructions on our `wiki`_ for more detailed information.
136
+
137
+
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
+
140
+ tar xvzf westpa-2022.09.tar.gz
141
+ cd westpa
142
+ python -m pip install -e .
143
+
144
+ .. _`releases page`: https://github.com/westpa/westpa/releases
145
+ .. _`Anaconda Python distribution`: https://www.anaconda.com/download
146
+ .. _`wiki`: https://github.com/westpa/westpa/wiki/Installing-WESTPA
147
+
148
+ ---------------
149
+ Getting started
150
+ ---------------
151
+
152
+ High-level tutorials of how to use the WESTPA software can be found here_.
153
+ Further, all WESTPA command-line tools provide detailed help when
154
+ given the -h/--help option.
155
+
156
+ Finally, while WESTPA is a powerful tool that enables expert simulators to access much longer
157
+ timescales than is practical with standard simulations, there can be a steep learning curve to
158
+ figuring out how to effectively run the simulations on your computing resource of choice.
159
+ For serious users who have completed the online tutorials and are ready for production simulations
160
+ of their system, we invite you to contact Lillian Chong (ltchong AT pitt DOT edu) about spending
161
+ a few days with her lab and/or setting up video conferencing sessions to help you get your
162
+ simulations off the ground.
163
+
164
+ .. _here: https://github.com/westpa/westpa/wiki/Tutorials
165
+
166
+ ------------
167
+ Getting help
168
+ ------------
169
+
170
+ WESTPA FAQ_
171
+
172
+ A mailing list for WESTPA is available, at which one can ask questions (or see
173
+ if a question one has was previously addressed). This is the preferred means
174
+ for obtaining help and support. See http://groups.google.com/group/westpa-users
175
+ to sign up or search archived messages.
176
+
177
+ .. _FAQ: https://github.com/westpa/westpa/wiki/Frequently-Asked-Questions
178
+
179
+ ----------
180
+ Developers
181
+ ----------
182
+
183
+ Search archived messages or post to the westpa-devel Google group: https://groups.google.com/group/westpa-devel.