mirror of
https://github.com/SheffieldML/GPy.git
synced 2026-05-30 14:35:15 +02:00
further speedup tie
This commit is contained in:
parent
0ad7259b04
commit
0cef82db29
1 changed files with 42 additions and 25 deletions
|
|
@ -91,7 +91,7 @@ class Tie(Parameterized):
|
||||||
def _sync_val_p(p, tieparam, read):
|
def _sync_val_p(p, tieparam, read):
|
||||||
if p.tie is not None:
|
if p.tie is not None:
|
||||||
# ltoi = self._label_to_idx
|
# ltoi = self._label_to_idx
|
||||||
ltoi = np.zeros((self.tied_param.size+1,),dtype=np.int32)
|
ltoi = np.zeros((self.tied_param.tie.max()+1,),dtype=np.int32)
|
||||||
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
||||||
totie = 1 if toTiedParam else 0
|
totie = 1 if toTiedParam else 0
|
||||||
p_idx = p._raveled_index()
|
p_idx = p._raveled_index()
|
||||||
|
|
@ -142,7 +142,7 @@ class Tie(Parameterized):
|
||||||
if p is tieparam:
|
if p is tieparam:
|
||||||
return
|
return
|
||||||
# ltoi = self._label_to_idx
|
# ltoi = self._label_to_idx
|
||||||
ltoi = np.zeros((self.tied_param.size+1,),dtype=np.int32)
|
ltoi = np.zeros((self.tied_param.tie.max()+1,),dtype=np.int32)
|
||||||
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
||||||
p_tie = p.tie.flatten()
|
p_tie = p.tie.flatten()
|
||||||
p_size = p.size
|
p_size = p.size
|
||||||
|
|
@ -195,7 +195,7 @@ class Tie(Parameterized):
|
||||||
if p is tieparam:
|
if p is tieparam:
|
||||||
return
|
return
|
||||||
# ltoi = self._label_to_idx
|
# ltoi = self._label_to_idx
|
||||||
ltoi = np.zeros((self.tied_param.size+1,),dtype=np.int32)
|
ltoi = np.zeros((self.tied_param.tie.max()+1,),dtype=np.int32)
|
||||||
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
ltoi[self.tied_param.tie] = range(self.tied_param.size)
|
||||||
p_tie = p.tie.flatten()
|
p_tie = p.tie.flatten()
|
||||||
p_size = p.size
|
p_size = p.size
|
||||||
|
|
@ -477,6 +477,30 @@ class Tie(Parameterized):
|
||||||
self.buf_idx = self._highest_parent_._raveled_index_for(self.tied_param)
|
self.buf_idx = self._highest_parent_._raveled_index_for(self.tied_param)
|
||||||
self._untie_ = self.label_buf==0
|
self._untie_ = self.label_buf==0
|
||||||
self._untie_[self.buf_idx] = True
|
self._untie_[self.buf_idx] = True
|
||||||
|
self.tie_pairs = np.empty(((self.label_buf>0).sum()-self.tied_param.size,2),dtype=np.uint32)
|
||||||
|
try:
|
||||||
|
from scipy import weave
|
||||||
|
self._label_to_idx = np.zeros((self.tied_param.tie.max()+1,),dtype=np.int32)
|
||||||
|
self._label_to_idx[self.tied_param.tie] = range(self.tied_param.size)
|
||||||
|
ltoi = self._label_to_idx
|
||||||
|
t_start=int(self.buf_idx[0])
|
||||||
|
t_end=int(self.buf_idx[-1])
|
||||||
|
label_buf = self.label_buf
|
||||||
|
buf_size = self.label_buf.size
|
||||||
|
t_pairs = self.tie_pairs
|
||||||
|
code = """
|
||||||
|
int j=0;
|
||||||
|
for(int i=0;i<buf_size;i++) {
|
||||||
|
if(label_buf[i]>0 && !(i>=t_start && i<=t_end)) {
|
||||||
|
t_pairs[j*2] = i;
|
||||||
|
t_pairs[j*2+1] = ltoi[label_buf[i]];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
weave.inline(code, arg_names=['ltoi','t_start','t_end','label_buf','buf_size','t_pairs'])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
assert(np.all(self.tied_param.tie>0))
|
assert(np.all(self.tied_param.tie>0))
|
||||||
|
|
||||||
def _keepParamList(self,plist):
|
def _keepParamList(self,plist):
|
||||||
|
|
@ -592,23 +616,19 @@ class Tie(Parameterized):
|
||||||
try:
|
try:
|
||||||
from scipy import weave
|
from scipy import weave
|
||||||
pa_grad = self._highest_parent_.gradient
|
pa_grad = self._highest_parent_.gradient
|
||||||
label_buf = self.label_buf
|
|
||||||
buf_idx = self.buf_idx
|
|
||||||
tied_grad = self.tied_param.gradient
|
tied_grad = self.tied_param.gradient
|
||||||
t_size = self.tied_param.size
|
t_size = self.tied_param.size
|
||||||
p_size = self._highest_parent_.gradient.size
|
t_pairs = self.tie_pairs
|
||||||
|
t_pairs_size = self.tie_pairs.size
|
||||||
code="""
|
code="""
|
||||||
for(int i=0;i<t_size;i++) {
|
for(int i=0;i<t_size;i++) { tied_grad[i]=0;}
|
||||||
int l = label_buf[buf_idx[i]];
|
for(int i=0;i<t_pairs_size;i+=2) {
|
||||||
tied_grad[i] = 0;
|
int pidx = t_pairs[i];
|
||||||
double g=0;
|
int tidx = t_pairs[i+1];
|
||||||
for(int j=0;j<p_size;j++) {
|
tied_grad[tidx] += pa_grad[pidx];
|
||||||
if(label_buf[j]==l) {g += pa_grad[j];}
|
|
||||||
}
|
|
||||||
tied_grad[i] = g;
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
weave.inline(code, arg_names=['pa_grad','label_buf','buf_idx','tied_grad','t_size','p_size'])
|
weave.inline(code, arg_names=['pa_grad','t_pairs','t_pairs_size','tied_grad','t_size'])
|
||||||
except:
|
except:
|
||||||
self.tied_param.gradient = 0.
|
self.tied_param.gradient = 0.
|
||||||
[np.put(self.tied_param.gradient, i, self._highest_parent_.gradient[self.label_buf==self.label_buf[self.buf_idx[i]]].sum())
|
[np.put(self.tied_param.gradient, i, self._highest_parent_.gradient[self.label_buf==self.label_buf[self.buf_idx[i]]].sum())
|
||||||
|
|
@ -619,20 +639,17 @@ class Tie(Parameterized):
|
||||||
try:
|
try:
|
||||||
from scipy import weave
|
from scipy import weave
|
||||||
param_array = self._highest_parent_.param_array
|
param_array = self._highest_parent_.param_array
|
||||||
label_buf = self.label_buf
|
|
||||||
buf_idx = self.buf_idx
|
|
||||||
tied_param = self.tied_param
|
tied_param = self.tied_param
|
||||||
t_size = self.tied_param.size
|
t_pairs = self.tie_pairs
|
||||||
p_size = param_array.size
|
t_pairs_size = self.tie_pairs.size
|
||||||
code="""
|
code="""
|
||||||
for(int i=0;i<t_size;i++) {
|
for(int i=0;i<t_pairs_size;i+=2) {
|
||||||
int l = label_buf[buf_idx[i]];
|
int pidx = t_pairs[i];
|
||||||
for(int j=0;j<p_size;j++) {
|
int tidx = t_pairs[i+1];
|
||||||
if(label_buf[j]==l) {param_array[j] = tied_param[i];}
|
param_array[pidx] = tied_param[tidx];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
weave.inline(code, arg_names=['param_array','label_buf','buf_idx','tied_param','t_size','p_size'])
|
weave.inline(code, arg_names=['param_array','t_pairs','t_pairs_size','tied_param'])
|
||||||
except:
|
except:
|
||||||
for i in xrange(self.tied_param.size):
|
for i in xrange(self.tied_param.size):
|
||||||
self._highest_parent_.param_array[self.label_buf==self.label_buf[self.buf_idx[i]]] = self.tied_param[i]
|
self._highest_parent_.param_array[self.label_buf==self.label_buf[self.buf_idx[i]]] = self.tied_param[i]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue