1
2 """
3 This generates plan for generic linear models
4 """
5
6 import string
8 """The Plan Generator"""
9 mid=1
10 epochs=20
11 nparts= 2
12 step_size=1e-2
13 step_diminish=0.8
14 iname='instance_table'
15 iname_table='iname_table'
16 curried_grad='curried_grad'
17 batch_grad = 'grad'
18 prox = 'prox'
19 obj_aggregate_function = None
20 obj_row_function = None
21 sparse_data = False
22 batch_step = None
23
24 - def __init__(self, mid, epochs, step_size, step_diminish, iname_table, curried_grad, batch_grad, data_query, prox, obj_aggregate_function, obj_row_function, sparse_data=False, batch_step=None):
42
44 """
45 Generates cache model query
46
47 @rtype: string
48 @return: query to generate cache model
49 """
50 z = "SELECT retrieve_model_instance(%d, serialized_model) FROM %s where mid=%d;\n" % (self.mid, self.iname_table, self.mid)
51 return z
52
53
55 """
56 Generates store model query
57
58 @rtype: string
59 @return: query to store the model
60 """
61 z = "UPDATE %s SET serialized_model=get_model_instance(%d,serialized_model) where mid=%d" % (self.iname_table, self.mid, self.mid)
62 return z
63
65 """
66 Generates loss function query
67
68 @rtype: string
69 @return: query to generate loss function
70 """
71 loss_eval = None
72 if self.obj_aggregate_function and self.obj_row_function:
73 if self.sparse_data:
74 loss_eval = "SELECT %s(%s(%d, k,v,label)) FROM (%s) as x;\n" % (self.obj_aggregate_function, self.obj_row_function, self.mid, self.data_query)
75 else:
76 loss_eval = "SELECT %s(%s(%d, vec,label)) FROM (%s) as x;\n" % (self.obj_aggregate_function, self.obj_row_function, self.mid, self.data_query)
77 return loss_eval
78
80 """
81 Generates incremental plan
82
83 @rtype: tuple
84 @return: incremental plan tuple that contains: header, body, loss_eval and foote
85 """
86 header = self.generate_cache_model()
87 current_step = self.step_size
88 body = []
89 for step in range(self.epochs):
90 if self.prox:
91 z = ["SELECT COUNT(*) FROM (SELECT ", self.prox, "(", str(self.mid), ", ", str(self.step_size),
92 ", curried_step(", str(self.mid), ",", str(self.step_size), ", ",
93 self.curried_grad, "(", str(self.mid), ", vec, label))) FROM (", self.data_query,
94 ") AS T ORDER BY RANDOM()) AS T;\n"]
95 body.append(string.join(z,''))
96 else:
97 if self.sparse_data:
98 z = "SELECT COUNT(*) FROM (SELECT %s(%d,%f,k,v,label) FROM (%s) AS i ORDER BY RANDOM()) AS T;\n" % ( self.curried_grad, self.mid, current_step, self.data_query)
99 else:
100 z = "SELECT COUNT(*) FROM (SELECT %s(%d,%f,vec,label) FROM (%s) AS i ORDER BY RANDOM()) AS T;\n" % ( self.curried_grad, self.mid, current_step, self.data_query)
101 body.append(z)
102 current_step = current_step * self.step_diminish
103
104 footer = self.generate_store_model()
105
106 loss_eval = self.generate_loss_function()
107
108
109 return [header, body, loss_eval, footer]
110
111
113 """
114 Generates batch gradient plan
115
116 @rtype: tuple
117 @return: batch plan tuple that contains: header, body, loss_eval and foote
118 """
119 header = self.generate_cache_model()
120 header += "SELECT zero_gradient(%d);\n" % (self.mid)
121 current_step = self.step_size
122
123 assert( self.prox )
124
125 body = []
126 for step in range(self.epochs):
127 if self.sparse_data:
128 z = "SELECT COUNT(*) FROM (SELECT %s(%d, k,v,label) FROM (%s) as f) as T;\n" % (self.batch_grad, self.mid, self.data_query)
129 else:
130 z = "SELECT COUNT(*) FROM (SELECT %s(%d, vec,label) FROM (%s) as f) as T;\n" % (self.batch_grad, self.mid, self.data_query)
131
132
133 z += "SELECT %s(%d, %f);\n" % (self.prox, self.mid,current_step)
134 body.append(z)
135 current_step = current_step * self.step_diminish
136
137 loss_eval = self.generate_loss_function()
138
139 footer = self.generate_store_model()
140 return [header, body, loss_eval, footer]
141
142
144 """
145 Test this class
146 """
147
148 P = Python_Plan(1, 3, 0.9, 0.8, 'ell_two_model_instance', 'c_ell_two_grad', 'full_ell2_grad_step', 'SELECT * FROM FOREST', None, 'SUM', 'full_mse_loss', batch_step='full_gradient_step')
149 print "*** Incremental, No Prox"
150 print P.incremental_plan()
151 print "*** Batch, No Prox"
152 print P.batchgradient_plan()
153
154
155
156
157
158
159
160
161
162