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); }
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; }
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); }