Function::~Function() { if (_used_var!=NULL) delete[] _used_var; if (comp!=NULL) { /* warning... if there is only one constraint * then comp[0] is the same object as f itself! * * This is not a very consistent choice... */ if (image_dim()>1) { for (int i=0; i<image_dim(); i++) if (!zero || comp[i]!=zero) delete comp[i]; } if (zero) delete zero; delete[] comp; } if (cf.code!=NULL) { cleanup(expr(),false); for (int i=0; i<nb_arg(); i++) { delete &arg(i); } } if (df!=NULL) delete df; if (name!=NULL) { // name==NULL if init/build_from_string was never called. free((char*) name); delete[] symbol_index; } }
IntervalMatrix Function::eval_affine2_matrix(const IntervalVector& box, Affine2Matrix& affine) const { ExprLabel res = Affine2Eval().eval_label(*this,box); affine = Affine2Matrix(expr().dim.dim2, expr().dim.dim3); switch (expr().dim.type()) { case Dim::SCALAR : { affine[0][0] = res.af2->i(); return IntervalMatrix(1,1,res.d->i()); } case Dim::ROW_VECTOR : { affine.set_row(0,res.af2->v()); IntervalMatrix M(image_dim(),1); M.set_row(0,res.d->v()); return M; } case Dim::COL_VECTOR : { affine.set_col(0,res.af2->v()); IntervalMatrix M(1,image_dim()); M.set_col(0,res.d->v()); return M; } case Dim::MATRIX: { affine = res.af2->m(); return res.d->m(); } default : { assert(false); } } }
void Function::jacobian(const IntervalVector& x, IntervalMatrix& J) const { assert(J.nb_cols()==nb_var()); assert(x.size()==nb_var()); assert(J.nb_rows()==image_dim()); // calculate the gradient of each component of f for (int i=0; i<image_dim(); i++) { (*this)[i].gradient(x,J[i]); } }
void Function::jacobian(const IntervalVector& box, IntervalMatrix& J, const VarSet& set) const { assert(J.nb_cols()==set.nb_var); assert(box.size()==nb_var()); assert(J.nb_rows()==image_dim()); IntervalVector g(nb_var()); // calculate the gradient of each component of f for (int i=0; i<image_dim(); i++) { (*this)[i].gradient(box,g); J.set_row(i,set.var_box(g)); } }
void Function::hansen_matrix(const IntervalVector& box, IntervalMatrix& H, const VarSet& set) const { int n=set.nb_var; int m=image_dim(); assert(H.nb_cols()==n); assert(box.size()==nb_var()); assert(H.nb_rows()==m); IntervalVector var_box=set.var_box(box); IntervalVector param_box=set.param_box(box); IntervalVector x=var_box.mid(); IntervalMatrix J(m,n); for (int var=0; var<n; var++) { //var=tab[i]; x[var]=var_box[var]; jacobian(set.full_box(x,param_box),J,set); H.set_col(var,J.col(var)); } }
void Function::hansen_matrix(const IntervalVector& box, IntervalMatrix& H) const { int n=nb_var(); int m=image_dim(); assert(H.nb_cols()==n); assert(box.size()==n); assert(H.nb_rows()==m); IntervalVector x=box.mid(); IntervalMatrix J(m,n); // test! // int tab[box.size()]; // box.sort_indices(false,tab); // int var; for (int var=0; var<n; var++) { //var=tab[i]; x[var]=box[var]; jacobian(x,J); H.set_col(var,J.col(var)); } }