Exemplo n.º 1
0
double K_crossval_l1o(ok_kernel* k, int minalgo, int maxiter, double params[]) {
    
    int nd = K_getNdata(k);
    
    
    int np = omp_get_max_threads();
    ok_kernel* ks[np];
    double lh[np];
    ok_progress prog = k->progress;
    
    for (int p = 0; p < np; p++) {
        ks[p] = K_clone(k);
        ks[p]->progress = NULL;
        lh[p] = 0.;
    }
    bool invalid = false;
    
    #pragma omp parallel for
    for (int i = 0; i < nd; i++) {
        if (invalid)
            continue;
        
        int p = omp_get_thread_num();
        gsl_matrix_memcpy(ks[p]->system->elements, k->system->elements);
        gsl_vector_memcpy(ks[p]->params, k->params);
        
        K_calculate(ks[p]);
        double err = ks[p]->compiled[i][T_ERR];
        int set = (int) (ks[p]->compiled[i][T_SET]);
        double n = K_getPar(ks[p], set + DATA_SETS_SIZE);
        
        
        ks[p]->compiled[i][T_ERR] = 100000.;
        
        K_minimize(ks[p], minalgo, maxiter, params);
        
        double s = sqrt(err*err + n*n);
        double diff = fabs(ks[p]->compiled[i][T_SVAL] - ks[p]->compiled[i][T_PRED]);
        lh[p] += log10(diff/s);
        ks[p]->compiled[i][T_ERR] = err;
        
        if (prog != NULL && omp_get_thread_num() == 0) {
            int ret = prog(i * np, nd, ks[p],
                    "K_crossVal_l1o");
            if (ret == PROGRESS_STOP) {
                invalid = true;
            }
        }
    }
 
    double lh2 = 0;
    for (int p = 0; p < np; p++) {
        lh2 += lh[p];
        K_free(ks[p]);
    }
    if (invalid)
        return -1;
    
    return fabs(lh2);
}
Exemplo n.º 2
0
int K_minimizeWithTimeout(ok_kernel* k, int to) {
    mtime = time(NULL);
    timeout = to;
    failed = 0;
    k->progress = progressWithTimeout;
    K_minimize(k, SIMPLEX, 5000, NULL);
    k->progress = NULL;
    return failed;
}
Exemplo n.º 3
0
double _kminimize(ok_kernel* k, int algo) {
    K_calculate(k);

    double chi2 = K_getChi2_nr(k);
    while (true) {
        K_minimize(k, algo, 10000, NULL);

        if (K_getChi2_nr(k) - chi2 < -0.01)
            chi2 = K_getChi2_nr(k);
        else
            break;
    }

    return K_getChi2_nr(k);
}