mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-09 04:59:31 -06:00
added exprProbability
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "pgf/data.h"
|
||||
#include <math.h>
|
||||
|
||||
PgfLiteral PgfDBMarshaller::match_lit(PgfUnmarshaller *u, PgfLiteral l)
|
||||
{
|
||||
@@ -924,6 +925,84 @@ exit:
|
||||
return type;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::eabs(PgfBindType bind_type, PgfText *name, PgfExpr body)
|
||||
{
|
||||
m->match_type(this, body);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::eapp(PgfExpr fun, PgfExpr arg)
|
||||
{
|
||||
m->match_type(this, fun);
|
||||
m->match_type(this, arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::elit(PgfLiteral lit)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::emeta(PgfMetaId meta_id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::efun(PgfText *name)
|
||||
{
|
||||
ref<PgfAbsFun> absfun =
|
||||
namespace_lookup(pgf->abstract.funs, name);
|
||||
if (absfun == 0)
|
||||
prob = INFINITY;
|
||||
else
|
||||
prob += absfun->ep.prob;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::evar(int index)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::etyped(PgfExpr expr, PgfType ty)
|
||||
{
|
||||
m->match_type(this, expr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfExpr PgfExprProbEstimator::eimplarg(PgfExpr expr)
|
||||
{
|
||||
m->match_type(this, expr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfLiteral PgfExprProbEstimator::lint(size_t size, uintmax_t *val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfLiteral PgfExprProbEstimator::lflt(double val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfLiteral PgfExprProbEstimator::lstr(PgfText *val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
PgfType PgfExprProbEstimator::dtyp(size_t n_hypos, PgfTypeHypo *hypos,
|
||||
PgfText *cat,
|
||||
size_t n_exprs, PgfExpr *exprs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void PgfExprProbEstimator::free_ref(object x)
|
||||
{
|
||||
}
|
||||
|
||||
PGF_INTERNAL
|
||||
void pgf_literal_free(PgfLiteral literal)
|
||||
{
|
||||
|
||||
@@ -236,6 +236,37 @@ public:
|
||||
const char *get_token_pos() { return token_pos; }
|
||||
};
|
||||
|
||||
class PGF_INTERNAL_DECL PgfExprProbEstimator : public PgfUnmarshaller {
|
||||
PgfPGF *pgf;
|
||||
PgfMarshaller *m;
|
||||
prob_t prob;
|
||||
|
||||
public:
|
||||
PgfExprProbEstimator(PgfPGF *pgf, PgfMarshaller *marshaller) {
|
||||
this->pgf = pgf;
|
||||
this->m = marshaller;
|
||||
this->prob = 0;
|
||||
}
|
||||
|
||||
virtual PgfExpr eabs(PgfBindType bind_type, PgfText *name, PgfExpr body);
|
||||
virtual PgfExpr eapp(PgfExpr fun, PgfExpr arg);
|
||||
virtual PgfExpr elit(PgfLiteral lit);
|
||||
virtual PgfExpr emeta(PgfMetaId meta_id);
|
||||
virtual PgfExpr efun(PgfText *name);
|
||||
virtual PgfExpr evar(int index);
|
||||
virtual PgfExpr etyped(PgfExpr expr, PgfType ty);
|
||||
virtual PgfExpr eimplarg(PgfExpr expr);
|
||||
virtual PgfLiteral lint(size_t size, uintmax_t *val);
|
||||
virtual PgfLiteral lflt(double val);
|
||||
virtual PgfLiteral lstr(PgfText *val);
|
||||
virtual PgfType dtyp(size_t n_hypos, PgfTypeHypo *hypos,
|
||||
PgfText *cat,
|
||||
size_t n_exprs, PgfExpr *exprs);
|
||||
virtual void free_ref(object x);
|
||||
|
||||
prob_t get_prob() { return prob; };
|
||||
};
|
||||
|
||||
PGF_INTERNAL_DECL extern PgfText wildcard;
|
||||
|
||||
/* The following functions release the memory in the database,
|
||||
|
||||
@@ -439,6 +439,24 @@ PgfExpr pgf_read_expr_ex(PgfText *input, const char **end_pos, PgfUnmarshaller *
|
||||
return expr;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
prob_t pgf_expr_prob(PgfDB *db, PgfRevision revision,
|
||||
PgfExpr e,
|
||||
PgfMarshaller *m,
|
||||
PgfExn *err)
|
||||
{
|
||||
PGF_API_BEGIN {
|
||||
DB_scope scope(db, READER_SCOPE);
|
||||
ref<PgfPGF> pgf = PgfDB::revision2pgf(revision);
|
||||
|
||||
PgfExprProbEstimator estimator(pgf, m);
|
||||
m->match_expr(&estimator, e);
|
||||
return estimator.get_prob();
|
||||
} PGF_API_END
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
PgfText *pgf_print_type(PgfType ty,
|
||||
PgfPrintContext *ctxt, int prio,
|
||||
|
||||
@@ -320,6 +320,12 @@ PgfExpr pgf_read_expr(PgfText *input, PgfUnmarshaller *u);
|
||||
PGF_API_DECL
|
||||
PgfExpr pgf_read_expr_ex(PgfText *input, const char **end_pos, PgfUnmarshaller *u);
|
||||
|
||||
PGF_API_DECL
|
||||
prob_t pgf_expr_prob(PgfDB *db, PgfRevision revision,
|
||||
PgfExpr e,
|
||||
PgfMarshaller *m,
|
||||
PgfExn *err);
|
||||
|
||||
PGF_API_DECL
|
||||
PgfText *pgf_print_type(PgfType ty,
|
||||
PgfPrintContext *ctxt, int prio,
|
||||
|
||||
@@ -213,7 +213,13 @@ functionProbability p fun =
|
||||
withPgfExn (pgf_function_prob c_db c_revision c_fun)
|
||||
|
||||
exprProbability :: PGF -> Expr -> Float
|
||||
exprProbability = error "TODO: exprProbability"
|
||||
exprProbability p e =
|
||||
unsafePerformIO $
|
||||
withForeignPtr (a_db p) $ \c_db ->
|
||||
withForeignPtr (revision p) $ \c_revision ->
|
||||
bracket (newStablePtr e) freeStablePtr $ \c_e ->
|
||||
withForeignPtr marshaller $ \m ->
|
||||
withPgfExn (pgf_expr_prob c_db c_revision c_e m)
|
||||
|
||||
checkExpr :: PGF -> Expr -> Type -> Either String Expr
|
||||
checkExpr = error "TODO: checkExpr"
|
||||
|
||||
@@ -113,6 +113,8 @@ foreign import ccall "pgf_function_is_constructor"
|
||||
foreign import ccall "pgf_function_prob"
|
||||
pgf_function_prob :: Ptr PgfDB -> Ptr PgfRevision -> Ptr PgfText -> Ptr PgfExn -> IO (#type prob_t)
|
||||
|
||||
foreign import ccall pgf_expr_prob :: Ptr PgfDB -> Ptr PgfRevision -> StablePtr Expr -> Ptr PgfMarshaller -> Ptr PgfExn -> IO (#type prob_t)
|
||||
|
||||
foreign import ccall pgf_clone_revision :: Ptr PgfDB -> Ptr PgfRevision -> Ptr PgfText -> Ptr PgfExn -> IO (Ptr PgfRevision)
|
||||
|
||||
foreign import ccall pgf_commit_revision :: Ptr PgfDB -> Ptr PgfRevision -> Ptr PgfExn -> IO ()
|
||||
|
||||
Reference in New Issue
Block a user