annotate pylearn/dbdict/newstuff.py @ 579:a83f62555c57

doc fix
author Olivier Breuleux <breuleuo@iro.umontreal.ca>
date Thu, 04 Dec 2008 17:07:29 -0500
parents a027c4cedf98
children 9f5691d5587d
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
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
14 class DD(defaultdict):
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):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
46 d = {}
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
47 def helper(d, prefix, obj):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
48 if isinstance(obj, (str, int, float)):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
49 d[prefix] = obj #convert(obj)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
50 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
51 if isinstance(obj, dict):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
52 subd = obj
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
53 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
54 subd = obj.state()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
55 subd['__builder__'] = '%s.%s' % (obj.__module__, obj.__class__.__name__)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
56 for k, v in subd.iteritems():
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
57 pfx = '.'.join([prefix, k]) if prefix else k
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
58 helper(d, pfx, v)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
59 helper(d, '', obj)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
60 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
61
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
62 def expand(d):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
63 def dd():
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
64 return DD(dd)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
65 struct = dd()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
66 for k, v in d.iteritems():
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
67 if k == '':
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
68 raise NotImplementedError()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
69 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
70 keys = k.split('.')
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
71 current = struct
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
72 for k2 in keys[:-1]:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
73 current = current[k2]
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
74 current[keys[-1]] = v #convert(v)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
75 return struct
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
76
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
77 def realize(d):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
78 if not isinstance(d, dict):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
79 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
80 d = dict((k, realize(v)) for k, v in d.iteritems())
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
81 if '__builder__' in d:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
82 builder = resolve(d.pop('__builder__'))
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
83 return builder(**d)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
84 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
85
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
86 def make(d):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
87 return realize(expand(d))
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
88
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
89 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
90 ### errors
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
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
93 class UsageError(Exception):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
94 pass
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
95
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
96 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
97 ### parsing and formatting
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
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
100 def parse(*strings):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
101 d = {}
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
102 for string in strings:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
103 s1 = re.split(' *= *', string, 1)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
104 s2 = re.split(' *:: *', string, 1)
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
105 if len(s1) == 1 and len(s2) == 1:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
106 raise UsageError('Expected a keyword argument in place of "%s"' % s1[0])
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
107 elif len(s1) == 2:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
108 k, v = s1
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
109 v = convert(v)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
110 elif len(s2) == 2:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
111 k, v = s2
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
112 k += '.__builder__'
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
113 d[k] = v
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
114 return d
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
115
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
116 def format_d(d, sep = '\n', space = True):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
117 d = flatten(d)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
118 pattern = "%s = %r" if space else "%s=%r"
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
119 return sep.join(pattern % (k, v) for k, v in d.iteritems())
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
120
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
121 def format_help(topic):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
122 if topic is None:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
123 return 'No help.'
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
124 elif isinstance(topic, str):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
125 help = topic
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
126 elif hasattr(topic, 'help'):
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
127 help = topic.help()
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
128 else:
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
129 help = topic.__doc__
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
130 if not help:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
131 return 'No help.'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
132
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
133 ss = map(str.rstrip, help.split('\n'))
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
134 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
135 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
136 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
137 return 'No help.'
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
138 s = '\n'.join([line[baseline:] for line in ss])
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
139 s = re.sub(string = s, pattern = '\n{2,}', repl = '\n\n')
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
140 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
141
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
142 return s
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
143
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
144 ################################################################################
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
145 ### single channels
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
146 ################################################################################
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
147
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
148 # try:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
149 # import greenlet
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
150 # except:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
151 # try:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
152 # from py import greenlet
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
153 # except:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
154 # print >>sys.stderr, 'the greenlet module is unavailable'
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
155 # greenlet = None
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
156
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
157
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
158 class Channel(object):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
159
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
160 COMPLETE = None
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
161 INCOMPLETE = True
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
162
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
163 START = 0
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
164 """dbdict.status == START means a experiment is ready to run"""
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
165 RUNNING = 1
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
166 """dbdict.status == RUNNING means a experiment is running on dbdict_hostname"""
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
167 DONE = 2
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
168 """dbdict.status == DONE means a experiment has completed (not necessarily successfully)"""
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
169
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
170 # 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
171
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
172 def save(self):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
173 """
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
174 Save the experiment's state to the various media supported by
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
175 the Channel.
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
176 """
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
177 raise NotImplementedError()
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
178
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
179 def switch(self, message = None):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
180 """
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
181 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
182 The following return values are meaningful:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
183 * '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
184 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
185 user-defined circumstances).
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
186 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
187 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
188 by the user, it will be relayed to the experiment.
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
189 """
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
190 pass
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
191
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
192 def __call__(self, message = None):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
193 return self.switch(message)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
194
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
195 def save_and_switch(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
196 self.save()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
197 self.switch()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
198
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
199 # Methods to run the experiment
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
200
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
201 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
202 pass
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
203
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
204 def __enter__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
205 pass
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
206
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
207 def __exit__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
208 pass
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
209
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
210 def run(self):
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
211 pass
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
212
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
213
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
214
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
215 class JobError(Exception):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
216 RUNNING = 0
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
217 DONE = 1
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
218 NOJOB = 2
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
219
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
220
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
221 class SingleChannel(Channel):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
222
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
223 def __init__(self, experiment, state):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
224 self.experiment = experiment
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
225 self.state = state
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
226 self.feedback = None
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
227
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
228 def switch(self, message = None):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
229 feedback = self.feedback
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
230 self.feedback = None
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
231 return feedback
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
232
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
233 def run(self, force = False):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
234 self.setup()
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
235
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
236 status = self.state.dbdict.get('status', self.START)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
237 if status is self.DONE and not force:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
238 # 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
239 raise JobError(JobError.RUNNING,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
240 'The job has already completed.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
241 elif status is self.RUNNING and not force:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
242 raise JobError(JobError.DONE,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
243 'The job is already running.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
244 self.state.dbdict.status = self.RUNNING
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
245
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
246 v = self.COMPLETE
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
247 with self:
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
248 try:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
249 v = self.experiment(self.state, self)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
250 finally:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
251 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
252
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
253 return v
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
254
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
255 def on_sigterm(self, signo, frame):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
256 # 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
257 # call switch() often enough to get this feedback.
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
258 self.feedback = 'stop'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
259
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
260 def __enter__(self):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
261 # 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
262 # the next time it will call switch()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
263 self.prev_sigterm = signal.getsignal(signal.SIGTERM)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
264 self.prev_sigint = signal.getsignal(signal.SIGINT)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
265 signal.signal(signal.SIGTERM, self.on_sigterm)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
266 signal.signal(signal.SIGINT, self.on_sigterm)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
267 return self
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
268
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
269 def __exit__(self, type, value, traceback):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
270 signal.signal(signal.SIGTERM, self.prev_sigterm)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
271 signal.signal(signal.SIGINT, self.prev_sigint)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
272 self.prev_sigterm = None
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
273 self.prev_sigint = None
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
274 self.save()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
275
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
276
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
277 class StandardChannel(SingleChannel):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
278
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
279 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
280 super(StandardChannel, self).__init__(experiment, state)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
281 self.path = os.path.realpath(path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
282 self.redirect_stdout = redirect_stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
283 self.redirect_stderr = redirect_stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
284
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
285 def save(self):
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
286 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
287 current.write(format_d(self.state))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
288 current.write('\n')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
289
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
290 def __enter__(self):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
291 self.old_cwd = os.getcwd()
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
292 os.chdir(self.path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
293 if self.redirect_stdout:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
294 self.old_stdout = sys.stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
295 sys.stdout = open('stdout', 'a')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
296 if self.redirect_stderr:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
297 self.old_stderr = sys.stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
298 sys.stderr = open('stderr', 'a')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
299 return super(StandardChannel, self).__enter__()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
300
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
301 def __exit__(self, type, value, traceback):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
302 if self.redirect_stdout:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
303 sys.stdout.close()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
304 sys.stdout = self.old_stdout
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
305 if self.redirect_stderr:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
306 sys.stderr.close()
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
307 sys.stderr = self.old_stderr
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
308 os.chdir(self.old_cwd)
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
309 return super(StandardChannel, self).__exit__(type, value, traceback)
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
310
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
311 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
312 if not os.path.isdir(self.path):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
313 os.makedirs(self.path)
567
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
314 with self:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
315 origf = os.path.join(self.path, 'orig.conf')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
316 if not os.path.isfile(origf):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
317 with open(origf, 'w') as orig:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
318 orig.write(format_d(self.state))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
319 orig.write('\n')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
320 currentf = os.path.join(self.path, 'current.conf')
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
321 if os.path.isfile(currentf):
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
322 with open(currentf, 'r') as current:
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
323 self.state = expand(parse(*map(str.strip, current.readlines())))
d88c35e8f83a another checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 566
diff changeset
324
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
325
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
326 class RSyncException(Exception):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
327 pass
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
328
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
329 class RSyncChannel(StandardChannel):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
330
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
331 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
332 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
333
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
334 ssh_prefix='ssh://'
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
335 if remote_path.startswith(ssh_prefix):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
336 remote_path = remote_path[len(ssh_prefix):]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
337 colon_pos = remote_path.find(':')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
338 self.host = remote_path[:colon_pos]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
339 self.remote_path = remote_path[colon_pos+1:]
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
340 else:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
341 self.host = ''
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
342 self.remote_path = os.path.realpath(remote_path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
343
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
344 def rsync(self, direction):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
345 """The directory at which experiment-related files are stored.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
346 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
347
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
348 path = self.path
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
349
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
350 remote_path = self.remote_path
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
351 if self.host:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
352 remote_path = ':'.join([self.host, remote_path])
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
353
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
354 # TODO: use something more portable than os.system
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
355 if direction == 'push':
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
356 rsync_cmd = 'rsync -ac "%s/" "%s/"' % (path, remote_path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
357 elif direction == 'pull':
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
358 rsync_cmd = 'rsync -ac "%s/" "%s/"' % (remote_path, path)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
359 else:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
360 raise RSyncException('invalid direction', direction)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
361
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
362 rsync_rval = os.system(rsync_cmd)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
363 if rsync_rval != 0:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
364 raise RSyncException('rsync failure', (rsync_rval, rsync_cmd))
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
365
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
366 def touch(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
367 if self.host:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
368 host = self.host
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
369 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
370 path = self.remote_path))
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
371 else:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
372 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
373 # print "ECHO", touch_cmd
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
374 touch_rval = os.system(touch_cmd)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
375 if 0 != touch_rval:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
376 raise Exception('touch failure', (touch_rval, touch_cmd))
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
377
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
378 def pull(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
379 return self.rsync('pull')
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
380
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
381 def push(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
382 return self.rsync('push')
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
383
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
384 def save(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
385 super(RSyncChannel, self).save()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
386 self.push()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
387
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
388 def setup(self):
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
389 self.touch()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
390 self.pull()
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
391 super(RSyncChannel, self).setup()
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
392
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
393
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
394 class DBRSyncChannel(RSyncChannel):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
395
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
396 RESTART_PRIORITY = 2.0
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
397
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
398 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
399 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
400 = username, password, hostname, dbname, tablename
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
401
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
402 self.db = sql.postgres_serial(
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
403 user = self.username,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
404 password = self.password,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
405 host = self.hostname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
406 database = self.dbname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
407 table_prefix = self.tablename)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
408
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
409 self.dbstate = sql.book_dct_postgres_serial(self.db)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
410 if self.dbstate is None:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
411 raise JobError(JobError.NOJOB,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
412 'No job was found to run.')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
413
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
414 try:
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
415 state = expand(self.dbstate)
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
416 experiment = resolve(state.dbdict.experiment)
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
417 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
418 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
419 except:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
420 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
421 raise
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
422
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
423 def save(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
424 super(DBRSyncChannel, self).save()
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
425 self.dbstate.update(flatten(self.state))
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
426
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
427 def setup(self):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
428 # Extract a single experiment from the table that is not already running.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
429 # set self.experiment and self.state
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
430 super(DBRSyncChannel, self).setup()
572
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
431 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
432 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
433 self.dbstate.update(flatten(self.state))
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
434
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
435 def run(self):
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
436 # 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
437 # 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
438 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
439 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
440 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
441 self.save()
9f5891cd4048 added host name and workdir to the db
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 571
diff changeset
442 return v
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
443
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
444
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
445
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
446 ################################################################################
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
447 ### running
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
448 ################################################################################
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
449
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
450 def run(type, arguments):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
451 runner = runner_registry.get(type, None)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
452 if not runner:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
453 raise UsageError('Unknown runner: "%s"' % type)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
454 argspec = inspect.getargspec(runner)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
455 minargs = len(argspec[0])-(len(argspec[3]) if argspec[3] else 0)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
456 maxargs = len(argspec[0])
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
457 if minargs > len(arguments) or maxargs < len(arguments) and not argspec[1]:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
458 s = format_help(runner)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
459 raise UsageError(s)
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
460 runner(*arguments)
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
461
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
462 runner_registry = dict()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
463
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
464 def runner_cmdline(experiment, *strings):
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
465 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
466 Start an experiment with parameters given on the command line.
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
467
579
a83f62555c57 doc fix
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 578
diff changeset
468 Usage: cmdline <experiment> <parameters>
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
469
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
470 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
471 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
472 syntax information.
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
473
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
474 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
475 dbdict-run cmdline mymodule.my_experiment \\
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
476 stopper::pylearn.stopper.nsteps \\ # use pylearn.stopper.nsteps
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
477 stopper.n=10000 \\ # the argument "n" of nsteps is 10000
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
478 lr=0.03
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
479 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
480 state = expand(parse(*strings))
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
481 state.dbdict.experiment = experiment
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
482 experiment = resolve(experiment)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
483 #channel = RSyncChannel('.', 'yaddayadda', experiment, state)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
484 channel = StandardChannel(format_d(state, sep=',', space = False),
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
485 experiment, state)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
486 channel.run()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
487
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
488 runner_registry['cmdline'] = runner_cmdline
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
489
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
490
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
491 def runner_sqlschedule(dbdescr, experiment, *strings):
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
492 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
493 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
494
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
495 Usage: sqlschedule <tablepath> <experiment> <parameters>
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
496
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
497 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
498 these parameters.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
499
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
500 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
501 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
502 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
503 be of the following form:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
504 postgres://user:pass@host/dbname/tablename
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
505
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
506 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
507 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
508 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
509 but no experiment will be run.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
510
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
511 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
512 command.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
513
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
514 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
515 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
516 mymodule.my_experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
517 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
518 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
519 lr=0.03
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
520 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
521
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
522 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
523 username, password, hostname, dbname, tablename \
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
524 = sql.parse_dbstring(dbdescr)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
525 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
526 raise UsageError('Wrong syntax for dbdescr')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
527
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
528 db = sql.postgres_serial(
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
529 user = username,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
530 password = password,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
531 host = hostname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
532 database = dbname,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
533 table_prefix = tablename)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
534
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
535 state = parse(*strings)
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
536 try:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
537 resolve(experiment)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
538 except:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
539 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
540 state['dbdict.experiment'] = experiment
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
541 sql.add_experiments_to_db([state], db, verbose = 1)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
542
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
543 runner_registry['sqlschedule'] = runner_sqlschedule
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
544
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
545
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
546
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
547 def runner_sql(dbdescr, exproot):
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
548 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
549 Run jobs from a sql table.
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 Usage: sql <tablepath> <exproot>
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
552
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
553 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
554
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
555 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
556 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
557 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
558 be of the following form:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
559 postgres://user:pass@host/dbname/tablename
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
560
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
561 exproot can be a local path or a remote path. Examples of exproots:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
562 /some/local/path
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
563 ssh://some_host:/some/remote/path # relative to the filesystem root
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
564 ssh://some_host:other/remote/path # relative to the HOME on some_host
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
565
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
566 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
567 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
568
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
569 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
570 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
571 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
572 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
573 with sqlschedule.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
574
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
575 Example use:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
576 dbdict-run sql \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
577 postgres://user:pass@host/dbname/tablename \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
578 ssh://central_host:myexperiments
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
579 """
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
580 try:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
581 username, password, hostname, dbname, tablename \
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
582 = sql.parse_dbstring(dbdescr)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
583 except:
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
584 raise UsageError('Wrong syntax for dbdescr')
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
585 workdir = tempfile.mkdtemp()
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
586 #print 'wdir', workdir
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
587 channel = DBRSyncChannel(username, password, hostname, dbname, tablename,
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
588 workdir,
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
589 exproot,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
590 redirect_stdout = True,
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
591 redirect_stderr = True)
568
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
592 channel.run()
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
593 shutil.rmtree(workdir, ignore_errors=True)
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
594
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
595 runner_registry['sql'] = runner_sql
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
596
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
597
1f036d934ad9 improvements to dbdict interface
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 567
diff changeset
598
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
599
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
600
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
601 def help(topic = None):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
602 """
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
603 Get help for a topic.
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
604
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
605 Usage: help <topic>
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
606 """
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
607 def bold(x):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
608 return '\033[1m%s\033[0m' % x
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
609 if topic is None:
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
610 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
611 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
612 print 'experiment How to define an experiment.'
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
613 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
614 print
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
615 print bold('Available commands: (use help <command> for more info)')
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
616 for name, command in sorted(runner_registry.iteritems()):
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
617 print name.ljust(20), format_help(command).split('\n')[0]
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
618 return
576
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
619 elif topic == 'experiment':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
620 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
621
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
622 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
623 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
624 a python file or module:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
625
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
626 def my_experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
627 # experiment code goes here
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
628
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
629 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
630 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
631 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
632 is interpreted as channel.COMPLETE.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
633
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
634 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
635 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
636 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
637 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
638 '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
639
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
640 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
641 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
642 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
643 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
644 results, etc. in it.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
645
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
646 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
647 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
648
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
649 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
650
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
651 `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
652 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
653 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
654 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
655
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
656 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
657 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
658 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
659
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
660 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
661
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
662 - 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
663 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
664 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
665 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
666 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
667 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
668 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
669
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
670 - 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
671 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
672 periodically.
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 - 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
675 described above.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
676 """
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 elif topic == 'parameters':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
679 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
680 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
681 take one of the following forms:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
682
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
683 key=value
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
684
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
685 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
686 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
687 the experiment using `state.key`.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
688
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
689 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
690 dictionaries corresponding to each part.
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 Examples:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
693 a=1 state.a <- 1
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
694 b=2.3 state.b <- 2.3
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
695 c.d="hello" state.c.d <- "hello"
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
696
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
697 key::builder
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
698
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
699 This is equivalent to key.__builder__=builder.
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 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
702 __import__ and it should be callable.
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
703
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
704 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
705 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
706 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
707 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
708
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
709 Example:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
710 regexp::re.compile
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
711 regexp.pattern='a.*c'
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
712
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
713 from pylearn.dbdict.newstuff import make
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
714 def experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
715 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
716 print regexp.sub('blahblah', 'hello abbbbc there')
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
717
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
718 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
719 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
720 """
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 elif topic == 'example':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
723 helptext = """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
724 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
725
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
726 # defined in: my_experiments.py
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
727 def experiment(state, channel):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
728 try:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
729 model = cPickle.load(open('model', 'r'))
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
730 except:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
731 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
732 state.n = 0
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
733 dataset = my_dataset(skipto = state.n)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
734 for i in xrange(100000 - state.n):
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
735 model.update(dataset.next())
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
736 if i and i % 1000 == 0:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
737 if channel.save_and_switch() == 'stop':
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
738 state.n += i + 1
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
739 rval = channel.INCOMPLETE
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
740 break
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
741 else:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
742 state.result = model.cost(some_test_set)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
743 rval = channel.COMPLETE
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
744 cPickle.dump(model, open('model', 'w'))
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
745 return rval
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
746
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
747 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
748
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
749 dbdict-run cmdline my_experiments.experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
750 some_param=1 \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
751 other_param=0.4
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 Or this way:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
754
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
755 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
756 my_experiments.experiment \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
757 some_param=1 \\
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
758 other_param=0.4
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
759
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
760 dbdict-run sql postgres://user:pass@host/dbname/tablename workdir
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
761
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
762 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
763 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
764
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
765 $ python -m my_experiments
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
766 """
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
767 else:
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
768 helptext = runner_registry.get(topic, None)
ef424abb7458 bugfixes and a lot of documentation
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 572
diff changeset
769 print format_help(helptext)
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
770
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
771 runner_registry['help'] = help
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
772
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
773 ################################################################################
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
774 ### main
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
775 ################################################################################
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
776
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
777 def run_cmdline():
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
778 try:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
779 if len(sys.argv) <= 1:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
780 raise UsageError('Usage: %s <run_type> [<arguments>*]' % sys.argv[0])
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
781 run(sys.argv[1], sys.argv[2:])
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
782 except UsageError, e:
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
783 print 'Usage error:'
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
784 print e
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
785
566
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
786 if __name__ == '__main__':
a71971ccc1e4 checkpoint
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents: 565
diff changeset
787 run_cmdline()
565
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
788
0ac4927e9d97 new stuff
Olivier Breuleux <breuleuo@iro.umontreal.ca>
parents:
diff changeset
789