X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=modelchecker%2Fmain.c;h=85c630309be020c6d17f8e0a91b37cbec8115755;hb=956facb67e30cb9964211d00110f287f0a8d43c0;hp=95b8458e45e57cf7afec4d6ce0d7f3655d445f93;hpb=c4d4a1d7cbe6a1c6dd2a2b3ba80b3f3029ee8186;p=mc1516pa.git diff --git a/modelchecker/main.c b/modelchecker/main.c index 95b8458..85c6303 100644 --- a/modelchecker/main.c +++ b/modelchecker/main.c @@ -46,7 +46,7 @@ void solve(FILE *inputstream) clock_t time_start_encode, time_end_encode; time_start_read = clock(); - sokoban_screen *screen = parse_screen(inputstream); + sokoban_screen *screen = parse_screen(inputstream, false); if (screen == NULL) printf("Something went wrong...\n"); //sokoban_print(screen); time_end_read = clock(); @@ -60,36 +60,75 @@ 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"); + test_trans(init, rls->rell); + printf("Doing up\n"); + test_trans(init, rls->relu); + printf("Doing right\n"); + test_trans(init, rls->relr); + printf("Doing down\n"); + test_trans(init, rls->reld); + */ BDD old = sylvan_false; BDD new = init->bdd; int iteration = 0; - while(new != old){ - ERRPRINT("Iteration %d\n", iteration++); - old = new; - new = sylvan_or(new, sylvan_relnext(new, rls->rell->bdd, rls->rell->varset.varset)); - new = sylvan_or(new, sylvan_relnext(new, rls->relu->bdd, rls->relu->varset.varset)); - new = sylvan_or(new, sylvan_relnext(new, rls->relr->bdd, rls->relr->varset.varset)); - new = sylvan_or(new, sylvan_relnext(new, rls->reld->bdd, rls->reld->varset.varset)); - } - //sylvan_printdot_nc(old); - //switch(strat){ - // case COORD: - // DPRINT("Encoding coordinate based\n"); - // break; - // case OBJECT: - // DPRINT("Encoding object based\n"); - // solve_object(screen); - // break; - // case HYBRID: - // DPRINT("Encoding hybrid based\n"); - // DPRINT("Not implemented yet...\n"); - // break; - // default: - // ERRPRINT("Huh?"); - // exit(2); - //} + 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; + } + } + } + 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(); //SOLVE???