mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
gr and gt now take into account the -lang flag
This commit is contained in:
@@ -2,6 +2,21 @@
|
||||
#include "data.h"
|
||||
#include "generator.h"
|
||||
|
||||
bool PgfGenerator::function_has_lins(PgfText *name)
|
||||
{
|
||||
for (ref<PgfConcr> concr : concrs) {
|
||||
ref<PgfConcrLin> lin =
|
||||
namespace_lookup(concr->lins, name);
|
||||
if (lin == 0)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void PgfGenerator::addConcr(ref<PgfConcr> concr) {
|
||||
concrs.push_back(concr);
|
||||
}
|
||||
|
||||
PgfExpr PgfGenerator::eabs(PgfBindType btype, PgfText *name, PgfExpr body)
|
||||
{
|
||||
body = m->match_expr(this, body);
|
||||
@@ -206,6 +221,10 @@ again: {
|
||||
prob_t rand_value = rand();
|
||||
|
||||
ref<PgfAbsFun> fun = probspace_random(pgf->abstract.funs_by_cat, cat, rand_value);
|
||||
|
||||
if (!function_has_lins(&fun->name))
|
||||
fun = 0;
|
||||
|
||||
if (fun == 0) {
|
||||
if (var_expr != 0) {
|
||||
prob += -log(VAR_PROB/(1-VAR_PROB));
|
||||
@@ -392,6 +411,9 @@ bool PgfExhaustiveGenerator::State0::process(PgfExhaustiveGenerator *gen)
|
||||
|
||||
gen->push_left_states(space->right, &(*space->value.cat), res, outside_prob);
|
||||
|
||||
if (!gen->function_has_lins(&fun->name))
|
||||
return true;
|
||||
|
||||
PgfExpr expr = gen->u->efun(&fun->name);
|
||||
|
||||
res->ref_count++;
|
||||
|
||||
@@ -20,6 +20,7 @@ protected:
|
||||
PgfMarshaller *m;
|
||||
PgfInternalMarshaller i_m;
|
||||
PgfUnmarshaller *u;
|
||||
std::vector<ref<PgfConcr>> concrs;
|
||||
|
||||
PgfGenerator(ref<PgfPGF> pgf,
|
||||
size_t depth,
|
||||
@@ -31,7 +32,11 @@ protected:
|
||||
this->u = u;
|
||||
}
|
||||
|
||||
bool function_has_lins(PgfText *);
|
||||
|
||||
public:
|
||||
void addConcr(ref<PgfConcr> concr);
|
||||
|
||||
virtual PgfExpr eabs(PgfBindType btype, PgfText *name, PgfExpr body);
|
||||
virtual PgfExpr eapp(PgfExpr fun, PgfExpr arg);
|
||||
virtual PgfExpr elit(PgfLiteral lit);
|
||||
|
||||
@@ -1194,6 +1194,7 @@ void pgf_check_type(PgfDB *db, PgfRevision revision,
|
||||
|
||||
PGF_API
|
||||
PgfExpr pgf_generate_random(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfType type, size_t depth,
|
||||
uint64_t *seed, prob_t *prob,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
@@ -1208,6 +1209,9 @@ PgfExpr pgf_generate_random(PgfDB *db, PgfRevision revision,
|
||||
// for others. We try 10 time to increase the chance of succeess.
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
PgfRandomGenerator gen(pgf, depth, seed, m, u);
|
||||
for (size_t i = 0; i < n_concr_revisions; i++) {
|
||||
gen.addConcr(db->revision2concr(concr_revisions[i]));
|
||||
}
|
||||
PgfExpr expr = m->match_type(&gen, type);
|
||||
if (expr != 0) {
|
||||
*prob = gen.getProb();
|
||||
@@ -1222,6 +1226,7 @@ PgfExpr pgf_generate_random(PgfDB *db, PgfRevision revision,
|
||||
PGF_API
|
||||
PgfExpr pgf_generate_random_from
|
||||
(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfExpr expr, size_t depth,
|
||||
uint64_t *seed, prob_t *prob,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
@@ -1236,6 +1241,9 @@ PgfExpr pgf_generate_random_from
|
||||
// for others. We try 10 time to increase the chance of succeess.
|
||||
for (size_t i = 0; i < 10; i++) {
|
||||
PgfRandomGenerator gen(pgf, depth, seed, m, u);
|
||||
for (size_t i = 0; i < n_concr_revisions; i++) {
|
||||
gen.addConcr(db->revision2concr(concr_revisions[i]));
|
||||
}
|
||||
PgfExpr new_expr = m->match_expr(&gen, expr);
|
||||
if (new_expr != 0) {
|
||||
*prob = gen.getProb();
|
||||
@@ -1249,6 +1257,7 @@ PgfExpr pgf_generate_random_from
|
||||
|
||||
PGF_API
|
||||
PgfExprEnum *pgf_generate_all(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfType type, size_t depth,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
PgfExn *err)
|
||||
@@ -1259,6 +1268,9 @@ PgfExprEnum *pgf_generate_all(PgfDB *db, PgfRevision revision,
|
||||
ref<PgfPGF> pgf = db->revision2pgf(revision);
|
||||
|
||||
PgfExhaustiveGenerator *gen = new PgfExhaustiveGenerator(pgf, depth, m, u);
|
||||
for (size_t i = 0; i < n_concr_revisions; i++) {
|
||||
gen->addConcr(db->revision2concr(concr_revisions[i]));
|
||||
}
|
||||
m->match_type(gen, type);
|
||||
return gen;
|
||||
} PGF_API_END
|
||||
|
||||
@@ -511,6 +511,7 @@ void pgf_check_type(PgfDB *db, PgfRevision revision,
|
||||
|
||||
PGF_API_DECL
|
||||
PgfExpr pgf_generate_random(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfType type, size_t depth,
|
||||
uint64_t *seed, prob_t *prob,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
@@ -519,6 +520,7 @@ PgfExpr pgf_generate_random(PgfDB *db, PgfRevision revision,
|
||||
PGF_API_DECL
|
||||
PgfExpr pgf_generate_random_from
|
||||
(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfExpr expr, size_t depth,
|
||||
uint64_t *seed, prob_t *prob,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
@@ -542,6 +544,7 @@ struct PgfExprEnum {
|
||||
|
||||
PGF_API_DECL
|
||||
PgfExprEnum *pgf_generate_all(PgfDB *db, PgfRevision revision,
|
||||
PgfConcrRevision *concr_revisions, size_t n_concr_revisions,
|
||||
PgfType type, size_t depth,
|
||||
PgfMarshaller *m, PgfUnmarshaller *u,
|
||||
PgfExn *err);
|
||||
|
||||
Reference in New Issue
Block a user