void ExprCopy::visit(const ExprVector& e) { for (int i=0; i<e.nb_args; i++) visit(e.arg(i)); if (fold) { int i=0; for (; i<e.nb_args; i++) { if (!dynamic_cast<const ExprConstant*>(&ARG(i))) break; } if (i==e.nb_args) { if (e.dim.is_vector()) { IntervalVector v(e.dim.vec_size()); for (i=0; i<e.nb_args; i++) { v[i]=((const ExprConstant&) ARG(i)).get_value(); } clone.insert(e, &ExprConstant::new_vector(v,e.row_vector())); } else if (e.dim.type()==Dim::MATRIX) { IntervalMatrix m(e.dim.dim2,e.dim.dim3); for (i=0; i<e.nb_args; i++) { m.set_row(i,((const ExprConstant&) ARG(i)).get_vector_value()); } clone.insert(e, &ExprConstant::new_matrix(m)); } else { assert(e.dim.type()==Dim::MATRIX_ARRAY); IntervalMatrixArray ma(e.dim.dim1,e.dim.dim2,e.dim.dim3); for (i=0; i<e.nb_args; i++) { ma[i]=((const ExprConstant&) ARG(i)).get_matrix_value(); } clone.insert(e, &ExprConstant::new_matrix_array(ma)); } return; } } Array<const ExprNode> args2(e.nb_args); for (int i=0; i<e.nb_args; i++) { args2.set_ref(i,ARG(i)); // don't remove this node even if it is a constant because // it is an element of this vector. mark(e.arg(i)); } clone.insert(e, &ExprVector::new_(args2,e.row_vector())); }
void Gradient::vector_bwd(const ExprVector& v, ExprLabel** compL, const ExprLabel& y) { if (v.dim.is_vector()) { for (int i=0; i<v.length(); i++) compL[i]->g->i()+=y.g->v()[i]; } else { if (v.row_vector()) for (int i=0; i<v.length(); i++) compL[i]->g->v()+=y.g->m()[i]; else for (int i=0; i<v.length(); i++) compL[i]->g->v()+=y.g->m().col(i); } }
void HC4Revise::vector_bwd(const ExprVector& v, ExprLabel** compL, const ExprLabel& y) { if (v.dim.is_vector()) { for (int i=0; i<v.length(); i++) if ((compL[i]->d->i() &= y.d->v()[i]).is_empty()) throw EmptyBoxException(); } else { if (v.row_vector()) for (int i=0; i<v.length(); i++) { if ((compL[i]->d->v()&=y.d->m().col(i)).is_empty()) throw EmptyBoxException(); } else for (int i=0; i<v.length(); i++) { if ((compL[i]->d->v()&=y.d->m().row(i)).is_empty()) throw EmptyBoxException(); } } }
void Affine2Eval::vector_fwd(const ExprVector& v, const ExprLabel** compL, ExprLabel& y) { assert(v.type()!=Dim::SCALAR); assert(v.type()!=Dim::MATRIX_ARRAY); if (v.dim.is_vector()) { for (int i=0; i<v.length(); i++) { y.af2->v()[i]=compL[i]->af2->i(); y.d->v()[i]=compL[i]->d->i(); } } else { if (v.row_vector()) for (int i=0; i<v.length(); i++) { y.af2->m().set_col(i,compL[i]->af2->v()); y.d->m().set_col(i,compL[i]->d->v()); } else for (int i=0; i<v.length(); i++) { y.af2->m().set_row(i,compL[i]->af2->v()); y.d->m().set_row(i,compL[i]->d->v()); } } }