Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
05fa033
Trivial external engine to create example.
dwhswenson Feb 4, 2015
604cee7
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 19, 2015
8e50086
Little Makefile for the test external engine
dwhswenson Mar 19, 2015
1511664
Start on the external_engine.py
dwhswenson Mar 19, 2015
f25fdfa
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 29, 2015
8d1597e
Skeleton of tests for external engine
dwhswenson Mar 29, 2015
c653573
More organization work on external_engine
dwhswenson Mar 30, 2015
4efb9ba
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 31, 2015
0ddfff2
Engine starts and stops correctly.
dwhswenson Apr 1, 2015
938a89e
Start some docs on external_engine
dwhswenson Apr 2, 2015
1ecbd35
Draft read_frame_from_file
dwhswenson Apr 2, 2015
9ee153d
Working read_file_from_frame and tests
dwhswenson Apr 2, 2015
c975d6c
External engine passes its test suite.
dwhswenson Apr 2, 2015
699086e
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Apr 3, 2015
e5863f9
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Apr 8, 2015
dede53b
More docs on dynamics engine API
dwhswenson Apr 24, 2015
f988b00
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Apr 24, 2015
10de799
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson May 28, 2015
f498d96
returned psutils to reqs
dwhswenson May 28, 2015
e2ff3e2
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jun 23, 2015
11eba04
Fixes for long-ago changes in other PRs
dwhswenson Jun 23, 2015
59ac806
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Nov 2, 2015
f9d7dc9
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Apr 11, 2016
7cfa0e8
Add psutil to conda recipe
dwhswenson Apr 11, 2016
b8610cc
Move external engine into engines/
dwhswenson Apr 11, 2016
f6ac4cc
Fixes for external engine with new dynamics engine
dwhswenson Apr 11, 2016
86563ed
External toy engine now has velocities & positions
dwhswenson Apr 22, 2016
fab66f8
Implement write_frame_to_file for toy external
dwhswenson Apr 22, 2016
3648deb
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson May 4, 2016
abbb439
Draft of shooting move test
dwhswenson May 4, 2016
d9b6f1a
Shooting-based test of external engine
dwhswenson May 4, 2016
a7796c7
Automatic sleep optimization works beautifully!
dwhswenson May 11, 2016
360f749
Move ext_eng tests to tests/ dir, restructure eng/
dwhswenson May 13, 2016
d165a9e
Remove test comments
dwhswenson May 13, 2016
8376503
Fix test to be not zombie, instead of running
dwhswenson May 13, 2016
d031c57
More docs. Coverage exclusions.
dwhswenson May 13, 2016
2886eff
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jun 17, 2016
0816b57
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jul 7, 2016
ec4178c
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Aug 1, 2016
f9e974d
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Aug 2, 2016
7bb4828
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Aug 3, 2016
e66fbce
Seems to fix the problem.... weird
dwhswenson Aug 3, 2016
7d1fab1
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Aug 7, 2016
670ffcd
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Sep 1, 2016
9ab6509
Fix external engine test for removed generate_fwd
dwhswenson Sep 1, 2016
add9d26
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Sep 13, 2016
9ec757f
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Sep 30, 2016
a49a885
Seems to fix local tests
dwhswenson Oct 2, 2016
030d89d
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Oct 3, 2016
f766bfb
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Nov 2, 2016
4bbf62f
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Dec 2, 2016
d7b15de
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jan 17, 2017
7522a33
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 21, 2017
4fd979b
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson May 11, 2017
44fd122
whitespace cleanup
dwhswenson May 16, 2017
83d7c77
ExternalEngine.prepare(); and some cleanup
dwhswenson May 30, 2017
292fc2d
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson May 30, 2017
d3b9258
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jul 3, 2017
364cb23
Fix for bad merge decision
dwhswenson Jul 3, 2017
f362f66
Fix import for Py3
dwhswenson Jul 3, 2017
4e393f0
Use test_helpers.assert_items_equal
dwhswenson Jul 3, 2017
76970c3
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Sep 6, 2017
6f7d887
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Oct 2, 2017
c1d5b4e
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Nov 12, 2017
a54ea99
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Dec 9, 2017
ea159d7
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Dec 17, 2017
10759c8
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Jan 1, 2018
2920d95
Update microtest.py for (long-ago) changed API
dwhswenson Jan 18, 2018
4688841
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 13, 2019
a650524
Fix external engine tests for pytest
dwhswenson Mar 20, 2019
694a462
correct name for pytest module-level setup
dwhswenson Mar 20, 2019
0ccbb28
Update (most of) indirect engine API docs
dwhswenson Mar 24, 2019
158e4b5
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson Mar 25, 2019
74c195f
Merge remote-tracking branch 'upstream/master' into external_engine
dwhswenson May 1, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Draft read_frame_from_file
  • Loading branch information
dwhswenson committed Apr 2, 2015
commit 1ecbd35f86eedb89c30a67d5a6486b9faee84994
82 changes: 50 additions & 32 deletions openpathsampling/external_engine/external_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import shlex
import time

import linecache

@restores_as_full_object
class ExternalEngine(DynamicsEngine):
"""
Expand All @@ -19,13 +21,17 @@ class ExternalEngine(DynamicsEngine):
will work with the trivial `engine.c` developed for testing purposes.
"""

# TODO: include clever adaptive waiting scheme

default_options = {
'n_frames_max' : 10000,
'name_prefix' : "test",
'default_sleep_ms' : 10,
'engine_sleep' : 100
}

killsig = signal.SIGTERM

def __init__(self, options, template):
# needs to be overridden for each engine
options = {
Expand All @@ -37,8 +43,7 @@ def __init__(self, options, template):
self.sleep_ms = self.default_sleep_ms
# per engine, you can override this to terminate with the signal of
# your choice
self.killsig = signal.SIGKILL
self.traj_num = -1
self._traj_num = -1

@property
def current_snapshot(self):
Expand All @@ -47,65 +52,78 @@ def current_snapshot(self):
@current_snapshot.setter
def current_snapshot(self, snap):
self._current_snapshot = snap
# for a real engine, this should also write frame to whatever
# file is input for the trajectory

def generate_next_frame(self):
# should be completely general
next_frame_found = False
while not next_frame_found:
try:
next_frame = self.read_frame_from_file(self.frame_num)
next_frame_found = True
except: #TODO what error to throw here?
time.sleep(self.sleep_ms/1000.0)
next_frame = self.read_frame_from_file(self.frame_num)
if next_frame == "partial":
pass # rerun immediately
elif next_frame is None:
# TODO: optimize sleep time
self.current_snapshot = next_frame
time.sleep(self.sleep_ms/1000.0)
elif isinstance(next_frame, paths.Snapshot): # success
self.current_snapshot = next_frame
next_frame_found = True
self.frame_num += 1
else:
raise RuntimeError("Strange return value from read_next_frame_from_file")
return self.current_snapshot

def start(self, snapshot=None):
super(ExternalEngine, self).start(snapshot)
self.traj_num += 1
self.set_input_filename(self.traj_num)
self.set_output_filename(self.traj_num)
if snapshot is not None:
self.current_snapshot = snapshot
self._traj_num += 1
self.set_filenames(self._traj_num)
self.write_frame_to_file(self.input_file, self.current_snapshot)

cmd = shlex.split(self.engine_command())
try:
# TODO: add the ability to have handlers for stdin and stdout
self.proc = psutil.Popen(shlex.split(self.engine_command()),
preexec_fn=os.setsid
)
preexec_fn=os.setsid
)
except OSError:
pass #TODO: need to handle this, but do what?
pass #TODO: need to handle this, but do what? Probably reraise

def stop(self, trajectory):
super(ExternalEngine, self).stop(trajectory)
self.proc.send_signal(self.killsig)
self.proc.wait() # wait for the zombie to die
self.cleanup()

# FROM HERE ARE THE FUNCTIONS TO OVERRIDE IN SUBCLASSES:
def read_frame_from_file(self, filename, frame_num):
"""Reads given frame number from file, and returns snapshot
"""Reads given frame number from file, and returns snapshot.

If no frame is available, returns None. If the frame appears to be
partially written, returns string "partial".
"""
# main part that needs to be rewritten for each engine
# in a more complicated case, you'll need to read in all lines from
# the first associated with frame_num until either (a) you hit EOF
# or (b) you have a complete frame; then you need to return
# appropriately
line = linecache.getline(filename, frame_num)
if line is '':
return None
elif line[-1] != "\n":
return "partial"
else:
return paths.Snapshot(coordinates=[[float(line)]],
velocities=[[1.0]]
)

def write_frame_to_file(self, filename, snapshot, mode="a"):
"""Writes given snapshot to file."""
pass

def write_frame_to_file(self, filename, snapshot):
"""Writes given snapshot to appropriate input file.
"""
# also needs to be rewritten for each engine
def cleanup(self):
"""Any cleanup actions to do after the subprocess dies."""
pass

def set_input_filename(self, number):
"""Sets the filename for the input to trajectory number `number`
"""
self.input_file = self.name_prefix + str(number) + ".inp"

def set_output_filename(self, number):
"""Sets the filename for the output from trajectory number `number`
"""
def set_filenames(self, number):
"""Sets names for files associated with trajectory `number`"""
self.input_file = self.name_prefix + str(number) + ".inp" # not used
self.output_file = self.name_prefix + str(number) + ".out"

def engine_command(self):
Expand Down
6 changes: 4 additions & 2 deletions openpathsampling/external_engine/testexternal_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ def setUp(self):

def test_start_stop(self):
eng = self.fast_engine
#print get_all_pids()
# check that it isn't running yet
try:
assert_equal(eng.proc.is_running(), False)
Expand All @@ -43,7 +42,7 @@ def test_start_stop(self):
# start it; check that it is running
eng.start(self.template)
assert_equal(eng.proc.is_running(), True)
assert_equal(eng.proc.status(), 'running')
assert_equal(eng.proc.status(), 'running') # zombies also run

# stop it; check that it isn't running
eng.stop(self.template)
Expand All @@ -52,6 +51,9 @@ def test_start_stop(self):
def test_read_frame_from_file(self):
raise SkipTest

def test_read_frame_while_writing_file(self):
raise SkipTest

def test_slow_run(self):
# generate traj in LengthEnsemble if frames only come every 100ms
raise SkipTest
Expand Down