westpa 2022.12__cp312-cp312-macosx_10_13_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 (149) 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 +68 -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 +376 -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 +491 -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-darwin.so +0 -0
  42. westpa/core/binning/assign.py +455 -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 +506 -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-darwin.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 +719 -0
  61. westpa/core/reweight/__init__.py +14 -0
  62. westpa/core/reweight/_reweight.cpython-312-darwin.so +0 -0
  63. westpa/core/reweight/matrix.py +126 -0
  64. westpa/core/segment.py +119 -0
  65. westpa/core/sim_manager.py +835 -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 +910 -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/_fasthist.cpython-312-darwin.so +0 -0
  75. westpa/mclib/__init__.py +271 -0
  76. westpa/mclib/__main__.py +28 -0
  77. westpa/mclib/_mclib.cpython-312-darwin.so +0 -0
  78. westpa/oldtools/__init__.py +4 -0
  79. westpa/oldtools/aframe/__init__.py +35 -0
  80. westpa/oldtools/aframe/atool.py +75 -0
  81. westpa/oldtools/aframe/base_mixin.py +26 -0
  82. westpa/oldtools/aframe/binning.py +178 -0
  83. westpa/oldtools/aframe/data_reader.py +560 -0
  84. westpa/oldtools/aframe/iter_range.py +200 -0
  85. westpa/oldtools/aframe/kinetics.py +117 -0
  86. westpa/oldtools/aframe/mcbs.py +153 -0
  87. westpa/oldtools/aframe/output.py +39 -0
  88. westpa/oldtools/aframe/plotting.py +90 -0
  89. westpa/oldtools/aframe/trajwalker.py +126 -0
  90. westpa/oldtools/aframe/transitions.py +469 -0
  91. westpa/oldtools/cmds/__init__.py +0 -0
  92. westpa/oldtools/cmds/w_ttimes.py +361 -0
  93. westpa/oldtools/files.py +34 -0
  94. westpa/oldtools/miscfn.py +23 -0
  95. westpa/oldtools/stats/__init__.py +4 -0
  96. westpa/oldtools/stats/accumulator.py +35 -0
  97. westpa/oldtools/stats/edfs.py +129 -0
  98. westpa/oldtools/stats/mcbs.py +96 -0
  99. westpa/tools/__init__.py +33 -0
  100. westpa/tools/binning.py +472 -0
  101. westpa/tools/core.py +340 -0
  102. westpa/tools/data_reader.py +159 -0
  103. westpa/tools/dtypes.py +31 -0
  104. westpa/tools/iter_range.py +198 -0
  105. westpa/tools/kinetics_tool.py +340 -0
  106. westpa/tools/plot.py +283 -0
  107. westpa/tools/progress.py +17 -0
  108. westpa/tools/selected_segs.py +154 -0
  109. westpa/tools/wipi.py +751 -0
  110. westpa/trajtree/__init__.py +4 -0
  111. westpa/trajtree/_trajtree.cpython-312-darwin.so +0 -0
  112. westpa/trajtree/trajtree.py +117 -0
  113. westpa/westext/__init__.py +0 -0
  114. westpa/westext/adaptvoronoi/__init__.py +3 -0
  115. westpa/westext/adaptvoronoi/adaptVor_driver.py +214 -0
  116. westpa/westext/hamsm_restarting/__init__.py +3 -0
  117. westpa/westext/hamsm_restarting/example_overrides.py +35 -0
  118. westpa/westext/hamsm_restarting/restart_driver.py +1165 -0
  119. westpa/westext/stringmethod/__init__.py +11 -0
  120. westpa/westext/stringmethod/fourier_fitting.py +69 -0
  121. westpa/westext/stringmethod/string_driver.py +253 -0
  122. westpa/westext/stringmethod/string_method.py +306 -0
  123. westpa/westext/weed/BinCluster.py +180 -0
  124. westpa/westext/weed/ProbAdjustEquil.py +100 -0
  125. westpa/westext/weed/UncertMath.py +247 -0
  126. westpa/westext/weed/__init__.py +10 -0
  127. westpa/westext/weed/weed_driver.py +192 -0
  128. westpa/westext/wess/ProbAdjust.py +101 -0
  129. westpa/westext/wess/__init__.py +6 -0
  130. westpa/westext/wess/wess_driver.py +217 -0
  131. westpa/work_managers/__init__.py +57 -0
  132. westpa/work_managers/core.py +396 -0
  133. westpa/work_managers/environment.py +134 -0
  134. westpa/work_managers/mpi.py +318 -0
  135. westpa/work_managers/processes.py +187 -0
  136. westpa/work_managers/serial.py +28 -0
  137. westpa/work_managers/threads.py +79 -0
  138. westpa/work_managers/zeromq/__init__.py +20 -0
  139. westpa/work_managers/zeromq/core.py +641 -0
  140. westpa/work_managers/zeromq/node.py +131 -0
  141. westpa/work_managers/zeromq/work_manager.py +526 -0
  142. westpa/work_managers/zeromq/worker.py +320 -0
  143. westpa-2022.12.dist-info/AUTHORS +22 -0
  144. westpa-2022.12.dist-info/LICENSE +21 -0
  145. westpa-2022.12.dist-info/METADATA +193 -0
  146. westpa-2022.12.dist-info/RECORD +149 -0
  147. westpa-2022.12.dist-info/WHEEL +6 -0
  148. westpa-2022.12.dist-info/entry_points.txt +29 -0
  149. 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.