void Function::hansen_matrix(const IntervalVector& box, IntervalMatrix& H) const { int n=nb_var(); int m=expr().dim.vec_size(); assert(H.nb_cols()==n); assert(box.size()==n); assert(expr().dim.is_vector()); 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)); } }
bool proj_mul(const IntervalMatrix& y, IntervalMatrix& x1, IntervalMatrix& x2, double ratio) { int m=y.nb_rows(); int n=y.nb_cols(); assert(x1.nb_cols()==x2.nb_rows()); assert(x1.nb_rows()==m); assert(x2.nb_cols()==n); // each coefficient (i,j) of y is considered as a binary "dot product" constraint // between the ith row of x1 and the jth column of x2 // (advantage: we have exact projection for the dot product) // // we propagate these constraints using a simple agenda. Agenda a(m*n); //init for (int i=0; i<m; i++) for (int j=0; j<n; j++) a.push(i*n+j); int k; while (!a.empty()) { a.pop(k); int i=k/n; int j=k%n; IntervalVector x1old=x1[i]; IntervalVector x2j=x2.col(j); IntervalVector x2old=x2j; if (!proj_mul(y[i][j],x1[i],x2j)) { x1.set_empty(); x2.set_empty(); return false; } else { if (x1old.rel_distance(x1[i])>=ratio) { for (int j2=0; j2<n; j2++) if (j2!=j) a.push(i*n+j2); } if (x2old.rel_distance(x2j)>=ratio) { for (int i2=0; i2<m; i2++) if (i2!=i) a.push(i2*n+j); } x2.set_col(j,x2j); } } return true; }
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)); } }