double calc_log_prof(const mul_ind_t &cur){ check_ind(cur); double prof=0; for (auto itr=cur.begin();itr!=cur.end();itr++) prof = std::max(prof, (itr->value-SparseMIndex::SET_BASE)*weights[itr->ind]); return prof; }
void CalcLogEW(const mul_ind_t &cur, double& lE, double& lW){ assert(cur.size() <= MaxDim()); double d_work=0, d_error=0; double s_work=0, s_error_chi=0, s_error_theta=0; unsigned int d = d_err_rates.size(); auto mfun = [](unsigned int i) { return (i==0)?0:(i==1?1:(1+(1<<(i-1)))); }; for (auto itr=cur.begin();itr!=cur.end();itr++){ if (itr->ind < d){ d_error -= (itr->value-1)*d_err_rates[itr->ind]; d_work += (itr->value-1)*d_work_rates[itr->ind]; } else{ unsigned int M_1 = mfun(itr->value-1); unsigned int M = mfun(itr->value); double dM_1 = static_cast<double>(M_1); double dM = static_cast<double>(M); s_work += log(dM - dM_1); s_error_chi += -dM_1*s_g_bar_rates[itr->ind-d]; s_error_theta += -dM_1*(s_g_rates[itr->ind-d]-s_g_bar_rates[itr->ind-d]); } } lW = d_work + s_work; lE = s_error_chi + std::min(s_error_theta, d_error); }
void CalcLogEW(const mul_ind_t &cur, double& lE, double& lW){ static const int SET_BASE = SparseMIndex::SET_BASE; assert(cur.size() <= MaxDim()); lW = lE = 0; for (auto itr=cur.begin();itr!=cur.end();itr++){ lW += (itr->value-SET_BASE)*wW[itr->ind]; lE += (itr->value-SET_BASE)*wE[itr->ind]; } }
double calc_log_prof(const mul_ind_t &cur) { check_ind(cur); double d_cont=0; double s_cont=0; unsigned int d = d_rates.size(); auto mfun = [](unsigned int i) { return (i==0)?0:(i==1?1:(1+(1<<(i-1)))); }; for (auto itr=cur.begin();itr!=cur.end();itr++){ if (itr->ind < d) d_cont += (itr->value - SparseMIndex::SET_BASE)*d_rates[itr->ind]; else{ unsigned int M_1 = mfun(itr->value-SparseMIndex::SET_BASE); unsigned int M = mfun(1+itr->value-SparseMIndex::SET_BASE); double dM_1 = static_cast<double>(M_1); double dM = static_cast<double>(M); // log(dM - dM_1) is the work contribution s_cont += log(dM - dM_1) + dM_1*s_err_rates[itr->ind-d]; } } return d_cont + s_cont; }
setprof_t(const mul_ind_t &i, double p): ind(i), profit(p), size(i.size()) {}