def __check__(self): Objective.__check__(self) # arrays self.edge = atleast_2d_col(self.edge) if not isinstance(self.scale,VyPy.data.scaling.ScalingFunction): self.scale = atleast_2d_col(self.scale)
def __check__(self): # evaluator class if not isinstance(self.evaluator, Evaluator): self.evaluator = Evaluator(function=self.evaluator) # gradients and hessians if self.evaluator.gradient is None: self.gradient = None if self.evaluator.hessian is None: self.hessian = None # arrays self.edge = atleast_2d_col(self.edge) if not isinstance(self.scale,VyPy.data.scaling.ScalingFunction): self.scale = atleast_2d_col(self.scale)
def __init__(self, XB, X, Y, DY=None): # make sure all are 2D arrays XB = atleast_2d_row(XB) X = atleast_2d_row(X) Y = atleast_2d_col(Y) # sizes ntx, nx = X.shape nty, ny = Y.shape assert ntx == nty, 'different training data X and targets Y' assert XB.shape[ 0] == nx, 'different training data X and bounds XB dimension' assert ny == 1, 'training targets Y must be a column vector' # handle optional gradients if DY is None: DY = np.empty([0, nx]) ntdy, ndy = DY.shape else: DY = atleast_2d_row(DY) ntdy, ndy = DY.shape assert ntx == ntdy, 'different training data X and target gradients DY' # make sure data is of type float X = X.astype(float) Y = Y.astype(float) DY = DY.astype(float) XB = XB.astype(float) # store data self['X'] = X self['Y'] = Y self['DY'] = DY self['XB'] = XB
def __call__(self, variables): step = self.step variables = deepcopy(variables) if not isinstance(variables, obunch): variables = obunch(variables) # arrayify variables values_init = variables.pack_array('vector') values_init = atleast_2d_row(values_init) nx = values_init.shape[1] # prepare step if not isinstance(step, (array_type, list, tuple)): step = [step] * nx step = atleast_2d_row(step) if not step.shape[0] == 1: step = step.T values_run = np.vstack( [values_init, np.tile(values_init, [nx, 1]) + np.diag(step[0])]) variables_run = [ deepcopy(variables).unpack_array(val) for val in values_run ] # run the function #for i in variables_run: print i results = self.function(variables_run) #for i in results: print i results_values = np.vstack( [atleast_2d_row(res.pack_array('vector')) for res in results]) # pack results gradients_values = (results_values[1:, :] - results_values[None, 0, :]) / step.T gradients_values = np.ravel(gradients_values) variables = variables.unpack_array(values_init[0] * 0.0) gradients = deepcopy(results[0]) if not isinstance(gradients, obunch): gradients = obunch(gradients) for i, g in gradients.items(): if isinstance(g, array_type): g = atleast_2d_col(g) gradients[i] = deepcopy(variables) for j, v in gradients[i].items(): if isinstance(v, array_type): v = atleast_2d_row(v) gradients[i][j] = g * v gradients.unpack_array(gradients_values) return gradients
def __call__(self,variables): step = self.step variables = deepcopy(variables) if not isinstance(variables,obunch): variables = obunch(variables) # arrayify variables values_init = variables.pack_array('vector') values_init = atleast_2d_row(values_init) nx = values_init.shape[1] # prepare step if not isinstance(step,(array_type,list,tuple)): step = [step] * nx step = atleast_2d_row(step) if not step.shape[0] == 1: step = step.T values_run = np.vstack([ values_init , np.tile(values_init,[nx,1]) + np.diag(step[0]) ]) variables_run = [ deepcopy(variables).unpack_array(val) for val in values_run ] # run the function #for i in variables_run: print i results = self.function(variables_run) #for i in results: print i results_values = np.vstack([ atleast_2d_row( res.pack_array('vector') ) for res in results ]) # pack results gradients_values = ( results_values[1:,:] - results_values[None,0,:] ) / step.T gradients_values = np.ravel( gradients_values ) variables = variables.unpack_array( values_init[0] * 0.0 ) gradients = deepcopy(results[0]) if not isinstance(gradients,obunch): gradients = obunch(gradients) for i,g in gradients.items(): if isinstance(g,array_type): g = atleast_2d_col(g) gradients[i] = deepcopy(variables) for j,v in gradients[i].items(): if isinstance(v,array_type): v = atleast_2d_row(v) gradients[i][j] = g * v gradients.unpack_array(gradients_values) return gradients
def __call__(self,variables): step = self.step variables = deepcopy(variables) if not isinstance(variables,obunch): variables = obunch(variables) # arrayify variables values_init = variables.pack_array('vector') values_init = atleast_2d_row(values_init) nx = values_init.shape[1] # prepare step if not isinstance(step,(array_type,list,tuple)): step = [step] * nx step = atleast_2d_col(step) if not step.shape[1] == 1: step = step.T values_run = np.hstack([ values_init , np.tile(values_init,[nx,1]) + np.diag(step) ]) # run the function results = self.function(values_run) # pack results gradients_values = ( results[1:,:] - results[None,0,:] ) / step gradients_values = np.ravel(gradients_values) variables.unpack_array( values_init * 0.0 ) gradients = deepcopy(results[0]) for k in gradients.keys(): gradients[k] = deepcopy(variables) gradients.unpack_array(gradients_values) return gradients