summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf/reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/c/pgf/reader.c')
-rw-r--r--src/runtime/c/pgf/reader.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c
index 6b287f68e..1fee45f83 100644
--- a/src/runtime/c/pgf/reader.c
+++ b/src/runtime/c/pgf/reader.c
@@ -34,7 +34,6 @@
#define GU_LOG_ENABLE
#include <gu/log.h>
-typedef struct PgfIdContext PgfIdContext;
typedef GuMap PgfContsMap;
@@ -443,6 +442,7 @@ pgf_read_to_PgfCCatId(GuType* type, PgfReader* rdr, void* to)
ccat->lindefs = gu_map_get(rdr->curr_lindefs, &fid, PgfFunIds*);
ccat->n_synprods = 0;
ccat->prods = gu_null_seq;
+ ccat->viterbi_prob = 0;
ccat->fid = fid;
gu_map_put(rdr->curr_concr->ccats, &fid, PgfCCat*, ccat);
@@ -465,6 +465,7 @@ pgf_read_to_PgfCCat(GuType* type, PgfReader* rdr, void* to)
ccat->cnccat = NULL;
ccat->lindefs = gu_map_get(rdr->curr_lindefs, fidp, PgfFunIds*);
ccat->prods = gu_new_seq(PgfProduction, n_prods, rdr->opool);
+ ccat->viterbi_prob = 0;
ccat->fid = *fidp;
size_t top = 0;
@@ -600,7 +601,7 @@ pgf_read_new_PgfFunDecl(GuType* type, PgfReader* rdr, GuPool* pool, size_t* size
}
absfun->ep.prob = - log(gu_in_f64be(rdr->in, rdr->err));
-
+
PgfExprFun* expr_fun =
gu_new_variant(PGF_EXPR_FUN,
PgfExprFun,
@@ -638,11 +639,33 @@ pgf_read_to_PgfFunId(GuType* type, PgfReader* rdr, void* to)
*(PgfFunId*) to = gu_list_elems(rdr->curr_concr->cncfuns)[id];
}
+typedef struct {
+ GuMapItor fn;
+ PgfReader* rdr;
+} PgfIndexFn;
+
+static void
+pgf_compute_meta_probs(GuMapItor* fn, const void* key, void* value, GuExn* err)
+{
+ (void) (key && err);
+
+ PgfCat* cat = *((PgfCat**) value);
+
+ double mass = 0;
+ for (size_t i = 0; i < cat->n_functions; i++) {
+ mass += cat->functions[i].prob;
+ }
+ cat->meta_prob = - log(fabs(1 - mass));
+}
+
static void
pgf_read_to_PgfAbstr(GuType* type, PgfReader* rdr, void* to)
{
rdr->curr_abstr = to;
pgf_read_to_struct(type, rdr, to);
+
+ PgfIndexFn clo = { { pgf_compute_meta_probs }, rdr };
+ gu_map_iter(rdr->curr_abstr->cats, &clo.fn, NULL);
}
static GU_DEFINE_TYPE(PgfLinDefs, GuIntMap, gu_ptr_type(PgfFunIds),
@@ -691,11 +714,6 @@ pgf_ccat_set_cnccat(PgfCCat* ccat)
return ccat->cnccat;
}
-typedef struct {
- GuMapItor fn;
- PgfReader* rdr;
-} PgfIndexFn;
-
static void
pgf_read_ccat_cb(GuMapItor* fn, const void* key, void* value, GuExn* err)
{
@@ -771,12 +789,6 @@ pgf_read_new_PgfConcr(GuType* type, PgfReader* rdr, GuPool* pool,
concr->total_cats = pgf_read_int(rdr);
concr->max_fid = concr->total_cats;
- PgfIndexFn clo1 = { { pgf_read_ccat_cb }, rdr };
- gu_map_iter(concr->ccats, &clo1.fn, NULL);
-
- PgfIndexFn clo2 = { { pgf_index_prods }, rdr };
- gu_map_iter(concr->ccats, &clo2.fn, NULL);
-
// set the function ids
int n_funs = gu_list_length(concr->cncfuns);
for (int funid = 0; funid < n_funs; funid++) {
@@ -788,6 +800,12 @@ pgf_read_new_PgfConcr(GuType* type, PgfReader* rdr, GuPool* pool,
cncfun->ep = (absfun == NULL) ? NULL : &absfun->ep;
}
+ PgfIndexFn clo1 = { { pgf_read_ccat_cb }, rdr };
+ gu_map_iter(concr->ccats, &clo1.fn, NULL);
+
+ PgfIndexFn clo2 = { { pgf_index_prods }, rdr };
+ gu_map_iter(concr->ccats, &clo2.fn, NULL);
+
return concr;
}
@@ -821,6 +839,7 @@ pgf_read_new_PgfCncCat(GuType* type, PgfReader* rdr, GuPool* pool,
ccat->lindefs = gu_map_get(rdr->curr_lindefs, &fid, PgfFunIds*);
ccat->n_synprods = 0;
ccat->prods = gu_null_seq;
+ ccat->viterbi_prob = 0;
ccat->fid = fid;
gu_map_put(rdr->curr_concr->ccats, &fid, PgfCCat*, ccat);