static int p_get_variable(void) { YAP_Term t; mxArray *mat; const mwSize *dims; int ndims; mat = get_array(YAP_ARG1); if (!mat) return FALSE; dims = mxGetDimensions(mat); ndims = mxGetNumberOfDimensions(mat); if (mxIsInt32(mat)) { INT32_T *input = (INT32_T *)mxGetPr(mat); t = cp_ints32(ndims, (int *)dims, input, 1, 0, YAP_TermNil()); } else if (mxIsInt64(mat)) { INT64_T *input = (INT64_T *)mxGetPr(mat); t = cp_ints64(ndims, (int *)dims, input, 1, 0, YAP_TermNil()); } else if (mxIsInt32(mat) || mxIsInt64(mat) || mxIsCell(mat)) { t = cp_cells(ndims, (int *)dims, mat, 1, 0, YAP_TermNil()); } else if (mxIsDouble(mat)) { double *input = mxGetPr(mat); t = cp_floats(ndims, (int *)dims, input, 1, 0, YAP_TermNil()); } else { return FALSE; } return YAP_Unify(YAP_ARG2, t); }
static int cuda_eval( void ) { int32_t *mat; #if defined(DATALOG) || defined(TUFFY) int32_t *query = NULL; setQuery(YAP_ARG1, &query); #endif int32_t finalDR = YAP_IntOfTerm(YAP_ARG3); int32_t n = Cuda_Eval(facts, cf, rules, cr, query, & mat, names, finalDR); #ifdef TUFFY cf = 0; #endif #ifdef ROCKIT if(cf > 0) cf *= -1; #endif #if defined(TUFFY) || defined(ROCKIT) cr = 0; names[0] = '\0'; return FALSE; #else int32_t i; predicate *ptr = (predicate *)YAP_IntOfTerm(YAP_ARG1); int32_t ncols = ptr->num_columns; YAP_Term out = YAP_TermNil(); YAP_Functor f = YAP_MkFunctor(YAP_IntToAtom(ptr->name), ncols); YAP_Term vec[256]; YAP_Atom at; if (n < 0) return FALSE; for (i=0; i<n; i++) { int32_t ni = ((n-1)-i)*ncols, j; printf("%s(", YAP_AtomName(YAP_IntToAtom(ptr->name))); for (j=0; j<ncols; j++) { vec[j] = YAP_MkIntTerm(mat[ni+j]); at = YAP_IntToAtom(mat[ni+j]); if(at != NULL) printf("%s", YAP_AtomName(at)); else printf("%d", mat[ni+j]); if(j < (ncols - 1)) printf(","); } out = YAP_MkPairTerm(YAP_MkApplTerm( f, ncols, vec ), out); printf(")\n"); } if (n > 0) free( mat ); return YAP_Unify(YAP_ARG2, out); #endif }
static YAP_Bool Q(void) { YAP_Term arg1, arg2, arg3, arg4, out, out1, term, nodesTerm, ruleTerm, tail, pair, compoundTerm; DdNode *node1, **nodes_ex; int r, lenNodes, i; double p1, p0, **eta_rule, CLL; arg1 = YAP_ARG1; arg2 = YAP_ARG2; arg3 = YAP_ARG3; arg4 = YAP_ARG4; nodesTerm = arg1; lenNodes = YAP_IntOfTerm(arg2); nodes_ex = (DdNode **)malloc(lenNodes * sizeof(DdNode *)); example_prob = (double *)malloc(lenNodes * sizeof(double)); for (i = 0; i < lenNodes; i++) { pair = YAP_HeadOfTerm(nodesTerm); node1 = (DdNode *)YAP_IntOfTerm(YAP_HeadOfTerm(pair)); nodes_ex[i] = node1; pair = YAP_TailOfTerm(pair); example_prob[i] = YAP_FloatOfTerm(YAP_HeadOfTerm(pair)); nodesTerm = YAP_TailOfTerm(nodesTerm); } for (r = 0; r < nRules; r++) { for (i = 0; i < rules[r] - 1; i++) { eta_rule = eta[r]; eta_rule[i][0] = 0; eta_rule[i][1] = 0; } } CLL = Expectation(nodes_ex, lenNodes); out = YAP_TermNil(); for (r = 0; r < nRules; r++) { tail = YAP_TermNil(); eta_rule = eta[r]; for (i = 0; i < rules[r] - 1; i++) { p0 = eta_rule[i][0]; p1 = eta_rule[i][1]; term = YAP_MkPairTerm(YAP_MkFloatTerm(p0), YAP_MkPairTerm(YAP_MkFloatTerm(p1), YAP_TermNil())); tail = YAP_MkPairTerm(term, tail); } ruleTerm = YAP_MkIntTerm(r); compoundTerm = YAP_MkPairTerm(ruleTerm, YAP_MkPairTerm(tail, YAP_TermNil())); out = YAP_MkPairTerm(compoundTerm, out); } free(nodes_ex); free(example_prob); out1 = YAP_MkFloatTerm(CLL); YAP_Unify(out1, arg4); return (YAP_Unify(out, arg3)); }
static YAP_Bool EM(void) { YAP_Term arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, out1, out2, out3, nodesTerm, ruleTerm, tail, pair, compoundTerm; DdNode *node1, **nodes_ex; int r, lenNodes, i, iter; long iter1; double CLL0 = -2.2 * pow(10, 10); //-inf double CLL1 = -1.7 * pow(10, 8); //+inf double p, p0, **eta_rule, ea, er; double ratio, diff; arg1 = YAP_ARG1; arg2 = YAP_ARG2; arg3 = YAP_ARG3; arg4 = YAP_ARG4; arg5 = YAP_ARG5; arg6 = YAP_ARG6; arg7 = YAP_ARG7; arg8 = YAP_ARG8; nodesTerm = arg1; ea = YAP_FloatOfTerm(arg2); er = YAP_FloatOfTerm(arg3); lenNodes = YAP_IntOfTerm(arg4); iter = YAP_IntOfTerm(arg5); nodes_ex = (DdNode **)malloc(lenNodes * sizeof(DdNode *)); nodes_probs_ex = (double *)malloc(lenNodes * sizeof(double)); example_prob = (double *)malloc(lenNodes * sizeof(double)); for (i = 0; i < lenNodes; i++) { pair = YAP_HeadOfTerm(nodesTerm); node1 = (DdNode *)YAP_IntOfTerm(YAP_HeadOfTerm(pair)); nodes_ex[i] = node1; pair = YAP_TailOfTerm(pair); example_prob[i] = YAP_FloatOfTerm(YAP_HeadOfTerm(pair)); nodesTerm = YAP_TailOfTerm(nodesTerm); } diff = CLL1 - CLL0; ratio = diff / fabs(CLL0); if (iter == -1) iter1 = 2147000000; else iter1 = iter; while ((diff > ea) && (ratio > er) && (cycle < iter1)) { cycle++; for (r = 0; r < nRules; r++) { for (i = 0; i < rules[r] - 1; i++) { eta_rule = eta[r]; eta_rule[i][0] = 0; eta_rule[i][1] = 0; } } CLL0 = CLL1; CLL1 = Expectation(nodes_ex, lenNodes); Maximization(); diff = CLL1 - CLL0; ratio = diff / fabs(CLL0); } out2 = YAP_TermNil(); for (r = 0; r < nRules; r++) { tail = YAP_TermNil(); p0 = 1; for (i = 0; i < rules[r] - 1; i++) { p = arrayprob[r][i] * p0; tail = YAP_MkPairTerm(YAP_MkFloatTerm(p), tail); p0 = p0 * (1 - arrayprob[r][i]); } tail = YAP_MkPairTerm(YAP_MkFloatTerm(p0), tail); ruleTerm = YAP_MkIntTerm(r); compoundTerm = YAP_MkPairTerm(ruleTerm, YAP_MkPairTerm(tail, YAP_TermNil())); out2 = YAP_MkPairTerm(compoundTerm, out2); } out3 = YAP_TermNil(); for (i = 0; i < lenNodes; i++) { out3 = YAP_MkPairTerm(YAP_MkFloatTerm(nodes_probs_ex[i]), out3); } YAP_Unify(out3, arg8); out1 = YAP_MkFloatTerm(CLL1); YAP_Unify(out1, arg6); free(nodes_ex); free(example_prob); free(nodes_probs_ex); return (YAP_Unify(out2, arg7)); }