X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=modelchecker%2Fcoord.c;h=63250915d82f2f3f651f497666b84bae949be66f;hb=6dc70f7da8631fd09dea07b36d582c3812beca86;hp=d5aceb5c93a6df5630e8794cdb78efb97ee93074;hpb=9e1a2f4a73174e25df74833a362c583b1020fa71;p=mc1516pa.git diff --git a/modelchecker/coord.c b/modelchecker/coord.c index d5aceb5..6325091 100644 --- a/modelchecker/coord.c +++ b/modelchecker/coord.c @@ -244,10 +244,11 @@ int check_visited(BDD s, BDD v, BDDSET vars){ state_t *explstate(state *init, rels *rls, state *g){ LACE_ME; - lurd_t *lrd = NULL; deque *state_queue = create(); trans_t *t = NULL; - state_t *tmp_state = NULL; + state_t *tmp_state = (state_t *)malloc(sizeof(state_t)); + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + //state_t *new_state = (state_t *)malloc(sizeof(state_t)); BDD visited = init->bdd; BDD new; tmp_state->bdd = init->bdd; @@ -255,129 +256,149 @@ state_t *explstate(state *init, rels *rls, state *g){ tmp_state->lrd = lrd; state_queue = enq(tmp_state, state_queue); - while (isEmpty(state_queue) == 1){ + while (isEmpty(state_queue) == 0){ tmp_state = get_front(state_queue); state_queue = deq(state_queue); + new = tmp_state->bdd; t = rls->rell; - new = sylvan_false; while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + new = sylvan_relnext(tmp_state->bdd, t->bdd, t->varset.varset); + if (new != sylvan_false && new != tmp_state->bdd) break; t = t->next_rel; } - if (check_visited(new, visited, init->vars.varset) == 0){ - if (check_goal(new, g->bdd, init->vars.varset) == 0){ - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'l'); - new_state->lrd = lrd; - state_queue = enq(new_state, state_queue); - visited = sylvan_or(new, visited); - } - else { - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'l'); - new_state->lrd = lrd; - return new_state; + if (new != sylvan_false && new != tmp_state->bdd){ + if (check_visited(new, visited, init->vars.varset) == 0){ + if (check_goal(new, g->bdd, init->vars.varset) == 0){ + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'l'); + new_state->lrd = lrd; + state_queue = enq(new_state, state_queue); + visited = sylvan_or(new, visited); + } + else { + printf("GOAL\n"); + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'l'); + new_state->lrd = lrd; + return new_state; + } } } t = rls->relu; - new = sylvan_false; while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + new = sylvan_relnext(tmp_state->bdd, t->bdd, t->varset.varset); + if (new != sylvan_false && new != tmp_state->bdd) break; t = t->next_rel; } - if (check_visited(new, visited, init->vars.varset) == 0){ - if (check_goal(new, g->bdd, init->vars.varset) == 0){ - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'u'); - new_state->lrd = lrd; - state_queue = enq(new_state, state_queue); - visited = sylvan_or(new, visited); - } - else { - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'u'); - new_state->lrd = lrd; - return new_state; + if (new != sylvan_false && new != tmp_state->bdd){ + if (check_visited(new, visited, init->vars.varset) == 0){ + if (check_goal(new, g->bdd, init->vars.varset) == 0){ + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'u'); + new_state->lrd = lrd; + state_queue = enq(new_state, state_queue); + visited = sylvan_or(new, visited); + } + else { + printf("GOAL\n"); + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'u'); + new_state->lrd = lrd; + return new_state; + } } } t = rls->relr; - new = sylvan_false; while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + new = sylvan_relnext(tmp_state->bdd, t->bdd, t->varset.varset); + if (new != sylvan_false && new != tmp_state->bdd) break; t = t->next_rel; } - if (check_visited(new, visited, init->vars.varset) == 0){ - if (check_goal(new, g->bdd, init->vars.varset) == 0){ - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'r'); - new_state->lrd = lrd; - state_queue = enq(new_state, state_queue); - visited = sylvan_or(new, visited); - } - else { - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'r'); - new_state->lrd = lrd; - return new_state; + if (new != sylvan_false && new != tmp_state->bdd){ + if (check_visited(new, visited, init->vars.varset) == 0){ + if (check_goal(new, g->bdd, init->vars.varset) == 0){ + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'r'); + new_state->lrd = lrd; + state_queue = enq(new_state, state_queue); + visited = sylvan_or(new, visited); + } + else { + printf("GOAL\n"); + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'r'); + new_state->lrd = lrd; + return new_state; + } } } + t = rls->reld; - new = sylvan_false; while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + new = sylvan_relnext(tmp_state->bdd, t->bdd, t->varset.varset); + if (new != sylvan_false && new != tmp_state->bdd) break; t = t->next_rel; } - if (check_visited(new, visited, init->vars.varset) == 0){ - if (check_goal(new, g->bdd, init->vars.varset) == 0){ - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'd'); - new_state->lrd = lrd; - state_queue = enq(new_state, state_queue); - visited = sylvan_or(new, visited); - } - else { - lurd_t *lrd = tmp_state->lrd; - state_t *new_state = NULL; - new_state = (state_t*)malloc(sizeof(state_t)); - new_state->bdd = new; - new_state->vars = init->vars; - lrd = lappend(lrd, 'd'); - new_state->lrd = lrd; - return new_state; + if (new != sylvan_false && new != tmp_state->bdd){ + if (check_visited(new, visited, init->vars.varset) == 0){ + if (check_goal(new, g->bdd, init->vars.varset) == 0){ + + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'd'); + new_state->lrd = lrd; + state_queue = enq(new_state, state_queue); + visited = sylvan_or(new, visited); + } + else { + printf("GOAL\n"); + lurd_t *lrd = (lurd_t *)malloc(sizeof(lurd_t)); + state_t *new_state = (state_t *)malloc(sizeof(state_t)); + memcpy(lrd, tmp_state->lrd, sizeof(lurd_t)); + + new_state->bdd = new; + new_state->vars = init->vars; + lrd = lappend(lrd, 'd'); + new_state->lrd = lrd; + return new_state; + } } } + } return NULL;