예제 #1
0
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;
}
예제 #2
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);	
		
}
예제 #3
0
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();
	}
		
}