X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=modelchecker%2Fmain.c;h=85c630309be020c6d17f8e0a91b37cbec8115755;hb=956facb67e30cb9964211d00110f287f0a8d43c0;hp=38597f66d6018f589dec42873131dc1dd5ee5192;hpb=ade8a4923d9f24713f5a84691b3ecbda6c5e7fad;p=mc1516pa.git diff --git a/modelchecker/main.c b/modelchecker/main.c index 38597f6..85c6303 100644 --- a/modelchecker/main.c +++ b/modelchecker/main.c @@ -60,6 +60,7 @@ void solve(FILE *inputstream) sylvan_init_bdd(6); state *init = encode_screen(screen); + state *goal = encode_goal(screen); rels *rls = encode_rel(screen); /* printf("Doing left\n"); @@ -75,50 +76,57 @@ void solve(FILE *inputstream) BDD old = sylvan_false; BDD new = init->bdd; int iteration = 0; - while(new != old){ - old = new; - ERRPRINT("Iteration %d\n", iteration++); - trans_t *t = rls->rell; - - //for testing - /* - BDDSET testvars = sylvan_set_fromarray(((BDDVAR[]){0,2,4,6,8,10,12,14,16}), 9); - BDD teststate = sylvan_cube(testvars, (uint8_t[]){1,0,1,0,0,1,0,1,0}); - BDD teststate1 = sylvan_or(teststate, sylvan_cube(testvars, (uint8_t[]){0,0,1,1,0,1,0,1,0})); - BDD teststate2 = sylvan_or(teststate1, sylvan_cube(testvars, (uint8_t[]){0,1,0,0,0,1,1,0,1})); - if (new == teststate2) printf("Wrong!\n"); - */ - while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); - t = t->next_rel; - //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); + if (goal != NULL){ + while(new != old){ + old = new; + ERRPRINT("Iteration %d\n", iteration++); + trans_t *t = rls->rell; + + //for testing + /* + BDDSET testvars = sylvan_set_fromarray(((BDDVAR[]){0,2,4,6,8,10,12,14,16}), 9); + BDD teststate = sylvan_cube(testvars, (uint8_t[]){1,0,1,0,0,1,0,1,0}); + BDD teststate1 = sylvan_or(teststate, sylvan_cube(testvars, (uint8_t[]){0,0,1,1,0,1,0,1,0})); + BDD teststate2 = sylvan_or(teststate1, sylvan_cube(testvars, (uint8_t[]){0,1,0,0,0,1,1,0,1})); + if (new == teststate2) printf("Wrong!\n"); + */ + while (t != NULL){ + new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + t = t->next_rel; + //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); + } + + t = rls->relu; + while (t != NULL){ + new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + t = t->next_rel; + //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); + } + + + t = rls->relr; + while (t != NULL){ + new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + t = t->next_rel; + //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); + } + + + t = rls->reld; + while (t != NULL){ + new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); + t = t->next_rel; + //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); + } + double check = sylvan_satcount(sylvan_and(goal->bdd, new), init->vars.varset); + if (check > 0){ + printf("Solution is found after %d iteration(s)!\n", iteration); + break; + } } - - t = rls->relu; - while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); - t = t->next_rel; - //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); - } - - - t = rls->relr; - while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); - t = t->next_rel; - //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); - } - - - t = rls->reld; - while (t != NULL){ - new = sylvan_or(new, sylvan_relnext(new, t->bdd, t->varset.varset)); - t = t->next_rel; - //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset)); - } - - } - ERRPRINT("Satcount: %f\n", sylvan_satcount(old, init->vars.varset)); + } + else printf("No solution found!\n"); + //ERRPRINT("Satcount: %f\n", sylvan_satcount(old, init->vars.varset)); // sylvan_enum(old, init->vars.varset, (enum_cb)callback, NULL); // sylvan_printdot_nc(old); time_end_encode = clock();