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;
 }
Beispiel #2
0
    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);
    }
Beispiel #3
0
 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()) {}