def compute_joint_norm_totals(projlist,active_units_mask=True): """ Compute norm_total for each CF in each projection from a group to be normalized jointly. """ # Assumes that all Projections in the list have the same r,c size assert len(projlist)>=1 iterator = CFIter(projlist[0],active_units_mask=active_units_mask) for junk,i in iterator(): sums = [p.flatcfs[i].norm_total for p in projlist] joint_sum = numpy.add.reduce(sums) for p in projlist: p.flatcfs[i].norm_total=joint_sum
def activate(self, input_activity): """Activate using the specified response_fn and output_fn.""" self.input_buffer = input_activity self.activity *= 0.0 if self.x_avg is None: self.x_avg = self.target * ones(self.dest.shape, activity_type) if self.scaled_x_avg is None: self.scaled_x_avg = self.target * ones(self.dest.shape, activity_type) if self.sf is None: self.sf = ones(self.dest.shape, activity_type) if self.lr_sf is None: self.lr_sf = ones(self.dest.shape, activity_type) self.response_fn(CFIter(self), input_activity, self.activity, self.strength) for of in self.output_fns: of(self.activity) self.calculate_sf() self.do_scaling()
def compute_joint_norm_totals_opt(projlist, active_units_mask): """ Compute norm_total for each CF in each projections from a group to be normalized jointly. The same assumptions are made as in the original function. """ # Assumes that all Projections in the list have the same r,c size length = len(projlist) assert length >= 1 proj = projlist[0] iterator = CFIter(proj, active_units_mask=active_units_mask) num_cfs = len(proj.flatcfs) # pyflakes:ignore (passed to weave C code) active_units_mask = iterator.get_active_units_mask() sheet_mask = iterator.get_sheet_mask( ) # pyflakes:ignore (passed to weave C code) cf_type = iterator.cf_type # pyflakes:ignore (passed to weave C code) # CEBALERT: Not consistent with other C code. E.g. could be # simplified to use active_units_mask[] and sheet_mask[]? code = c_header + """ DECLARE_SLOT_OFFSET(_norm_total,cf_type); DECLARE_SLOT_OFFSET(_has_norm_total,cf_type); DECLARE_SLOT_OFFSET(weights,cf_type); DECLARE_SLOT_OFFSET(input_sheet_slice,cf_type); DECLARE_SLOT_OFFSET(mask,cf_type); npfloat *x = active_units_mask; npfloat *m = sheet_mask; for (int r=0; r<num_cfs; ++r) { double load = *x++; double msk = *m++; if (msk!=0 && load != 0) { double nt = 0; for(int p=0; p<length; p++) { PyObject *proj = PyList_GetItem(projlist,p); PyObject *cfs = PyObject_GetAttrString(proj,"flatcfs"); PyObject *cf = PyList_GetItem(cfs,r); LOOKUP_FROM_SLOT_OFFSET(int,_has_norm_total,cf); LOOKUP_FROM_SLOT_OFFSET(double,_norm_total,cf); if (_has_norm_total[0] == 0) { LOOKUP_FROM_SLOT_OFFSET(float,weights,cf); LOOKUP_FROM_SLOT_OFFSET(int,input_sheet_slice,cf); UNPACK_FOUR_TUPLE(int,rr1,rr2,cc1,cc2,input_sheet_slice); SUM_NORM_TOTAL(cf,weights,_norm_total,rr1,rr2,cc1,cc2); } nt += _norm_total[0]; Py_DECREF(cfs); } for(int p=0; p<length; p++) { PyObject *proj = PyList_GetItem(projlist,p); PyObject *cfs = PyObject_GetAttrString(proj,"flatcfs"); PyObject *cf = PyList_GetItem(cfs,r); LOOKUP_FROM_SLOT_OFFSET(double,_norm_total,cf); _norm_total[0] = nt; LOOKUP_FROM_SLOT_OFFSET(int,_has_norm_total,cf); _has_norm_total[0] = 1; Py_DECREF(cfs); } } } """ inline(code, [ 'projlist', 'active_units_mask', 'sheet_mask', 'num_cfs', 'length', 'cf_type' ], local_dict=locals(), headers=['<structmember.h>'])
def compute_joint_norm_totals_opt(projlist,active_units_mask): """ Compute norm_total for each CF in each projections from a group to be normalized jointly. The same assumptions are made as in the original function. """ # Assumes that all Projections in the list have the same r,c size length = len(projlist) assert length>=1 proj = projlist[0] iterator = CFIter(proj,active_units_mask=active_units_mask) num_cfs = len(proj.flatcfs) # pyflakes:ignore (passed to weave C code) active_units_mask = iterator.get_active_units_mask() sheet_mask = iterator.get_sheet_mask() # pyflakes:ignore (passed to weave C code) cf_type = iterator.cf_type # pyflakes:ignore (passed to weave C code) # CEBALERT: Not consistent with other C code. E.g. could be # simplified to use active_units_mask[] and sheet_mask[]? code = c_header + """ DECLARE_SLOT_OFFSET(_norm_total,cf_type); DECLARE_SLOT_OFFSET(_has_norm_total,cf_type); DECLARE_SLOT_OFFSET(weights,cf_type); DECLARE_SLOT_OFFSET(input_sheet_slice,cf_type); DECLARE_SLOT_OFFSET(mask,cf_type); npfloat *x = active_units_mask; npfloat *m = sheet_mask; for (int r=0; r<num_cfs; ++r) { double load = *x++; double msk = *m++; if (msk!=0 && load != 0) { double nt = 0; for(int p=0; p<length; p++) { PyObject *proj = PyList_GetItem(projlist,p); PyObject *cfs = PyObject_GetAttrString(proj,"flatcfs"); PyObject *cf = PyList_GetItem(cfs,r); LOOKUP_FROM_SLOT_OFFSET(int,_has_norm_total,cf); LOOKUP_FROM_SLOT_OFFSET(double,_norm_total,cf); if (_has_norm_total[0] == 0) { LOOKUP_FROM_SLOT_OFFSET(float,weights,cf); LOOKUP_FROM_SLOT_OFFSET(int,input_sheet_slice,cf); UNPACK_FOUR_TUPLE(int,rr1,rr2,cc1,cc2,input_sheet_slice); SUM_NORM_TOTAL(cf,weights,_norm_total,rr1,rr2,cc1,cc2); } nt += _norm_total[0]; Py_DECREF(cfs); } for(int p=0; p<length; p++) { PyObject *proj = PyList_GetItem(projlist,p); PyObject *cfs = PyObject_GetAttrString(proj,"flatcfs"); PyObject *cf = PyList_GetItem(cfs,r); LOOKUP_FROM_SLOT_OFFSET(double,_norm_total,cf); _norm_total[0] = nt; LOOKUP_FROM_SLOT_OFFSET(int,_has_norm_total,cf); _has_norm_total[0] = 1; Py_DECREF(cfs); } } } """ inline(code, ['projlist','active_units_mask','sheet_mask','num_cfs','length','cf_type'], local_dict=locals(), headers=['<structmember.h>'])
def n_bytes(self): return self.activity.nbytes + self.__sharedcf.weights.nbytes + \ sum([cf.input_sheet_slice.nbytes for cf,i in CFIter(self)()])