annotate pylearn/dbdict/newstuff.py @ 589:6a7f3d83c72b

dbdict stuff
author James Bergstra <bergstrj@iro.umontreal.ca>
date Wed, 17 Dec 2008 15:39:30 -0500
parents 5020b12e87ee
children f8d29730f146
rev   line source
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
1
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
2 from __future__ import with_statement
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
3
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
4 from collections import defaultdict
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
5 import re, sys, inspect, os, signal, tempfile, shutil, socket
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
6
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
7 import sql
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
8
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
9
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
10 ################################################################################
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
11 ### misc
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
12 ################################################################################
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
13
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
14 class DD(dict):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
15 def __getattr__(self, attr):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
16 return self[attr]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
17 def __setattr__(self, attr, value):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
18 self[attr] = value
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
19 def __str__(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
20 return 'DD%s' % dict(self)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
21 def __repr__(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
22 return str(self)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
23
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
24 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
25 ### resolve
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
26 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
27
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
28 def resolve(name):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
29 symbols = name.split('.')
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
30 builder = __import__(symbols[0])
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
31 for sym in symbols[1:]:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
32 builder = getattr(builder, sym)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
33 return builder
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
34
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
35 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
36 ### dictionary
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
37 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
38
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
39 def convert(obj):
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
40 try:
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
41 return eval(obj, {}, {})
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
42 except (NameError, SyntaxError):
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
43 return obj
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
44
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
45 def flatten(obj):
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
46 """nested dictionary -> flat dictionary with '.' notation """
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
47 d = {}
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
48 def helper(d, prefix, obj):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
49 if isinstance(obj, (str, int, float)):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
50 d[prefix] = obj #convert(obj)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
51 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
52 if isinstance(obj, dict):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
53 subd = obj
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
54 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
55 subd = obj.state()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
56 subd['__builder__'] = '%s.%s' % (obj.__module__, obj.__class__.__name__)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
57 for k, v in subd.iteritems():
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
58 pfx = '.'.join([prefix, k]) if prefix else k
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
59 helper(d, pfx, v)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
60 helper(d, '', obj)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
61 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
62
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
63 def expand(d):
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
64 """inverse of flatten()"""
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
65 #def dd():
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
66 #return DD(dd)
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
67 struct = DD()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
68 for k, v in d.iteritems():
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
69 if k == '':
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
70 raise NotImplementedError()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
71 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
72 keys = k.split('.')
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
73 current = struct
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
74 for k2 in keys[:-1]:
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
75 current = current.setdefault(k2, DD())
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
76 current[keys[-1]] = v #convert(v)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
77 return struct
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
78
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
79 def realize(d):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
80 if not isinstance(d, dict):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
81 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
82 d = dict((k, realize(v)) for k, v in d.iteritems())
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
83 if '__builder__' in d:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
84 builder = resolve(d.pop('__builder__'))
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
85 return builder(**d)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
86 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
87
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
88 def make(d):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
89 return realize(expand(d))
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
90
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
91 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
92 ### errors
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
93 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
94
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
95 class UsageError(Exception):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
96 pass
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
97
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
98 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
99 ### parsing and formatting
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
100 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
101
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
102 def parse(*strings):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
103 d = {}
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
104 for string in strings:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
105 s1 = re.split(' *= *', string, 1)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
106 s2 = re.split(' *:: *', string, 1)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
107 if len(s1) == 1 and len(s2) == 1:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
108 raise UsageError('Expected a keyword argument in place of "%s"' % s1[0])
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
109 elif len(s1) == 2:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
110 k, v = s1
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
111 v = convert(v)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
112 elif len(s2) == 2:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
113 k, v = s2
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
114 k += '.__builder__'
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
115 d[k] = v
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
116 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
117
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
118 def format_d(d, sep = '\n', space = True):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
119 d = flatten(d)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
120 pattern = "%s = %r" if space else "%s=%r"
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
121 return sep.join(pattern % (k, v) for k, v in d.iteritems())
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
122
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
123 def format_help(topic):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
124 if topic is None:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
125 return 'No help.'
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
126 elif isinstance(topic, str):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
127 help = topic
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
128 elif hasattr(topic, 'help'):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
129 help = topic.help()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
130 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
131 help = topic.__doc__
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
132 if not help:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
133 return 'No help.'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
134
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
135 ss = map(str.rstrip, help.split('\n'))
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
136 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
137 baseline = min([len(line) - len(line.lstrip()) for line in ss if line])
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
138 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
139 return 'No help.'
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
140 s = '\n'.join([line[baseline:] for line in ss])
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
141 s = re.sub(string = s, pattern = '\n{2,}', repl = '\n\n')
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
142 s = re.sub(string = s, pattern = '(^\n*)|(\n*$)', repl = '')
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
143
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
144 return s
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
145
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
146 ################################################################################
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
147 ### single channels
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
148 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
149
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
150 # try:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
151 # import greenlet
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
152 # except:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
153 # try:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
154 # from py import greenlet
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
155 # except:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
156 # print >>sys.stderr, 'the greenlet module is unavailable'
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
157 # greenlet = None
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
158
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
159
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
160 class Channel(object):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
161
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
162 COMPLETE = property(lambda s:None,
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
163 doc=("Experiments should return this value to "
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
164 "indicate that they are done (if not done, return `Incomplete`"))
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
165 INCOMPLETE = property(lambda s:True,
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
166 doc=("Experiments should return this value to indicate that "
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
167 "they are not done (if done return `COMPLETE`)"))
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
168
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
169 START = property(lambda s: 0,
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
170 doc="dbdict.status == START means a experiment is ready to run")
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
171 RUNNING = property(lambda s: 1,
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
172 doc="dbdict.status == RUNNING means a experiment is running on dbdict_hostname")
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
173 DONE = property(lambda s: 2,
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
174 doc="dbdict.status == DONE means a experiment has completed (not necessarily successfully)")
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
175
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
176 # Methods to be used by the experiment to communicate with the channel
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
177
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
178 def save(self):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
179 """
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
180 Save the experiment's state to the various media supported by
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
181 the Channel.
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
182 """
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
183 raise NotImplementedError()
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
184
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
185 def switch(self, message = None):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
186 """
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
187 Called from the experiment to give the control back to the channel.
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
188 The following return values are meaningful:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
189 * 'stop' -> the experiment must stop as soon as possible. It may save what
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
190 it needs to save. This occurs when SIGTERM or SIGINT are sent (or in
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
191 user-defined circumstances).
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
192 switch() may give the control to the user. In this case, the user may
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
193 resume the experiment by calling switch() again. If an argument is given
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
194 by the user, it will be relayed to the experiment.
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
195 """
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
196 pass
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
197
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
198 def __call__(self, message = None):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
199 return self.switch(message)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
200
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
201 def save_and_switch(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
202 self.save()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
203 self.switch()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
204
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
205 # Methods to run the experiment
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
206
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
207 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
208 pass
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
209
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
210 def __enter__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
211 pass
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
212
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
213 def __exit__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
214 pass
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
215
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
216 def run(self):
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
217 pass
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
218
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
219
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
220
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
221 class JobError(Exception):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
222 RUNNING = 0
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
223 DONE = 1
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
224 NOJOB = 2
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
225
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
226
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
227 class SingleChannel(Channel):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
228
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
229 def __init__(self, experiment, state):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
230 self.experiment = experiment
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
231 self.state = state
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
232 self.feedback = None
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
233
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
234 def switch(self, message = None):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
235 feedback = self.feedback
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
236 self.feedback = None
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
237 return feedback
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
238
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
239 def run(self, force = False):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
240 self.setup()
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
241
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
242 status = self.state.dbdict.get('status', self.START)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
243 if status is self.DONE and not force:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
244 # If you want to disregard this, use the --force flag (not yet implemented)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
245 raise JobError(JobError.RUNNING,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
246 'The job has already completed.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
247 elif status is self.RUNNING and not force:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
248 raise JobError(JobError.DONE,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
249 'The job is already running.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
250 self.state.dbdict.status = self.RUNNING
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
251
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
252 v = self.COMPLETE
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
253 with self:
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
254 try:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
255 v = self.experiment(self.state, self)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
256 finally:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
257 self.state.dbdict.status = self.DONE if v is self.COMPLETE else self.START
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
258
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
259 return v
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
260
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
261 def on_sigterm(self, signo, frame):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
262 # SIGTERM handler. It is the experiment function's responsibility to
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
263 # call switch() often enough to get this feedback.
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
264 self.feedback = 'stop'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
265
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
266 def __enter__(self):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
267 # install a SIGTERM handler that asks the experiment function to return
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
268 # the next time it will call switch()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
269 self.prev_sigterm = signal.getsignal(signal.SIGTERM)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
270 self.prev_sigint = signal.getsignal(signal.SIGINT)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
271 signal.signal(signal.SIGTERM, self.on_sigterm)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
272 signal.signal(signal.SIGINT, self.on_sigterm)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
273 return self
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
274
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
275 def __exit__(self, type, value, traceback):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
276 signal.signal(signal.SIGTERM, self.prev_sigterm)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
277 signal.signal(signal.SIGINT, self.prev_sigint)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
278 self.prev_sigterm = None
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
279 self.prev_sigint = None
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
280 self.save()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
281
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
282
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
283 class StandardChannel(SingleChannel):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
284
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
285 def __init__(self, path, experiment, state, redirect_stdout = False, redirect_stderr = False):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
286 super(StandardChannel, self).__init__(experiment, state)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
287 self.path = os.path.realpath(path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
288 self.redirect_stdout = redirect_stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
289 self.redirect_stderr = redirect_stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
290
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
291 def save(self):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
292 with open(os.path.join(self.path, 'current.conf'), 'w') as current:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
293 current.write(format_d(self.state))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
294 current.write('\n')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
295
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
296 def __enter__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
297 self.old_cwd = os.getcwd()
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
298 os.chdir(self.path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
299 if self.redirect_stdout:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
300 self.old_stdout = sys.stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
301 sys.stdout = open('stdout', 'a')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
302 if self.redirect_stderr:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
303 self.old_stderr = sys.stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
304 sys.stderr = open('stderr', 'a')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
305 return super(StandardChannel, self).__enter__()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
306
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
307 def __exit__(self, type, value, traceback):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
308 if self.redirect_stdout:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
309 sys.stdout.close()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
310 sys.stdout = self.old_stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
311 if self.redirect_stderr:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
312 sys.stderr.close()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
313 sys.stderr = self.old_stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
314 os.chdir(self.old_cwd)
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
315 return super(StandardChannel, self).__exit__(type, value, traceback)
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
316
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
317 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
318 if not os.path.isdir(self.path):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
319 os.makedirs(self.path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
320 with self:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
321 origf = os.path.join(self.path, 'orig.conf')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
322 if not os.path.isfile(origf):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
323 with open(origf, 'w') as orig:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
324 orig.write(format_d(self.state))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
325 orig.write('\n')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
326 currentf = os.path.join(self.path, 'current.conf')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
327 if os.path.isfile(currentf):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
328 with open(currentf, 'r') as current:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
329 self.state = expand(parse(*map(str.strip, current.readlines())))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
330
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
331
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
332 class RSyncException(Exception):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
333 pass
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
334
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
335 class RSyncChannel(StandardChannel):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
336
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
337 def __init__(self, path, remote_path, experiment, state, redirect_stdout = False, redirect_stderr = False):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
338 super(RSyncChannel, self).__init__(path, experiment, state, redirect_stdout, redirect_stderr)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
339
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
340 ssh_prefix='ssh://'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
341 if remote_path.startswith(ssh_prefix):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
342 remote_path = remote_path[len(ssh_prefix):]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
343 colon_pos = remote_path.find(':')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
344 self.host = remote_path[:colon_pos]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
345 self.remote_path = remote_path[colon_pos+1:]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
346 else:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
347 self.host = ''
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
348 self.remote_path = os.path.realpath(remote_path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
349
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
350 def rsync(self, direction):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
351 """The directory at which experiment-related files are stored.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
352 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
353
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
354 path = self.path
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
355
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
356 remote_path = self.remote_path
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
357 if self.host:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
358 remote_path = ':'.join([self.host, remote_path])
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
359
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
360 # TODO: use something more portable than os.system
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
361 if direction == 'push':
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
362 rsync_cmd = 'rsync -ac "%s/" "%s/"' % (path, remote_path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
363 elif direction == 'pull':
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
364 rsync_cmd = 'rsync -ac "%s/" "%s/"' % (remote_path, path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
365 else:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
366 raise RSyncException('invalid direction', direction)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
367
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
368 rsync_rval = os.system(rsync_cmd)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
369 if rsync_rval != 0:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
370 raise RSyncException('rsync failure', (rsync_rval, rsync_cmd))
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
371
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
372 def touch(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
373 if self.host:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
374 host = self.host
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
375 touch_cmd = ('ssh %(host)s "mkdir -p \'%(path)s\'"' % dict(host = self.host,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
376 path = self.remote_path))
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
377 else:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
378 touch_cmd = ("mkdir -p '%(path)s'" % dict(path = self.remote_path))
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
379 # print "ECHO", touch_cmd
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
380 touch_rval = os.system(touch_cmd)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
381 if 0 != touch_rval:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
382 raise Exception('touch failure', (touch_rval, touch_cmd))
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
383
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
384 def pull(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
385 return self.rsync('pull')
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
386
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
387 def push(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
388 return self.rsync('push')
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
389
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
390 def save(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
391 super(RSyncChannel, self).save()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
392 self.push()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
393
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
394 def setup(self):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
395 self.touch()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
396 self.pull()
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
397 super(RSyncChannel, self).setup()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
398
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
399
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
400 class DBRSyncChannel(RSyncChannel):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
401
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
402 RESTART_PRIORITY = 2.0
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
403
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
404 def __init__(self, username, password, hostname, dbname, tablename, path, remote_root, redirect_stdout = False, redirect_stderr = False):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
405 self.username, self.password, self.hostname, self.dbname, self.tablename \
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
406 = username, password, hostname, dbname, tablename
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
407
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
408 self.db = sql.postgres_serial(
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
409 user = self.username,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
410 password = self.password,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
411 host = self.hostname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
412 database = self.dbname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
413 table_prefix = self.tablename)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
414
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
415 self.dbstate = sql.book_dct_postgres_serial(self.db)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
416 if self.dbstate is None:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
417 raise JobError(JobError.NOJOB,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
418 'No job was found to run.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
419
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
420 try:
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
421 state = expand(self.dbstate)
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
422 experiment = resolve(state.dbdict.experiment)
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
423 remote_path = os.path.join(remote_root, self.dbname, self.tablename, str(self.dbstate.id))
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
424 super(DBRSyncChannel, self).__init__(path, remote_path, experiment, state, redirect_stdout, redirect_stderr)
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
425 except:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
426 self.dbstate['dbdict.status'] = self.DONE
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
427 raise
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
428
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
429 def save(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
430 super(DBRSyncChannel, self).save()
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
431 self.dbstate.update(flatten(self.state))
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
432
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
433 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
434 # Extract a single experiment from the table that is not already running.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
435 # set self.experiment and self.state
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
436 super(DBRSyncChannel, self).setup()
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
437 self.state.dbdict.sql.host_name = socket.gethostname()
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
438 self.state.dbdict.sql.host_workdir = self.path
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
439 self.dbstate.update(flatten(self.state))
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
440
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
441 def run(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
442 # We pass the force flag as True because the status flag is
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
443 # already set to RUNNING by book_dct in __init__
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
444 v = super(DBRSyncChannel, self).run(force = True)
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
445 if v is self.INCOMPLETE and self.state.dbdict.sql.priority != self.RESTART_PRIORITY:
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
446 self.state.dbdict.sql.priority = self.RESTART_PRIORITY
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
447 self.save()
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
448 return v
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
449
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
450
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
451
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
452 ################################################################################
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
453 ### running
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
454 ################################################################################
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
455
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
456 import optparse
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
457 OptionParser = optparse.OptionParser
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
458 # class OptionParser(optparse.OptionParser):
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
459 # def error(self, message):
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
460 # pass
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
461
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
462 def parse_and_run(command, arguments):
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
463 parser, runner = runner_registry.get(command, (None, None))
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
464 if not runner:
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
465 raise UsageError('Unknown runner: "%s"' % command)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
466 if parser:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
467 options, arguments = parser.parse_args(arguments)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
468 else:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
469 options = optparse.Values()
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
470 run(runner, [options] + arguments)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
471
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
472 def run(runner, arguments):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
473 argspec = inspect.getargspec(runner)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
474 minargs = len(argspec[0])-(len(argspec[3]) if argspec[3] else 0)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
475 maxargs = len(argspec[0])
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
476 if minargs > len(arguments) or maxargs < len(arguments) and not argspec[1]:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
477 s = format_help(runner)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
478 raise UsageError(s)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
479 runner(*arguments)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
480
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
481 runner_registry = dict()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
482
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
483
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
484 parser_cmdline = OptionParser(usage = '%prog cmdline [options] <experiment> <parameters>')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
485 parser_cmdline.add_option('-f', '--force', action = 'store_true', dest = 'force', default = False,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
486 help = 'force running the experiment even if it is already running or completed')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
487 parser_cmdline.add_option('--redirect-stdout', action = 'store_true', dest = 'redirect_stdout', default = False,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
488 help = 'redirect stdout to the workdir/stdout file')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
489 parser_cmdline.add_option('--redirect-stderr', action = 'store_true', dest = 'redirect_stderr', default = False,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
490 help = 'redirect stderr to the workdir/stdout file')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
491 parser_cmdline.add_option('-r', '--redirect', action = 'store_true', dest = 'redirect', default = False,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
492 help = 'redirect stdout and stderr to the workdir/stdout and workdir/stderr files')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
493 parser_cmdline.add_option('-w', '--workdir', action = 'store', dest = 'workdir', default = None,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
494 help = 'the working directory in which to run the experiment')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
495
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
496 def runner_cmdline(options, experiment, *strings):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
497 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
498 Start an experiment with parameters given on the command line.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
499
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
500 Usage: cmdline [options] <experiment> <parameters>
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
501
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
502 Run an experiment with parameters provided on the command
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
503 line. See the help topics for experiment and parameters for
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
504 syntax information.
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
505
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
506 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
507 dbdict-run cmdline mymodule.my_experiment \\
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
508 stopper::pylearn.stopper.nsteps \\ # use pylearn.stopper.nsteps
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
509 stopper.n=10000 \\ # the argument "n" of nsteps is 10000
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
510 lr=0.03
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
511 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
512 state = expand(parse(*strings))
589
6a7f3d83c72b dbdict stuff
James Bergstra <bergstrj@iro.umontreal.ca>
parents: 586
diff changeset
513 state.setdefault('dbdict', DD()).experiment = experiment
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
514 experiment = resolve(experiment)
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
515 workdir = options.workdir or format_d(state, sep=',', space = False)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
516 channel = StandardChannel(workdir,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
517 experiment, state,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
518 redirect_stdout = options.redirect or options.redirect_stdout,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
519 redirect_stderr = options.redirect or options.redirect_stderr)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
520 channel.run(force = options.force)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
521
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
522 runner_registry['cmdline'] = (parser_cmdline, runner_cmdline)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
523
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
524
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
525
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
526 parser_sqlschedule = OptionParser(usage = '%prog sqlschedule [options] <tablepath> <experiment> <parameters>')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
527
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
528 def runner_sqlschedule(options, dbdescr, experiment, *strings):
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
529 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
530 Schedule a job to run using the sql command.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
531
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
532 Usage: sqlschedule <tablepath> <experiment> <parameters>
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
533
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
534 See the experiment and parameters topics for more information about
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
535 these parameters.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
536
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
537 Assuming that a postgres database is running on `host`, contains a
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
538 database called `dbname` and that `user` has the permissions to
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
539 create, read and modify tables on that database, tablepath should
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
540 be of the following form:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
541 postgres://user:pass@host/dbname/tablename
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
542
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
543 If no table is named `tablename`, one will be created
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
544 automatically. The state corresponding to the experiment and
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
545 parameters specified in the command will be saved in the database,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
546 but no experiment will be run.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
547
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
548 To run an experiment scheduled using sqlschedule, see the sql
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
549 command.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
550
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
551 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
552 dbdict-run sqlschedule postgres://user:pass@host/dbname/tablename \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
553 mymodule.my_experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
554 stopper::pylearn.stopper.nsteps \\ # use pylearn.stopper.nsteps
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
555 stopper.n=10000 \\ # the argument "n" of nsteps is 10000
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
556 lr=0.03
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
557 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
558
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
559 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
560 username, password, hostname, dbname, tablename \
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
561 = sql.parse_dbstring(dbdescr)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
562 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
563 raise UsageError('Wrong syntax for dbdescr')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
564
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
565 db = sql.postgres_serial(
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
566 user = username,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
567 password = password,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
568 host = hostname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
569 database = dbname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
570 table_prefix = tablename)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
571
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
572 state = parse(*strings)
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
573 try:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
574 resolve(experiment)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
575 except:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
576 raise UsageError('The first parameter to sqlschedule must be a valid, importable symbol.')
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
577 state['dbdict.experiment'] = experiment
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
578 sql.add_experiments_to_db([state], db, verbose = 1)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
579
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
580 runner_registry['sqlschedule'] = (parser_sqlschedule, runner_sqlschedule)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
581
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
582
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
583
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
584 parser_sql = OptionParser(usage = '%prog sql [options] <tablepath> <exproot>')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
585 parser_sql.add_option('-n', dest = 'n', type = 'int', default = 1,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
586 help = 'Run N experiments sequentially (default 1) '
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
587 '(if N is <= 0, runs as many experiments as possible).')
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
588
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
589 def runner_sql(options, dbdescr, exproot):
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
590 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
591 Run jobs from a sql table.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
592
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
593 Usage: sql <tablepath> <exproot>
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
594
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
595 The jobs should be scheduled first with the sqlschedule command.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
596
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
597 Assuming that a postgres database is running on `host`, contains a
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
598 database called `dbname` and that `user` has the permissions to
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
599 create, read and modify tables on that database, tablepath should
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
600 be of the following form:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
601 postgres://user:pass@host/dbname/tablename
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
602
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
603 exproot can be a local path or a remote path. Examples of exproots:
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
604 /some/local/path
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
605 ssh://some_host:/some/remote/path # relative to the filesystem root
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
606 ssh://some_host:other/remote/path # relative to the HOME on some_host
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
607
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
608 The exproot will contain a subdirectory hierarchy corresponding to
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
609 the dbname, tablename and job id which is a unique integer.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
610
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
611 The sql runner will pick any job in the table which is not running
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
612 and is not done and will terminate when that job ends. You may call
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
613 the same command multiple times, sequentially or in parallel, to
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
614 run as many unfinished jobs as have been scheduled in that table
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
615 with sqlschedule.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
616
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
617 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
618 dbdict-run sql \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
619 postgres://user:pass@host/dbname/tablename \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
620 ssh://central_host:myexperiments
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
621 """
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
622 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
623 username, password, hostname, dbname, tablename \
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
624 = sql.parse_dbstring(dbdescr)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
625 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
626 raise UsageError('Wrong syntax for dbdescr')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
627
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
628 n = options.n if options.n else -1
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
629 nrun = 0
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
630 try:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
631 while n != 0:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
632 workdir = tempfile.mkdtemp()
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
633 #print 'wdir', workdir
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
634 channel = DBRSyncChannel(username, password, hostname, dbname, tablename,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
635 workdir,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
636 exproot,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
637 redirect_stdout = True,
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
638 redirect_stderr = True)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
639 channel.run()
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
640 shutil.rmtree(workdir, ignore_errors=True)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
641 n -= 1
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
642 nrun += 1
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
643 except JobError, e:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
644 if e.args[0] == JobError.NOJOB:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
645 print 'No more jobs to run (run %i jobs)' % nrun
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
646
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
647 runner_registry['sql'] = (parser_sql, runner_sql)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
648
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
649
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
650
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
651
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
652
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
653 def runner_help(options, topic = None):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
654 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
655 Get help for a topic.
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
656
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
657 Usage: help <topic>
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
658 """
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
659 def bold(x):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
660 return '\033[1m%s\033[0m' % x
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
661 if topic is None:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
662 print bold('Topics: (use help <topic> for more info)')
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
663 print 'example Example of defining and running an experiment.'
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
664 print 'experiment How to define an experiment.'
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
665 print 'parameters How to list the parameters for an experiment.'
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
666 print
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
667 print bold('Available commands: (use help <command> for more info)')
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
668 for name, command in sorted(runner_registry.iteritems()):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
669 print name.ljust(20), format_help(command).split('\n')[0]
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
670 return
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
671 elif topic == 'experiment':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
672 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
673
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
674 dbdict-run serves to run experiments. To define an experiment, you
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
675 only have to define a function respecting the following protocol in
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
676 a python file or module:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
677
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
678 def my_experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
679 # experiment code goes here
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
680
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
681 The return value of my_experiment may be channel.COMPLETE or
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
682 channel.INCOMPLETE. If the latter is returned, the experiment may
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
683 be resumed at a later point. Note that the return value `None`
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
684 is interpreted as channel.COMPLETE.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
685
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
686 If a command defined by dbdict-run has an <experiment> parameter,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
687 that parameter must be a string such that it could be used in a
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
688 python import statement to import the my_experiment function. For
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
689 example if you defined my_experiment in my_module.py, you can pass
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
690 'my_module.my_experiment' as the experiment parameter.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
691
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
692 When entering my_experiment, the current working directory will be
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
693 set for you to a directory specially created for the experiment.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
694 The location and name of that directory vary depending on which
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
695 dbdict-run command you run. You may create logs, save files, pictures,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
696 results, etc. in it.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
697
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
698 state is an object containing the parameters given to the experiment.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
699 For example, if you run the followinc command:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
700
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
701 dbdict-run cmdline my_module.my_experiment a.x=6
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
702
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
703 `state.a.x` will contain the integer 6, and so will `state['a']['x']`.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
704 If the state is changed, it will be saved when the experiment ends
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
705 or when channel.save() is called. The next time the experiment is run
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
706 with the same working directory, the modified state will be provided.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
707
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
708 It is not recommended to store large amounts of data in the state. It
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
709 should be limited to scalar or string parameters. Results such as
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
710 weight matrices should be stored in files in the working directory.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
711
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
712 channel is an object with the following important methods:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
713
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
714 - channel.switch() (or channel()) will give the control back to the
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
715 user, if it is appropriate to do so. If a call to channel.switch()
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
716 returns the string 'stop', it typically means that the signal
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
717 SIGTERM (or SIGINT) was received. Therefore, the experiment may be
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
718 killed soon, so it should save and return True or
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
719 channel.INCOMPLETE so it can be resumed later. This should be
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
720 checked periodically or data loss may be incurred.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
721
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
722 - channel.save() will save the current state. It is automatically
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
723 called when the function returns, but it is a good idea to do it
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
724 periodically.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
725
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
726 - channel.save_and_switch() is an useful shortcut to do both operations
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
727 described above.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
728 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
729
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
730 elif topic == 'parameters':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
731 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
732 If a command takes <parameters> arguments, the arguments should each
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
733 take one of the following forms:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
734
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
735 key=value
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
736
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
737 Set a parameter with name `key` to `value`. The value will be casted
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
738 to an appropriate type automatically and it will be accessible to
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
739 the experiment using `state.key`.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
740
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
741 If `key` is a dotted name, the value will be set in nested
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
742 dictionaries corresponding to each part.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
743
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
744 Examples:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
745 a=1 state.a <- 1
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
746 b=2.3 state.b <- 2.3
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
747 c.d="hello" state.c.d <- "hello"
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
748
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
749 key::builder
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
750
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
751 This is equivalent to key.__builder__=builder.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
752
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
753 The builder should be a symbol that can be used with import or
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
754 __import__ and it should be callable.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
755
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
756 If a key has a builder defined, the experiment code may easily make
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
757 an object out of it using the `make` function. `obj = make(state.key)`.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
758 This will call the builder on the substate corresponding to state.key,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
759 as will be made clear in the example:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
760
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
761 Example:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
762 regexp::re.compile
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
763 regexp.pattern='a.*c'
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
764
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
765 from pylearn.dbdict.newstuff import make
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
766 def experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
767 regexp = make(state.regexp) # regexp is now re.compile(pattern = 'a.*c')
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
768 print regexp.sub('blahblah', 'hello abbbbc there')
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
769
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
770 If the above experiment was called with the state produced by the
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
771 parameters in the example, it would print 'hello blahblah there'.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
772 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
773
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
774 elif topic == 'example':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
775 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
776 Example of an experiment that trains some model for 100000 iterations:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
777
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
778 # defined in: my_experiments.py
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
779 def experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
780 try:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
781 model = cPickle.load(open('model', 'r'))
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
782 except:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
783 model = my_model(state.some_param, state.other_param)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
784 state.n = 0
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
785 dataset = my_dataset(skipto = state.n)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
786 for i in xrange(100000 - state.n):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
787 model.update(dataset.next())
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
788 if i and i % 1000 == 0:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
789 if channel.save_and_switch() == 'stop':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
790 state.n += i + 1
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
791 rval = channel.INCOMPLETE
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
792 break
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
793 else:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
794 state.result = model.cost(some_test_set)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
795 rval = channel.COMPLETE
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
796 cPickle.dump(model, open('model', 'w'))
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
797 return rval
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
798
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
799 And then you could run it this way:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
800
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
801 dbdict-run cmdline my_experiments.experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
802 some_param=1 \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
803 other_param=0.4
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
804
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
805 Or this way:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
806
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
807 dbdict-run sqlschedule postgres://user:pass@host/dbname/tablename \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
808 my_experiments.experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
809 some_param=1 \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
810 other_param=0.4
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
811
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
812 dbdict-run sql postgres://user:pass@host/dbname/tablename exproot
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
813
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
814 You need to make sure that the module `my_experiments` is accessible
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
815 from python. You can check with the command
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
816
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
817 $ python -m my_experiments
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
818 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
819 else:
586
5020b12e87ee fixed broken help
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 584
diff changeset
820 helptext = runner_registry.get(topic, None)[1]
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
821 print format_help(helptext)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
822
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
823 runner_registry['help'] = (None, runner_help)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
824
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
825 ################################################################################
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
826 ### main
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
827 ################################################################################
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
828
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
829 def run_cmdline():
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
830 try:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
831 if len(sys.argv) <= 1:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
832 raise UsageError('Usage: %s <run_type> [<arguments>*]' % sys.argv[0])
584
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
833 cmd = None
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
834 args = []
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
835 for arg in sys.argv[1:]:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
836 if cmd is not None or arg.startswith('-'):
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
837 args.append(arg)
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
838 else:
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
839 cmd = arg
9f5691d5587d added command line options
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 579
diff changeset
840 parse_and_run(cmd, args)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
841 except UsageError, e:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
842 print 'Usage error:'
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
843 print e
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
844
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
845 if __name__ == '__main__':
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
846 run_cmdline()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
847
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
848