mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 11:19:32 -06:00
debugging infrastructure in the reasoner
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
#include <pgf/pgf.h>
|
#include <pgf/pgf.h>
|
||||||
#include <pgf/data.h>
|
#include <pgf/data.h>
|
||||||
|
#include <gu/file.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
//#define PGF_REASONER_DEBUG
|
||||||
|
|
||||||
typedef struct PgfExprState PgfExprState;
|
typedef struct PgfExprState PgfExprState;
|
||||||
|
|
||||||
struct PgfExprState {
|
struct PgfExprState {
|
||||||
@@ -46,6 +49,58 @@ cmp_expr_qstate(GuOrder* self, const void* a, const void* b)
|
|||||||
static GuOrder
|
static GuOrder
|
||||||
pgf_expr_qstate_order = { cmp_expr_qstate };
|
pgf_expr_qstate_order = { cmp_expr_qstate };
|
||||||
|
|
||||||
|
#ifdef PGF_REASONER_DEBUG
|
||||||
|
static void
|
||||||
|
pgf_print_expr_state(PgfExprState* st,
|
||||||
|
GuWriter* wtr, GuExn* err, GuBuf* stack)
|
||||||
|
{
|
||||||
|
gu_buf_push(stack, int, (gu_seq_length(st->hypos) - st->arg_idx - 1));
|
||||||
|
|
||||||
|
if (st->cont != NULL)
|
||||||
|
pgf_print_expr_state(st->cont, wtr, err, stack);
|
||||||
|
|
||||||
|
gu_puts(" (", wtr, err);
|
||||||
|
pgf_print_expr(st->expr, 0, wtr, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pgf_print_expr_qstate(PgfExprQState* q, PgfAbstr* abstract,
|
||||||
|
GuWriter* wtr, GuExn* err, GuPool* tmp_pool)
|
||||||
|
{
|
||||||
|
PgfCId fun = q->abscat->functions[q->fun_idx].fun;
|
||||||
|
PgfFunDecl* absfun =
|
||||||
|
gu_map_get(abstract->funs, &fun, PgfFunDecl*);
|
||||||
|
|
||||||
|
prob_t prob = q->cont_prob+absfun->ep.prob;
|
||||||
|
gu_printf(wtr, err, "[%f]", prob);
|
||||||
|
|
||||||
|
size_t n_args = gu_seq_length(absfun->type->hypos);
|
||||||
|
|
||||||
|
GuBuf* stack = gu_new_buf(int, tmp_pool);
|
||||||
|
if (n_args > 0)
|
||||||
|
gu_buf_push(stack, int, n_args);
|
||||||
|
|
||||||
|
if (q->st != NULL)
|
||||||
|
pgf_print_expr_state(q->st, wtr, err, stack);
|
||||||
|
|
||||||
|
if (n_args > 0)
|
||||||
|
gu_puts(" (", wtr, err);
|
||||||
|
else
|
||||||
|
gu_puts(" ", wtr, err);
|
||||||
|
pgf_print_expr(absfun->ep.expr, 0, wtr, err);
|
||||||
|
|
||||||
|
size_t n_counts = gu_buf_length(stack);
|
||||||
|
for (size_t i = 0; i < n_counts; i++) {
|
||||||
|
int count = gu_buf_get(stack, int, i);
|
||||||
|
while (count-- > 0)
|
||||||
|
gu_puts(" ?", wtr, err);
|
||||||
|
|
||||||
|
gu_puts(")", wtr, err);
|
||||||
|
}
|
||||||
|
gu_puts("\n", wtr, err);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
pgf_reasoner_cat_init(PgfReasoner* rs,
|
pgf_reasoner_cat_init(PgfReasoner* rs,
|
||||||
PgfExprState* cont, prob_t cont_prob, PgfCId cat,
|
PgfExprState* cont, prob_t cont_prob, PgfCId cat,
|
||||||
@@ -85,6 +140,17 @@ pgf_reasoner_next(PgfReasoner* rs, GuPool* pool)
|
|||||||
PgfExprQState q;
|
PgfExprQState q;
|
||||||
gu_buf_heap_pop(rs->pqueue, &pgf_expr_qstate_order, &q);
|
gu_buf_heap_pop(rs->pqueue, &pgf_expr_qstate_order, &q);
|
||||||
|
|
||||||
|
#ifdef PGF_REASONER_DEBUG
|
||||||
|
{
|
||||||
|
GuPool* tmp_pool = gu_new_pool();
|
||||||
|
GuOut* out = gu_file_out(stderr, tmp_pool);
|
||||||
|
GuWriter* wtr = gu_new_utf8_writer(out, tmp_pool);
|
||||||
|
GuExn* err = gu_exn(NULL, type, tmp_pool);
|
||||||
|
pgf_print_expr_qstate(&q, rs->abstract, wtr, err, tmp_pool);
|
||||||
|
gu_pool_free(tmp_pool);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
PgfCId fun = q.abscat->functions[q.fun_idx++].fun;
|
PgfCId fun = q.abscat->functions[q.fun_idx++].fun;
|
||||||
PgfFunDecl* absfun =
|
PgfFunDecl* absfun =
|
||||||
gu_map_get(rs->abstract->funs, &fun, PgfFunDecl*);
|
gu_map_get(rs->abstract->funs, &fun, PgfFunDecl*);
|
||||||
|
|||||||
Reference in New Issue
Block a user