- Reimplemented the weight functions for goal selection.

- Added --goal-select function, defaults to 3.
This commit is contained in:
ccremers 2004-12-29 14:17:49 +00:00
parent 2d978f3232
commit 5e695097f2
4 changed files with 124 additions and 19 deletions

View File

@ -8,6 +8,7 @@
*/ */
#include <limits.h> #include <limits.h>
#include <float.h>
#ifdef DEBUG #ifdef DEBUG
#include <malloc.h> #include <malloc.h>
#endif #endif
@ -1201,6 +1202,78 @@ printSemiState ()
eprintf ("!! - open: %i -\n", open); eprintf ("!! - open: %i -\n", open);
} }
//! Give an indication of the amount of consequences binding a term has
/**
* Given a term, returns a float. 0: maximum consequences, 1: no consequences.
*/
float
termBindConsequences (Term t)
{
Termlist openVariables;
openVariables = termlistAddVariables(NULL, t);
if (openVariables == NULL)
{
// No variables, no consequences
return 1;
}
else
{
// For each run event in the semitrace, check whether it contains any
// of the open variables.
int totalCount;
int affectedCount;
int run;
totalCount = 0;
affectedCount = 0;
run = 0;
while (run < sys->maxruns)
{
Roledef rd;
int step;
rd = sys->runs[run].start;
step = 0;
while (step < sys->runs[run].length)
{
Termlist tl;
tl = openVariables;
while (tl != NULL)
{
if ((rd->type == READ || rd->type == SEND) && termSubTerm (rd->message, tl->term))
{
// This run event contains the open variable
affectedCount++;
tl = NULL;
}
else
{
tl = tl->next;
}
}
totalCount++;
step++;
rd = rd->next;
}
run++;
}
termlistDelete (openVariables);
if (totalCount > 0)
{
// Valid computation
return (float) (totalCount - affectedCount) / totalCount;
}
else
{
// No consequences, ensure no division by 0
return 1;
}
}
}
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// Larger logical componentents // Larger logical componentents
//------------------------------------------------------------------------ //------------------------------------------------------------------------
@ -1213,6 +1286,11 @@ printSemiState ()
* *
* Because the list starts with the newest terms, and we use <= (as opposed to <), we * Because the list starts with the newest terms, and we use <= (as opposed to <), we
* ensure that for goals with equal constraint levels, we select the oldest one. * ensure that for goals with equal constraint levels, we select the oldest one.
*
* selection masks for --select-goal
* 1: constrain level of term
* 2: key or not
* 4: consequences determination
*/ */
Binding Binding
select_goal () select_goal ()
@ -1220,7 +1298,10 @@ select_goal ()
List bl; List bl;
Binding best; Binding best;
float min_constrain; float min_constrain;
int max_level; int mode;
// mode bits local storage
mode = sys->switchGoalSelectMethod;
// Find the most constrained goal // Find the most constrained goal
if (sys->output == PROOF) if (sys->output == PROOF)
@ -1228,9 +1309,9 @@ select_goal ()
indentPrint (); indentPrint ();
eprintf ("Listing open goals that might be chosen: "); eprintf ("Listing open goals that might be chosen: ");
} }
max_level = INT_MIN; min_constrain = FLT_MAX;
best = NULL;
bl = sys->bindings; bl = sys->bindings;
best = NULL;
while (bl != NULL) while (bl != NULL)
{ {
Binding b; Binding b;
@ -1241,30 +1322,45 @@ select_goal ()
if (!b->done && !realTermVariable (deVar (b->term))) if (!b->done && !realTermVariable (deVar (b->term)))
//if (!b->done) //if (!b->done)
{ {
float cons; float buf_constrain;
int buf_weight;
void adapt (int w, float fl)
{
buf_constrain = buf_constrain + w * fl;
buf_weight = buf_weight + w;
}
// buf_constrain is the addition of the factors before division by weight
buf_constrain = 0;
buf_weight = 0;
if (sys->output == PROOF && best != NULL) if (sys->output == PROOF && best != NULL)
eprintf (", "); eprintf (", ");
if (b->level >= max_level)
// Determine buf_constrain levels
// Bit 0: 1 constrain level
if (mode & 1) adapt (1, term_constrain_level (b->term));
// Bit 1: 2 key level (inverted)
if (mode & 2) adapt (2, 0.5 * (1 - b->level));
// Bit 2: 4 consequence level
if (mode & 4) adapt (2, termBindConsequences (b->term));
// Weigh result
if (buf_weight == 0 || buf_constrain <= min_constrain)
{ {
if (b->level > max_level) min_constrain = buf_constrain;
{ best = b;
max_level = b->level; if (sys->output == PROOF)
min_constrain = 1; // 1 is the maximum eprintf ("*");
}
cons = term_constrain_level (b->term);
if (cons <= min_constrain)
{
min_constrain = cons;
best = b;
if (sys->output == PROOF)
eprintf ("*");
}
} }
if (sys->output == PROOF) if (sys->output == PROOF)
{ {
termPrint (b->term); termPrint (b->term);
eprintf ("[%i]", b->level); if (mode & 2)
{
eprintf ("[%i]", b->level);
}
} }
} }
bl = bl->next; bl = bl->next;
@ -1279,6 +1375,7 @@ select_goal ()
} }
//! Create a new intruder run to generate knowledge from m0 //! Create a new intruder run to generate knowledge from m0
int int
bind_goal_new_m0 (const Binding b) bind_goal_new_m0 (const Binding b)
{ {

View File

@ -128,6 +128,8 @@ main (int argc, char **argv)
arg_int0 ("r", "max-runs", NULL, "create at most <int> runs"); arg_int0 ("r", "max-runs", NULL, "create at most <int> runs");
struct arg_lit *switch_incremental_runs = arg_lit0 (NULL, "increment-runs", struct arg_lit *switch_incremental_runs = arg_lit0 (NULL, "increment-runs",
"incremental search using the number of runs"); "incremental search using the number of runs");
struct arg_int *switch_goal_select_method =
arg_int0 (NULL, "goal-select", NULL, "use goal selection method <int> (default 0)");
struct arg_lit *switch_latex_output = struct arg_lit *switch_latex_output =
arg_lit0 (NULL, "latex", "output attacks in LaTeX format"); arg_lit0 (NULL, "latex", "output attacks in LaTeX format");
struct arg_lit *switch_empty = struct arg_lit *switch_empty =
@ -193,6 +195,7 @@ main (int argc, char **argv)
switch_prune_proof_depth, switch_prune_proof_depth,
switch_prune_trace_length, switch_incremental_trace_length, switch_prune_trace_length, switch_incremental_trace_length,
switch_maximum_runs, switch_incremental_runs, switch_maximum_runs, switch_incremental_runs,
switch_goal_select_method,
switch_implicit_choose, switch_implicit_choose,
switch_choose_first, switch_choose_first,
@ -236,6 +239,7 @@ main (int argc, char **argv)
switch_prune_proof_depth->ival[0] = -1; switch_prune_proof_depth->ival[0] = -1;
switch_maximum_runs->ival[0] = INT_MAX; switch_maximum_runs->ival[0] = INT_MAX;
switch_pruning_method->ival[0] = 2; switch_pruning_method->ival[0] = 2;
switch_goal_select_method->ival[0] = -1;
/* Parse the command line as defined by argtable[] */ /* Parse the command line as defined by argtable[] */
nerrors = arg_parse (argc, argv, argtable); nerrors = arg_parse (argc, argv, argtable);
@ -533,6 +537,8 @@ main (int argc, char **argv)
sys->switch_maxproofdepth = switch_prune_proof_depth->ival[0]; sys->switch_maxproofdepth = switch_prune_proof_depth->ival[0];
if (switch_prune_trace_length->ival[0] >= 0) if (switch_prune_trace_length->ival[0] >= 0)
sys->switch_maxtracelength = switch_prune_trace_length->ival[0]; sys->switch_maxtracelength = switch_prune_trace_length->ival[0];
if (switch_goal_select_method->ival[0] >= 0)
sys->switchGoalSelectMethod = switch_goal_select_method->ival[0];
#ifdef DEBUG #ifdef DEBUG
/* in debugging mode, some extra switches */ /* in debugging mode, some extra switches */
if (switch_debug_indent->count > 0) if (switch_debug_indent->count > 0)

View File

@ -74,6 +74,7 @@ systemInit ()
sys->switchReduceClaims = 1; // default remove claims from duplicate instance choosers sys->switchReduceClaims = 1; // default remove claims from duplicate instance choosers
sys->switchClaims = 0; // default don't report on claims sys->switchClaims = 0; // default don't report on claims
sys->switchClaimToCheck = NULL; // default check all claims sys->switchClaimToCheck = NULL; // default check all claims
sys->switchGoalSelectMethod = 3; // default goal selection method
/* set illegal traversal by default, to make sure it is set /* set illegal traversal by default, to make sure it is set
later */ later */

View File

@ -141,6 +141,7 @@ struct system
int switchReduceEndgame; //!< Enable endgame cutter int switchReduceEndgame; //!< Enable endgame cutter
int switchReduceClaims; //!< Symmetry reduction on claims (only works when switchAgentSymm is true) int switchReduceClaims; //!< Symmetry reduction on claims (only works when switchAgentSymm is true)
int switchClaims; //!< Enable clails report int switchClaims; //!< Enable clails report
int switchGoalSelectMethod; //!< Goal selection method for Arachne engine
Term switchClaimToCheck; //!< Which claim should be checked? Term switchClaimToCheck; //!< Which claim should be checked?
//! Latex output switch. //! Latex output switch.