From 0cef82db2979ed4c8de2b04608417b37a49942eb Mon Sep 17 00:00:00 2001 From: Zhenwen Dai Date: Tue, 21 Oct 2014 22:56:13 +0100 Subject: [PATCH] further speedup tie --- .../parameterization/ties_and_remappings.py | 67 ++++++++++++------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/GPy/core/parameterization/ties_and_remappings.py b/GPy/core/parameterization/ties_and_remappings.py index d0ceef09..d3456c79 100644 --- a/GPy/core/parameterization/ties_and_remappings.py +++ b/GPy/core/parameterization/ties_and_remappings.py @@ -91,7 +91,7 @@ class Tie(Parameterized): def _sync_val_p(p, tieparam, read): if p.tie is not None: # 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) totie = 1 if toTiedParam else 0 p_idx = p._raveled_index() @@ -142,7 +142,7 @@ class Tie(Parameterized): if p is tieparam: return # 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) p_tie = p.tie.flatten() p_size = p.size @@ -195,7 +195,7 @@ class Tie(Parameterized): if p is tieparam: return # 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) p_tie = p.tie.flatten() p_size = p.size @@ -477,6 +477,30 @@ class Tie(Parameterized): self.buf_idx = self._highest_parent_._raveled_index_for(self.tied_param) self._untie_ = self.label_buf==0 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;i0 && !(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)) def _keepParamList(self,plist): @@ -592,23 +616,19 @@ class Tie(Parameterized): try: from scipy import weave pa_grad = self._highest_parent_.gradient - label_buf = self.label_buf - buf_idx = self.buf_idx tied_grad = self.tied_param.gradient 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=""" - for(int i=0;i