/*! Change number of sets, set end, and initialize all sets as empty If \c n_set_in is zero, any memory currently allocated for this object is freed. Otherwise, new memory may be allocated for the sets (if needed). \param n_set_in is the number of sets in this vector of sets. \param end_in is the maximum element plus one (the minimum element is 0). */ void resize(size_t n_set_in, size_t end_in) { n_set_ = n_set_in; end_ = end_in; if( n_set_ == 0 ) { data_.free(); return; } // now start a new vector with empty sets Pack zero(0); data_.erase(); n_pack_ = ( 1 + (end_ - 1) / n_bit_ ); size_t i = n_set_ * n_pack_; if( i > 0 ) { data_.extend(i); while(i--) data_[i] = zero; } // values that signify past end of list next_index_ = n_set_; next_element_ = end_; }
/*! Change number of sets, set end, and initialize all sets as empty Any memory currently allocated for this object is freed. If both \a n_set_in and \a end_in are non-zero new memory is allocated, otherwise no new memory is allocated for the object. \param n_set_in is the number of sets in this vector of sets. \param end_in is the maximum element plus one (the minimum element is 0). */ void resize(size_t n_set_in, size_t end_in) { Pack zero(0); data_.erase(); n_set_ = n_set_in; end_ = end_in; n_pack_ = ( 1 + (end_ - 1) / n_bit_ ); size_t i = n_set_ * n_pack_; if( i > 0 ) { data_.extend(i); while(i--) data_[i] = zero; } // values that signify past end of list next_index_ = n_set_; next_element_ = end_; }
void my_init(vector<bool> keepcol){ Partial.extend(num_var_tape_ * 1); arg_mark_.resize(play_.op_arg_rec_.size()); for(size_t i=0;i<arg_mark_.size();i++)arg_mark_[i]=false; /* Run a reverse test-sweep to store pointers once */ tape_point tp; play_.reverse_start(tp.op, tp.op_arg, tp.op_index, tp.var_index); tp_.resize(tp.op_index+1); var2op_.resize(tp.var_index+1); op_mark_.resize(tp.op_index+1); for(size_t i=0;i<op_mark_.size();i++)op_mark_[i]=0; user_region_mark_.resize(tp.op_index+1); for(size_t i=0;i<user_region_mark_.size();i++)user_region_mark_[i]=0; tp_[tp.op_index]=tp; /* 1. We need to be able to find out, for a given variable, what operator created the variable. This is easiest done by looping through the _operators_ because for a given op we have access to all the resulting variables it creates. 2. We precompute the a vector of "tape_points" so that instead of calling "reverse_next", we simply get the next tape entry by tp_[i-1]. */ while(tp.op != BeginOp ){ /* tp.op_index is decremented by one in each iteration ... */ // printTP(tp); /* For debugging */ play_.reverse_next(tp.op, tp.op_arg, tp.op_index, tp.var_index); /* Csum is special case - see remarks in player.hpp and reverse_sweep.hpp */ if(tp.op == CSumOp)play_.reverse_csum(tp.op, tp.op_arg, tp.op_index, tp.var_index); for(size_t i=0;i<NumRes(tp.op);i++)var2op_[tp.var_index-i]=tp.op_index; tp_[tp.op_index]=tp; markArgs(tp); } /* Lookup table: is tape_point within a UserOp region? */ bool user_within=false; user_region_.resize(tp_.size()); for(size_t i=0;i<tp_.size();i++){ if(tp_[i].op==UserOp){ user_region_[i]=true; user_within=!user_within; } else { user_region_[i]=user_within; } } /* Lookup table: is tape_point a constant (=only fixed effect dependent) ? */ constant_tape_point_.resize(tp_.size()); int indep_var_number=0; for(size_t i=0;i<tp_.size();i++){ if(tp_[i].op==InvOp){ /* All independent variables are marked according to being random or fixed effect */ constant_tape_point_[i]=!keepcol[indep_var_number]; indep_var_number++; } else { /* Mark operator as constant if _all_ arguments are constant */ constant_tape_point_[i] = is_tape_point_constant(i); } //std::cout << constant_tape_point_[i] << " "; printTP(tp_[i]); } // std::cout << "Total: " << constant_tape_point_.size() << "\n"; // int sum=0; for(int i=0;i<constant_tape_point_.size();i++)sum+=constant_tape_point_[i]; // std::cout << "Constant:" << sum << "\n"; // Calculate pattern int m=Range(); colpattern.resize(m); for(int i=0;i<m;i++)my_pattern(i); for(size_t i=0;i<op_mark_.size();i++)op_mark_[i]=0; /* remember to reset marks */ for(size_t i=0;i<user_region_mark_.size();i++)user_region_mark_[i]=0; /* remember to reset marks */ }