int main(){ std::vector<double> vec1(10); std::vector<double> vec2(10); // fill vec1 with 1 to 10 // fill vec2 with 10 to 19 for(int i = 0; i < vec1.size(); i++){ vec1[i] = i + 1; vec2[i] = i + 10; } std::vector<double> vec3(10); vec3 = mult_vec(vec1, vec2); std::vector<double> vec4(10); vec4 = mult_vec(vec1, 5.5); std::cout << "Result of mult_vec(vec1, vec2)" << std::endl; for(int i = 0; i < vec3.size(); i++){ std::cout << vec3[i] << " "; } std::cout << std::endl; std::cout << "Result of mult_vec(vec1, 5.5)" << std::endl; for(int i = 0; i < vec4.size(); i++){ std::cout << vec4[i] << " "; } std::cout << std::endl; return 0; }
void icm_Abst::gradientDescent_step(){ if(failedGA_counts > 500){return;} double org_llk = sum_llk(); backupCH = baseCH; baseCH_2_baseS(); baseS_2_baseP(); numeric_dobs_dp(true); int k = base_p_derv.size(); prop_p.resize(k); double prop_mean = 0; int act_sum = 0; double new_llk; vector<bool> isActive(k); for(int i = 0; i < k; i++){ if(baseP[i] > 0 && !ISNAN(base_p_derv[i]) ){ isActive[i] = true; act_sum++; } else { isActive[i] = false; } } for(int i = 0; i < k; i++){ if(isActive[i]){ prop_mean += base_p_derv[i]; } } prop_mean = prop_mean / act_sum; for(int i = 0; i < k; i++){ if(isActive[i]){ prop_p[i] = base_p_derv[i] - prop_mean;} else {prop_p[i] = 0.0;} } makeUnitVector(prop_p); double scale_max = getMaxScaleSize(baseP, prop_p); for(int i = 0; i < k; i++){ prop_p[i] *= -1.0; } scale_max = min(scale_max, getMaxScaleSize(baseP, prop_p)); for(int i = 0; i < k; i++){ prop_p[i] *= -1.0; } double delta_val = scale_max/2.0; delta_val = min(delta_val, h); delta_val = delta_val/10.0; double analytic_dd = directional_derv(base_p_derv, prop_p); if(delta_val == 0){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); return; } add_vec(delta_val, prop_p, baseP); double llk_h = llk_from_p(); add_vec(-2.0 * delta_val, prop_p, baseP); double llk_l = llk_from_p(); add_vec(delta_val, prop_p, baseP); double llk_0 = llk_from_p(); double d1 = ( llk_h - llk_l ) / ( 2 * delta_val ); double d2 = (llk_h + llk_l - 2.0 * llk_0 ) / (delta_val * delta_val); if(iter % 2 ==0){ d1 = analytic_dd; } delta_val = -d1/d2; if(!(delta_val > 0)){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); return; } if(ISNAN(delta_val)){ failedGA_counts++; baseCH= backupCH; new_llk = sum_llk(); return; } scale_max = getMaxScaleSize(baseP, prop_p); delta_val = min( delta_val, scale_max ); add_vec(delta_val, prop_p, baseP); new_llk = llk_from_p(); mult_vec(-1.0, prop_p); int tries = 0; double this_delta = delta_val; while(tries < 5 && new_llk < llk_0){ tries++; this_delta = this_delta/2; add_vec(this_delta, prop_p, baseP); new_llk = llk_from_p(); } if(new_llk < llk_0){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); //Should NOT be llk_from_p(), since we are resetting the CH return; } if(org_llk > new_llk){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); } // Rprintf("change in llk in CGA step = %f\n", new_llk - org_llk); }
void icm_Abst::experimental_step(){ if(failedGA_counts > 500){return;} double org_llk = sum_llk(); backupCH = baseCH; baseCH_2_baseS(); baseS_2_baseP(); numeric_dobs2_d2p(); int k = base_p_derv.size(); prop_p.resize(k); double prop_mean = 0; int act_sum = 0; double new_llk; vector<bool> isActive(k); for(int i = 0; i < k; i++){ if(baseP[i] > 0 && !ISNAN(base_p_derv[i]) && base_p_2ndDerv[i] < -0.001){ isActive[i] = true; act_sum++; } else { isActive[i] = false; } } for(int i = 0; i < k; i++){ if(isActive[i]){ prop_mean += -base_p_derv[i]/base_p_2ndDerv[i]; } } prop_mean = prop_mean / act_sum; for(int i = 0; i < k; i++){ if(isActive[i]){ prop_p[i] = -base_p_derv[i]/base_p_2ndDerv[i] - prop_mean;} else {prop_p[i] = 0.0;} } makeUnitVector(prop_p); double scale_max = getMaxScaleSize(baseP, prop_p); for(int i = 0; i < k; i++){ prop_p[i] *= -1.0; } scale_max = min(scale_max, getMaxScaleSize(baseP, prop_p)); for(int i = 0; i < k; i++){ prop_p[i] *= -1.0; } double delta_val = scale_max/2.0; delta_val = min(delta_val, h); delta_val = delta_val/10.0; // double analytic_dd = directional_derv(base_p_derv, prop_p); if(delta_val == 0){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); Rprintf("Exit 1\n"); return; } add_vec(delta_val, prop_p, baseP); double llk_h = llk_from_p(); add_vec(-2.0 * delta_val, prop_p, baseP); double llk_l = llk_from_p(); add_vec(delta_val, prop_p, baseP); double llk_0 = llk_from_p(); double d1 = ( llk_h - llk_l ) / ( 2 * delta_val ); double d2 = (llk_h + llk_l - 2.0 * llk_0 ) / (delta_val * delta_val); delta_val = -d1/d2; if(ISNAN(delta_val)){ failedGA_counts++; baseCH= backupCH; new_llk = sum_llk(); Rprintf("warning: delta_val is nan in GA step. llk_h = %f, llk_l = %f, llk_0 = %f, scale_max = %f\n", llk_h, llk_l, llk_0, scale_max); Rprintf("Exit 3\n"); return; } scale_max = getMaxScaleSize(baseP, prop_p); delta_val = min( delta_val, scale_max ); add_vec(delta_val, prop_p, baseP); new_llk = llk_from_p(); mult_vec(-1.0, prop_p); int tries = 0; double this_delta = delta_val; while(tries < 5 && new_llk < llk_0){ tries++; this_delta = this_delta/2; add_vec(this_delta, prop_p, baseP); new_llk = llk_from_p(); } if(new_llk < llk_0){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); //Should NOT be llk_from_p(), since we are resetting the CH Rprintf("Exit 4\n"); return; } if(org_llk > new_llk){ failedGA_counts++; baseCH = backupCH; new_llk = sum_llk(); } }