static void pgf_print_cncfun(PgfCncFun *cncfun, PgfSequences *sequences, GuWriter *wtr, GuExn *err) { gu_printf(wtr,err," F%d := (", cncfun->funid); size_t n_seqs = gu_list_length(sequences); for (size_t i = 0; i < cncfun->n_lins; i++) { if (i > 0) gu_putc(',', wtr, err); PgfSequence seq = cncfun->lins[i]; for (size_t seqid = 0; seqid < n_seqs; seqid++) { if (gu_seq_data(gu_list_index(sequences, seqid)) == gu_seq_data(seq)) { gu_printf(wtr,err,"S%d", seqid); break; } } } gu_puts(") [", wtr, err); gu_string_write(cncfun->name, wtr, err); gu_puts("]\n", wtr, err); }
static PgfAbsFun* pgf_read_absfun(PgfReader* rdr, PgfAbstr* abstr, PgfAbsFun* absfun) { size_t len = pgf_read_len(rdr); PgfExprFun *efun = gu_new_flex_variant(PGF_EXPR_FUN, PgfExprFun, fun, len+1, &absfun->ep.expr, rdr->opool); gu_in_bytes(rdr->in, (uint8_t*)efun->fun, len, rdr->err); efun->fun[len] = 0; absfun->name = efun->fun; gu_return_on_exn(rdr->err, NULL); absfun->type = pgf_read_type_(rdr); gu_return_on_exn(rdr->err, NULL); absfun->arity = pgf_read_int(rdr); uint8_t tag = pgf_read_tag(rdr); gu_return_on_exn(rdr->err, NULL); switch (tag) { case 0: absfun->defns = NULL; if (absfun->arity == 0) { absfun->closure.code = abstr->eval_gates->evaluate_value; absfun->closure.con = &absfun->closure.code; } else { absfun->closure.code = NULL; } break; case 1: { size_t length = pgf_read_len(rdr); gu_return_on_exn(rdr->err, NULL); absfun->defns = gu_new_seq(PgfEquation*, length, rdr->opool); PgfEquation** data = gu_seq_data(absfun->defns); for (size_t i = 0; i < length; i++) { size_t n_patts = pgf_read_len(rdr); gu_return_on_exn(rdr->err, NULL); PgfEquation *equ = gu_malloc(rdr->opool, sizeof(PgfEquation)+sizeof(PgfPatt)*n_patts); equ->n_patts = n_patts; for (size_t j = 0; j < n_patts; j++) { equ->patts[j] = pgf_read_patt(rdr); gu_return_on_exn(rdr->err, NULL); } equ->body = pgf_read_expr_(rdr); gu_return_on_exn(rdr->err, NULL); data[i] = equ; } // pgf_jit_function(rdr, abstr, absfun); break; } default: pgf_read_tag_error(rdr); break; } absfun->ep.prob = - log(pgf_read_double(rdr)); return absfun; }