Various ProbLog improvements
This commit is contained in:
@@ -378,6 +378,10 @@ int simpleNamedBDDtoDot(DdManager *manager, namedvars varmap, DdNode *bdd, char
|
||||
DdNode *f[1];
|
||||
int ret;
|
||||
FILE *fd;
|
||||
// Reordering until getting the optimal bdd //
|
||||
/* Cudd_AutodynDisable(manager);
|
||||
Cudd_ReduceHeap(manager, CUDD_REORDER_SIFT_CONVERGE, 1);*/
|
||||
// better before making an ADD //
|
||||
f[0] = Cudd_BddToAdd(manager, bdd);
|
||||
fd = fopen(filename, "w");
|
||||
if (fd == NULL) {
|
||||
@@ -690,8 +694,7 @@ int LoadVariableData(namedvars varmap, char *filename) {
|
||||
if (hasvar >= 0) {
|
||||
switch(idat) {
|
||||
case 0:
|
||||
if (IsRealNumber(dataread)) dvalue = atof(dataread);
|
||||
else {
|
||||
if (!getRealNumber(dataread, &dvalue)) {
|
||||
fprintf(stderr, "Error at file: %s. Variable: %s can't have non real value: %s.\n", filename, varname, dataread);
|
||||
fclose(data);
|
||||
free(varname);
|
||||
@@ -701,8 +704,7 @@ int LoadVariableData(namedvars varmap, char *filename) {
|
||||
idat++;
|
||||
break;
|
||||
case 1:
|
||||
if (IsNumber(dataread)) ivalue = atoi(dataread);
|
||||
else {
|
||||
if (!getIntNumber(dataread, &ivalue)) {
|
||||
fprintf(stderr, "Error at file: %s. Variable: %s can't have non integer value: %s.\n", filename, varname, dataread);
|
||||
fclose(data);
|
||||
free(varname);
|
||||
@@ -1706,34 +1708,46 @@ void onlinetraverse(DdManager *manager, namedvars varmap, hisqueue *HisQueue, Dd
|
||||
inputline[icur] = '\0';
|
||||
if ((icur > 0) && (inputline[0] == '@') && (inputline[2] == ',' || inputline[2] == '\0')) {
|
||||
switch(inputline[1]) {
|
||||
case '?':
|
||||
printf("Available instructions:\n\t@c : current node\n\t@n,[BFS, DFS] : expand and go to next node\n\t@t,[BFS, DFS] : throw and go to next node\n");
|
||||
printf("\t@h : high node of current\n\t@l : low node of current\n\t@v,[variable] : variable values\n\t@e terminates\n");
|
||||
break;
|
||||
case 'c':
|
||||
if (iRoot) {
|
||||
iRoot = 0;
|
||||
printf("bdd_temp_value('%s', %i).\n", GetNodeVarNameDisp(manager, varmap, curnode), 1);
|
||||
printf("bdd_temp_value('%s', %i, %p).\n", GetNodeVarNameDisp(manager, varmap, curnode), 1, (void *) curnode);
|
||||
} else {
|
||||
printf("bdd_temp_value('%s', %i).\n", GetNodeVarNameDisp(manager, varmap, curnode), iQsize);
|
||||
printf("bdd_temp_value('%s', %i, %p).\n", GetNodeVarNameDisp(manager, varmap, curnode), iQsize, (void *) curnode);
|
||||
}
|
||||
fflush(stdout);
|
||||
break;
|
||||
case 'n':
|
||||
if (curnode != HIGH(manager) && curnode != LOW(manager) && (hnode = GetNode(his, varmap.varstart, curnode)) == NULL) {
|
||||
//AddNode(his, varmap.varstart, curnode, 0.0, 0, NULL);
|
||||
l_node = LowNodeOf(manager, curnode);
|
||||
h_node = HighNodeOf(manager, curnode);
|
||||
inQ = 0;
|
||||
iQsize += 2;
|
||||
Q = (DdNode **) realloc(Q, sizeof(DdNode *) * iQsize);
|
||||
Q[iQsize - 2] = l_node;
|
||||
Q[iQsize - 1] = h_node;
|
||||
//AddNode(his, varmap.varstart, curnode, 0.0, 0, NULL);
|
||||
/* inQ = 0;
|
||||
for(i = 0; (i < iQsize / 2) && (inQ < 3); i++)
|
||||
inQ = (Q[i] == l_node) || (Q[iQsize - i] == l_node) + 2 * (Q[i] == h_node) || (Q[iQsize - i] == h_node);
|
||||
if ((inQ & 1) == 0) inQ = inQ + (GetNode(his, varmap.varstart, l_node) != NULL);
|
||||
if ((inQ & 2) == 0) inQ = inQ + 2 * (GetNode(his, varmap.varstart, h_node) != NULL);
|
||||
if ((inQ & 1) == 1) inQ = inQ - (l_node == HIGH(manager) || l_node == LOW(manager));
|
||||
if ((inQ & 2) == 2) inQ = inQ - 2 * (h_node == HIGH(manager) || h_node == LOW(manager));
|
||||
inQ = 0;
|
||||
inQ = (Q[i] == l_node) || (Q[iQsize - i - 1] == l_node) + 2 * (Q[i] == h_node) || (Q[iQsize - i - 1] == h_node);
|
||||
if ((l_node == HIGH(manager) || l_node == LOW(manager))) {
|
||||
inQ = (inQ & 2);
|
||||
} else {
|
||||
if ((inQ & 1) == 0) inQ = inQ + (GetNode(his, varmap.varstart, l_node) != NULL);
|
||||
}
|
||||
if (h_node == HIGH(manager) || h_node == LOW(manager)) {
|
||||
inQ = (inQ & 1);
|
||||
} else {
|
||||
if ((inQ & 2) == 0) inQ = inQ + 2 * (GetNode(his, varmap.varstart, h_node) != NULL);
|
||||
}*/
|
||||
/* if ((inQ & 1) == 1) inQ = inQ - (l_node == HIGH(manager) || l_node == LOW(manager));
|
||||
if ((inQ & 2) == 2) inQ = inQ - 2 * (h_node == HIGH(manager) || h_node == LOW(manager));*/
|
||||
/* inQ = 0;
|
||||
switch(inQ) {
|
||||
case 0:
|
||||
iQsize += 2;
|
||||
Q = (DdNode **) realloc(Q, sizeof(DdNode *) * iQsize);
|
||||
Q[iQsize - 2] = l_node;
|
||||
Q[iQsize - 1] = h_node;
|
||||
break;
|
||||
case 1:
|
||||
iQsize++;
|
||||
@@ -1749,7 +1763,7 @@ void onlinetraverse(DdManager *manager, namedvars varmap, hisqueue *HisQueue, Dd
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
if (inputline[2] == '\0' || strcmp(inputline + 3, "DFS") == 0) {
|
||||
if (iQsize > 0) {
|
||||
@@ -1774,6 +1788,30 @@ void onlinetraverse(DdManager *manager, namedvars varmap, hisqueue *HisQueue, Dd
|
||||
exit(-1);
|
||||
}
|
||||
break;
|
||||
case 't':
|
||||
if (inputline[2] == '\0' || strcmp(inputline + 3, "DFS") == 0) {
|
||||
if (iQsize > 0) {
|
||||
iQsize--;
|
||||
curnode = Q[iQsize];
|
||||
Q = (DdNode **) realloc(Q, sizeof(DdNode *) * iQsize);
|
||||
}
|
||||
} else if (strcmp(inputline + 3, "BFS") == 0) {
|
||||
if (iQsize > 0) {
|
||||
iQsize--;
|
||||
curnode = Q[0];
|
||||
Q2 = (DdNode **) malloc(sizeof(DdNode *) * iQsize);
|
||||
for(i = 0; i < iQsize; i++)
|
||||
Q2[i] = Q[i + 1];
|
||||
free(Q);
|
||||
Q = Q2;
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Error: Could not find method: %s, Correct syntax @n,[DFS, BFS].\n", inputline + 3);
|
||||
free(Q);
|
||||
free(inputline);
|
||||
exit(-1);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
printf("bdd_temp_value('%s').\n", GetNodeVarNameDisp(manager, varmap, HighNodeOf(manager, curnode)));
|
||||
fflush(stdout);
|
||||
|
||||
Reference in New Issue
Block a user