/** @pred optimizer_run(-F,-Status) Runs the optimization, _F is the best (minimal) function value and Status (int) is the status code returned by libLBFGS. Anything except 0 indicates an error, see the documentation of libLBFGS for the meaning. */ static int optimizer_run(void) { int ret = 0; YAP_Term t1 = YAP_ARG1; YAP_Term t2 = YAP_ARG2; YAP_Int s1, s2; lbfgsfloatval_t fx; lbfgsfloatval_t * tmp_x=x; if (optimizer_status == OPTIMIZER_STATUS_NONE) { printf("ERROR: Memory for parameter vector not initialized, please call optimizer_initialize/1 first.\n"); return FALSE; } if (optimizer_status != OPTIMIZER_STATUS_INITIALIZED) { printf("ERROR: Optimizer is running right now. Please wait till it is finished.\n"); return FALSE; } // both arguments have to be variables if (! YAP_IsVarTerm(t1) || ! YAP_IsVarTerm(t2)) { return FALSE; } s1 = YAP_InitSlot(t1); s2 = YAP_InitSlot(t2); optimizer_status = OPTIMIZER_STATUS_RUNNING; ret = lbfgs(n, x, &fx, evaluate, progress, NULL, ¶m); x=tmp_x; optimizer_status = OPTIMIZER_STATUS_INITIALIZED; YAP_Unify(YAP_GetFromSlot(s1),YAP_MkFloatTerm(fx)); YAP_Unify(YAP_GetFromSlot(s2),YAP_MkIntTerm(ret)); return TRUE; }
static int progress( void *instance, const lbfgsfloatval_t *local_x, const lbfgsfloatval_t *local_g, const lbfgsfloatval_t fx, const lbfgsfloatval_t xnorm, const lbfgsfloatval_t gnorm, const lbfgsfloatval_t step, int n, int k, int ls ) { YAP_Term call; YAP_Bool result; YAP_Int s1; YAP_Term t[8]; t[0] = YAP_MkFloatTerm(fx); t[1] = YAP_MkFloatTerm(xnorm); t[2] = YAP_MkFloatTerm(gnorm); t[3] = YAP_MkFloatTerm(step); t[4] = YAP_MkIntTerm(n); t[5] = YAP_MkIntTerm(k); t[6] = YAP_MkIntTerm(ls); t[7] = YAP_MkVarTerm(); call = YAP_MkApplTerm( fprogress8, 8, t); s1 = YAP_InitSlot(call); optimizer_status=OPTIMIZER_STATUS_CB_PROGRESS; result=YAP_CallProlog(call); optimizer_status=OPTIMIZER_STATUS_RUNNING; call = YAP_GetFromSlot( s1 ); if (result==FALSE) { printf("ERROR: Calling the progress call back function in YAP.\n"); // Goal did not succeed return FALSE; } if (YAP_IsIntTerm(YAP_ArgOfTerm(8,call))) { return YAP_IntOfTerm(YAP_ArgOfTerm(8,call)); } YAP_ShutdownGoal( TRUE ); fprintf(stderr, "ERROR: The progress call back function did not return an integer as last argument\n"); return 1; }
static lbfgsfloatval_t evaluate( void *instance, const lbfgsfloatval_t *x, lbfgsfloatval_t *g_tmp, const int n, const lbfgsfloatval_t step ) { YAP_Term call; YAP_Term a1; YAP_Bool result; YAP_Int s1; YAP_Term t[3]; t[0] = YAP_MkVarTerm(); t[1] = YAP_MkIntTerm(n); t[2] = YAP_MkFloatTerm(step); call = YAP_MkApplTerm(fcall3, 3, t); g=g_tmp; s1 = YAP_InitSlot(call); optimizer_status=OPTIMIZER_STATUS_CB_EVAL; result=YAP_CallProlog(call); optimizer_status=OPTIMIZER_STATUS_RUNNING; if (result==FALSE) { printf("ERROR: Calling the evaluate call back function in YAP.\n"); // Goal did not succeed return FALSE; } call = YAP_GetFromSlot( s1 ); a1 = YAP_ArgOfTerm(1,call); if (YAP_IsFloatTerm(a1)) { YAP_ShutdownGoal( TRUE ); return (lbfgsfloatval_t) YAP_FloatOfTerm(a1); } else if (YAP_IsIntTerm(a1)) { YAP_ShutdownGoal( TRUE ); return (lbfgsfloatval_t) YAP_IntOfTerm(a1); } YAP_ShutdownGoal( TRUE ); fprintf(stderr, "ERROR: The evaluate call back function did not return a number as first argument.\n"); return 0; }
/* Return a list of files for a directory */ static YAP_Bool list_directory(void) { YAP_Term tf = YAP_MkAtomTerm(YAP_LookupAtom("[]")); long sl = YAP_InitSlot(tf); char *buf = (char *)YAP_AtomName(YAP_AtomOfTerm(YAP_ARG1)); #if defined(__MINGW32__) || _MSC_VER struct _finddata_t c_file; char bs[BUF_SIZE]; long hFile; bs[0] = '\0'; #if HAVE_STRNCPY strncpy(bs, buf, BUF_SIZE); #else strcpy(bs, buf); #endif #if HAVE_STRNCAT strncat(bs, "/*", BUF_SIZE); #else strcat(bs, "/*"); #endif if ((hFile = _findfirst(bs, &c_file)) == -1L) { return (YAP_Unify(YAP_ARG2, tf)); } YAP_PutInSlot(sl, YAP_MkPairTerm(YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)), YAP_GetFromSlot(sl))); while (_findnext(hFile, &c_file) == 0) { YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(c_file.name)); YAP_PutInSlot(sl, YAP_MkPairTerm(ti, YAP_GetFromSlot(sl))); } _findclose(hFile); #else #if __ANDROID__ { extern AAssetManager *Yap_assetManager(void); const char *dirName = buf + strlen("/assets/"); AAssetManager *mgr = Yap_assetManager(); AAssetDir *de; const char *dp; if ((de = AAssetManager_openDir(mgr, dirName)) == NULL) { return (YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); } while ((dp = AAssetDir_getNextFileName(de))) { YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(dp)); YAP_PutInSlot(sl, YAP_MkPairTerm(ti, YAP_GetFromSlot(sl))); } AAssetDir_close(de); } #endif #if HAVE_OPENDIR { DIR *de; struct dirent *dp; if ((de = opendir(buf)) == NULL) { return (YAP_Unify(YAP_ARG3, YAP_MkIntTerm(errno))); } while ((dp = readdir(de))) { YAP_Term ti = YAP_MkAtomTerm(YAP_LookupAtom(dp->d_name)); YAP_PutInSlot(sl, YAP_MkPairTerm(ti, YAP_GetFromSlot(sl))); } closedir(de); } #endif /* HAVE_OPENDIR */ #endif tf = YAP_GetFromSlot(sl); return YAP_Unify(YAP_ARG2, tf); }