-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexperiment_manager.py
97 lines (76 loc) · 3.13 KB
/
experiment_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from traits.api import *
from traitsui.api import *
from managers import BaseManager
from experiments import BaseExperiment, ExperimentTableEditor,\
ExperimentStatus, experiment_dict
from time import sleep
from threading import Thread
class ExperimentManagerHandler(Handler):
def close( self, info, is_ok ):
info.object.closing = True
for exp in info.object.experiments:
exp.status = ExperimentStatus.CANCELED
info.object.thread.join(timeout=1)
super(ExperimentManagerHandler, self).close(info, is_ok)
class ExperimentManager(BaseManager):
experiments = List(BaseExperiment,[])
experiment = Instance(BaseExperiment)
thread = Any(transient=True)
closing = Bool(False, transient=True)
add_type = Enum(experiment_dict.keys())
add = Button('Add')
remove = Button('Remove')
run = Button('Run')
pause = Button('Pause')
stop = Button('Stop')
view = View(
VGroup(
HGroup(Item(name='run', show_label=False, enabled_when='experiment and experiment.status != 1'),
Item(name='pause', show_label=False, enabled_when='experiment.status == 1'),
Item(name='stop', show_label=False, enabled_when='experiment.status != 0'),
label='Control', show_border=True),
HGroup(Item(name='add_type', show_label=False, ),
Item(name='add', show_label=False, ),
Item(name='remove', show_label=False, ),
),
Group(Item(name='experiments', show_label=False,
editor=ExperimentTableEditor(selected='experiment')),
show_border=True, label='Experiments'),
Group( Item(name='experiment', style='custom',
editor=InstanceEditor(view='summary_view'), show_label=False,),
label='Experiment Summary', show_border=True),
),
handler=ExperimentManagerHandler,
)
def __init__(self,*args, **kwargs):
super(ExperimentManager,self).__init__(*args, **kwargs)
self.thread = Thread(target=self.experiment_runner)
self.thread.setDaemon(True)
self.thread.start()
def _add_fired(self):
if self.experiments:
self.experiments.append(experiment_dict[self.add_type]())
else:
self.experiments = [experiment_dict[self.add_type]()]
def _remove_fired(self):
if self.experiment:
self.experiments.remove(self.experiment)
def _experiments_default(self):
return [exp() for exp in experiment_dict.values()]
def _run_fired(self):
if self.experiment:
self.experiment._start()
def _pause_fired(self):
if self.experiment:
self.experiment._pause()
def _stop_fired(self):
if self.experiment:
self.experiment._stop()
def experiment_runner(self):
while True:
for exp in self.experiments:
if exp.status == ExperimentStatus.QUEUED:
exp.exp_worker()
sleep(0.2)
if self.closing:
return