13 #define ERRPRINT(fmt, as...) fprintf(stderr, fmt, ## as);
14 #define DPRINT(fmt, as...) if(DEBUG) ERRPRINT(fmt, ## as);
16 typedef enum {OBJECT
, COORD
, HYBRID
} strategy
;
20 strategy strat
= HYBRID
;
25 "\t%s [opts] [FILE [FILE [...]]]\n"
28 "\tAll strategies are mutually exclusive\n"
29 "\t-c coordinate based strategy\n"
30 "\t-o object based strategy\n"
31 "\t-y hybrid strategy\n"
32 // "\t-l LURD lURD verification strategy\n"
33 // "\t-r show all positions that are a valid solution\n"
35 "\t-d enable verbose debug output\n"
36 "\t-h show this help\n"
38 "Positional arguments:\n"
39 "\tFILE zero or more sokoban screens\n"
40 "\t when no file is specified stdin will be used\n", prg
);
43 int lurd_solve(FILE *inputstream
, char *lurd
){
45 sokoban_screen
*screen
= parse_screen(inputstream
, false);
46 if (screen
== NULL
) printf("Something went wrong...\n");
48 lace_init(0, 1000000);
49 lace_startup(0, NULL
, NULL
);
51 sylvan_init_package(1LL<<21, 1LL<<27, 1LL<<20, 1LL<<26);
54 state
*init
= encode_screen(screen
);
55 state
*goal
= encode_goal(screen
);
56 if (goal
== NULL
) printf("WRONG\n");
57 rels
*rls
= encode_rel(screen
);
61 while (*lurd
!= '\n'){
62 printf("We're here1\n");
65 printf("We're here2\n");
68 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
76 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
84 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
92 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
104 check
= sylvan_satcount(sylvan_and(goal
->bdd
, new), init
->vars
.varset
);
106 if (check
> 0) return 1;
110 void solve(FILE *inputstream
)
112 clock_t time_start_read
, time_end_read
;
113 clock_t time_start_encode
, time_end_encode
;
115 time_start_read
= clock();
116 sokoban_screen
*screen
= parse_screen(inputstream
, false);
117 if (screen
== NULL
) printf("Something went wrong...\n");
118 //sokoban_print(screen);
119 time_end_read
= clock();
121 time_start_encode
= clock();
123 lace_init(0, 1000000);
124 lace_startup(0, NULL
, NULL
);
126 sylvan_init_package(1LL<<21, 1LL<<27, 1LL<<20, 1LL<<26);
129 state
*init
= encode_screen(screen
);
130 state
*goal
= encode_goal(screen
);
131 rels
*rls
= encode_rel(screen
);
133 printf("Doing left\n");
134 test_trans(init, rls->rell);
135 printf("Doing up\n");
136 test_trans(init, rls->relu);
137 printf("Doing right\n");
138 test_trans(init, rls->relr);
139 printf("Doing down\n");
140 test_trans(init, rls->reld);
143 BDD old
= sylvan_false
;
149 ERRPRINT("Iteration %d\n", iteration
++);
150 trans_t
*t
= rls
->rell
;
154 BDDSET testvars = sylvan_set_fromarray(((BDDVAR[]){0,2,4,6,8,10,12,14,16}), 9);
155 BDD teststate = sylvan_cube(testvars, (uint8_t[]){1,0,1,0,0,1,0,1,0});
156 BDD teststate1 = sylvan_or(teststate, sylvan_cube(testvars, (uint8_t[]){0,0,1,1,0,1,0,1,0}));
157 BDD teststate2 = sylvan_or(teststate1, sylvan_cube(testvars, (uint8_t[]){0,1,0,0,0,1,1,0,1}));
158 if (new == teststate2) printf("Wrong!\n");
161 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
163 //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset));
168 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
170 //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset));
176 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
178 //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset));
184 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
186 //ERRPRINT("Satcount: %f\n", sylvan_satcount(new, init->vars.varset));
188 double check
= sylvan_satcount(sylvan_and(goal
->bdd
, new), init
->vars
.varset
);
190 printf("Solution is found after %d iteration(s)!\n", iteration
);
195 else printf("No solution found!\n");
196 //ERRPRINT("Satcount: %f\n", sylvan_satcount(old, init->vars.varset));
197 // sylvan_enum(old, init->vars.varset, (enum_cb)callback, NULL);
198 // sylvan_printdot_nc(old);
199 time_end_encode
= clock();
203 sokoban_free(screen
);
204 ERRPRINT("Reading: %fs\n",
205 ((double) (time_end_read
-time_start_read
))/CLOCKS_PER_SEC
);
206 ERRPRINT("Encoding: %fs\n",
207 ((double) (time_end_encode
-time_start_encode
))/CLOCKS_PER_SEC
);
210 int main(int argc
, char **argv
)
214 while((optchar
= getopt(argc
, argv
, "cdhoy")) != -1){
218 DPRINT("Strategy changed to Coordinate based\n");
222 DPRINT("Debug enabled\n");
229 DPRINT("Strategy changed to Object based\n");
233 DPRINT("Strategy changed to Hybrid\n");
237 ERRPRINT("Unknown option `-%c'.\n", optopt
);
239 ERRPRINT("Unknown option char `-\\x%x'.\n", optopt
);
248 ERRPRINT("You have not specified a file, reading from stdin\n");
251 if (lurd_solve(stdin
, lrd
) == 1) printf ("The given lurd solves the given screen\n");
252 else printf ("The given lurd can not solve the given screen\n");
255 for(int filepathindex
= optind
; filepathindex
< argc
; filepathindex
++){
256 char *currentfilepath
= argv
[filepathindex
];
257 ERRPRINT("Processing: %s\n", currentfilepath
);
258 FILE *currentfile
= fopen(currentfilepath
, "r");
259 DPRINT("Opening file\n");
261 DPRINT("Closing file\n");