working version: displays only bests results so far.

This commit is contained in:
2021-01-23 14:33:55 +01:00
parent 9f14b5e076
commit 0931d679fa
7 changed files with 246 additions and 111 deletions

30
eval.c
View File

@@ -2,30 +2,33 @@
#include "lceb.h"
int eval_node(node, depth, pvals, pops)
int eval_node(node, depth, pvals, pops, ncalcs)
NODE *node;
int depth;
int *pvals;
char *pops;
int *ncalcs;
{
static int *vals, *val_zero;
static char *ops, *ops_zero;
static int ncalc;
static int totcalc;
static *node_zero;
int val1, val2, op, res=-1, i;
int val1, val2, op, res=-1, i, lcalcs, rcalcs;
if (depth == 0) {
val_zero=vals=pvals;
ops_zero=ops=pops;
node_zero=node;
ncalc=0;
totcalc=0;
}
# ifdef DEBUG1
for (i=0; i<=depth; ++i)
printf(" ");
printf("eval : depth=%d : ", depth);
printf("eval : depth=%d : ncalcs=%d", depth, *ncalcs);
if (node->type == TREE_NODE) {
printf("node(%c)\n", *ops);
print_node(node, TREE_TOP, 0, 0);
} else {
printf("val(%d)\n", *vals);
}
@@ -34,16 +37,20 @@ int eval_node(node, depth, pvals, pops)
node->val=*vals;
res=*vals;
vals++;
*ncalcs=0;
//printf("leaf=%d\n", res);
} else {
op=*ops;
node->op=*ops;
ops++;
ncalc++;
totcalc++;
//printf("NEW node(%s)\n", ops);
val1=eval_node(node->left, depth+1, pvals, ops);
val1=eval_node(node->left, depth+1, pvals, ops, &lcalcs);
//printf("val1=%d ", val1);
if (val1 <= 0)
return -1;
val2=eval_node(node->right, depth+1, pvals, ops);
val2=eval_node(node->right, depth+1, pvals, ops, &rcalcs);
//printf("val2=%d\n", val2);
if (val2 <= 0)
return -1;
switch (op) {
@@ -67,9 +74,12 @@ int eval_node(node, depth, pvals, pops)
exit(1);
break;
}
*ncalcs=lcalcs+rcalcs+1;
}
if (res > 0) {
if (!check_best(res, *ncalcs, node, val_zero, ops_zero))
res=-1;
}
if (res > 0)
check_best(res, ncalc, node_zero, val_zero, ops_zero);
# ifdef DEBUG1
for (i=0; i<=depth; ++i)
printf(" ");