b96eef0f3efac5984bbeaea2bce04279f5513528
10 #include <gperftools/profiler.h>
47 xy_bddvar_map
*getxy(int x
, int y
, xy_bddvar_map
*map
)
49 xy_bddvar_map k
, *r
= NULL
;
50 memset(&k
, 0, sizeof(xy_bddvar_map
));
53 HASH_FIND(hh
, map
, &k
.key
, sizeof(xy
), r
);
57 bddvar_xy_map
*getbdd(int key
, bddvar_xy_map
*map
)
59 bddvar_xy_map k
, *r
= NULL
;
60 memset(&k
, 0, sizeof(bddvar_xy_map
));
62 HASH_FIND(hh
, map
, &k
.key
, sizeof(int), r
);
67 bimap
*create_bimap_helper(sokoban_screen
*screen
)
71 xy_bddvar_map
*xybdd
= NULL
;
72 bddvar_xy_map
*bddxy
= NULL
;
73 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
74 xy_bddvar_map
*f
= NULL
;
75 f
= (xy_bddvar_map
*)malloc(sizeof(xy_bddvar_map
));
76 memset(f
, 0, sizeof(xy_bddvar_map
));
77 f
->key
.x
= r
->coord
.x
;
78 f
->key
.y
= r
->coord
.y
;
79 f
->value
.var
[0] = varcount
;
80 f
->value
.var
[1] = varcount
+ 1;
81 f
->value
.var
[2] = varcount
+ 2;
82 HASH_ADD(hh
, xybdd
, key
, sizeof(xy
), f
);
84 for (int i
= 0; i
<3; i
++){
85 bddvar_xy_map
*t
= NULL
;
86 t
= (bddvar_xy_map
*)malloc(sizeof(bddvar_xy_map
));
87 memset(t
, 0, sizeof(bddvar_xy_map
));
88 t
->key
= varcount
+ i
;
89 t
->value
.x
= r
->coord
.x
;
90 t
->value
.y
= r
->coord
.y
;
91 HASH_ADD(hh
, bddxy
, key
, sizeof(int), t
);
93 varcount
= varcount
+ 3;
96 bm
= (bimap
*)malloc(sizeof(bimap
));
102 int check_xy_exists(int x
, int y
, bimap
*bm
)
105 if (getxy(x
, y
, bm
->f
) != NULL
) res
= 1;
109 int check_space(int x
, int y
, direction d
, int delta
, bimap
*bm
)
112 case LEFT
: x
= x
- delta
; break;
113 case UP
: y
= y
- delta
; break;
114 case RIGHT
: x
= x
+ delta
; break;
115 case DOWN
: y
= y
+ delta
; break;
117 return check_xy_exists(x
, y
, bm
);
121 * Each coordinate has three related boolean variables. The combination of those boolean variables
129 * 110: Agent on target
130 * In the BDD representation, the state is represented by n * 3 variables, where n is the number of
131 * tiles in the shrinked screen.
132 * It seems that the move variable is not necessary since non-deterministic moves can be emvedded
133 * directly in transition relations.
136 state
*encode_screen(sokoban_screen
*screen
)
140 BDDVAR vars
[HASH_COUNT(screen
) * 3];
141 for (uint8_t i
= 0; i
< HASH_COUNT(screen
) * 3; i
++){
145 uint8_t st_enc
[HASH_COUNT(screen
) * 3];
147 BDDSET varset
= sylvan_set_fromarray(vars
, HASH_COUNT(screen
) * 3);
149 state
*fullState
= NULL
;
150 fullState
= (state
*)malloc(sizeof(state
));
151 fullState
->vars
.varset
= varset
;
152 fullState
->vars
.size
= HASH_COUNT(screen
) * 3;
155 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
158 st_enc
[tile_index
] = 0;
160 st_enc
[tile_index
] = 0;
162 st_enc
[tile_index
] = 1;
166 st_enc
[tile_index
] = 0;
168 st_enc
[tile_index
] = 0;
170 st_enc
[tile_index
] = 0;
174 st_enc
[tile_index
] = 0;
176 st_enc
[tile_index
] = 1;
178 st_enc
[tile_index
] = 0;
182 st_enc
[tile_index
] = 0;
184 st_enc
[tile_index
] = 1;
186 st_enc
[tile_index
] = 1;
190 st_enc
[tile_index
] = 1;
192 st_enc
[tile_index
] = 0;
194 st_enc
[tile_index
] = 1;
197 case TARGAGENT
: //110
198 st_enc
[tile_index
] = 1;
200 st_enc
[tile_index
] = 1;
202 st_enc
[tile_index
] = 0;
206 st_enc
[tile_index
] = 1;
208 st_enc
[tile_index
] = 0;
210 st_enc
[tile_index
] = 0;
215 s
= sylvan_cube(varset
, st_enc
);
217 printf("Initial state encoded\n");
221 BDD
create_single_rel(sokoban_screen
*screen
, direction dir
)
224 BDD t
= sylvan_false
;
225 bimap
*bm
= create_bimap_helper(screen
);
228 bddvar_xy_map
*bddxy
= NULL
;
260 for (unsigned int i
= 0; i
< HASH_COUNT(screen
); i
++){
261 bddxy
= getbdd(i
*3, bm
->t
);
264 if (check_space(x
, y
, dir
, 1, bm
) == 0){
265 sokoban_screen
*tmp_scr
= get_coord(x
, y
, screen
);
266 if (tmp_scr
->tile
== AGENT
){
267 //1 1 0 0 1 1 (1 0 1 -> 1 0 1)
268 BDDVAR relvars
[6] = {i
* 3, i
* 3 + 1, i
* 3 + 2, i
* 3 + 3, i
* 3 + 4, i
* 3 + 5};
269 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 6);
270 uint8_t rel_enc
[6] = {1, 1, 0, 0, 1, 1};
271 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
273 if (tmp_scr
->tile
== TARGAGENT
){
274 //1 1 1 1 0 0 (1 1 0 -> 1 1 0)
275 BDDVAR relvars
[6] = {i
* 3, i
* 3 + 1, i
* 3 + 2, i
* 3 + 3, i
* 3 + 4, i
* 3 + 5};
276 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 6);
277 uint8_t rel_enc
[6] = {1, 1, 1, 1, 0, 0};
278 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
281 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 0){
282 sokoban_screen
*tmp_scr
= get_coord(x
, y
, screen
);
283 sokoban_screen
*tmp_scr_d
= get_coord(x
+ xdelta
, y
+ ydelta
, screen
);
284 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
285 int deltai
= bddvar
->value
.var
[0];
286 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== FREE
){
287 //(0 1 0 0 1 1 1 0 0 0 1 1)
288 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
289 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
290 uint8_t rel_enc
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
291 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
293 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== TARGET
){
294 //(0 1 1 0 1 1 1 0 0 1 1 1)
295 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
296 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
297 uint8_t rel_enc
[12] = {0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1};
298 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
300 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== FREE
){
301 //(0 1 0 1 1 0 1 0 1 0 0 1)
302 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
303 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
304 uint8_t rel_enc
[12] = {0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1};
305 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
307 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== TARGET
){
308 //(0 1 1 1 1 0 1 0 1 1 0 1)
309 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
310 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
311 uint8_t rel_enc
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1};
312 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
314 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== BOX
){
315 //(0 0 1 1 0 0 1 1 0 0 1 1)
316 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
317 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
318 uint8_t rel_enc
[12] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
319 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
321 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== TARGBOX
){
322 //(1 1 0 0 0 0 1 1 0 0 1 1)
323 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
324 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
325 uint8_t rel_enc
[12] = {1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1};
326 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
328 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== BOX
){
329 //(0 0 1 1 0 0 1 1 1 1 0 0)
330 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
331 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
332 uint8_t rel_enc
[12] = {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
333 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
335 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== TARGBOX
){
336 //(1 1 0 0 0 0 1 1 1 1 0 0)
337 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
338 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
339 uint8_t rel_enc
[12] = {1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
340 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
343 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 1){
344 sokoban_screen
*tmp_scr
= get_coord(x
, y
, screen
);
345 sokoban_screen
*tmp_scr_d
= get_coord(x
+ xdelta
, y
+ ydelta
, screen
);
346 sokoban_screen
*tmp_scr_g
= get_coord(x
+ xgamma
, y
+ ygamma
, screen
);
347 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
348 int deltai
= bddvar
->value
.var
[0];
349 bddvar
= getxy(x
+ xgamma
, y
+ ygamma
, bm
->f
);
350 int gammai
= bddvar
->value
.var
[0];
351 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== FREE
){
352 //(0 1 0 0 1 1 1 0 0 0 1 1)
353 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
354 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
355 uint8_t rel_enc
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
356 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
358 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== TARGET
){
359 //(0 1 1 0 1 1 1 0 0 1 1 1)
360 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
361 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
362 uint8_t rel_enc
[12] = {0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1};
363 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
365 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== FREE
){
366 //(0 1 0 1 1 0 1 0 1 0 0 1)
367 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
368 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
369 uint8_t rel_enc
[12] = {0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1};
370 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
372 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== TARGET
){
373 //(0 1 1 1 1 0 1 0 1 1 0 1)
374 BDDVAR relvars
[12] = {deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
375 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
376 uint8_t rel_enc
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1};
377 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
379 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
-> tile
== BOX
&& tmp_scr_g
->tile
== BOX
){
380 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
381 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
382 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
383 uint8_t rel_enc
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
384 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
386 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
-> tile
== BOX
&& tmp_scr_g
->tile
== TARGBOX
){
387 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
388 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
389 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
390 uint8_t rel_enc
[18] = {1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
391 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
393 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
-> tile
== BOX
&& tmp_scr_g
->tile
== BOX
){
394 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
395 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
396 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
397 uint8_t rel_enc
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
398 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
400 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
-> tile
== BOX
&& tmp_scr_g
->tile
== TARGBOX
){
401 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
402 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
403 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
404 uint8_t rel_enc
[18] = {1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
405 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
407 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== BOX
&& tmp_scr_g
->tile
== FREE
){
408 //free box agent -> box agent free
409 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
410 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
411 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
412 uint8_t rel_enc
[18] = {0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1};
413 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
415 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== TARGBOX
&& tmp_scr_g
->tile
== FREE
){
416 //(free targbox agent -> box targagent free)
417 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
418 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
419 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
420 uint8_t rel_enc
[18] = {0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1};
421 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
423 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== BOX
&& tmp_scr_g
->tile
== TARGET
){
424 //(target box agent -> targbox agent free)
425 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
426 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
427 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
428 uint8_t rel_enc
[18] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1};
429 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
431 if (tmp_scr
->tile
== AGENT
&& tmp_scr_d
->tile
== TARGBOX
&& tmp_scr_g
->tile
== TARGET
){
432 //(target targbox agent -> targbox targagent free)
433 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
434 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
435 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
436 uint8_t rel_enc
[18] = {0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1};
437 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
439 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== BOX
&& tmp_scr_g
->tile
== FREE
){
440 //(free box targagent -> box agent target)
441 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
442 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
443 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
444 uint8_t rel_enc
[18] = {0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1};
445 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
447 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== TARGBOX
&& tmp_scr_g
->tile
== FREE
){
448 //(free targbox targagent -> box targagent target)
449 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
450 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
451 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
452 uint8_t rel_enc
[18] = {0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1};
453 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
455 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== BOX
&& tmp_scr_g
->tile
== TARGET
){
456 //(target box targagent -> targbox agent target)
457 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
458 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
459 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
460 uint8_t rel_enc
[18] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1};
461 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
463 if (tmp_scr
->tile
== TARGAGENT
&& tmp_scr_d
->tile
== TARGBOX
&& tmp_scr_g
->tile
== TARGET
){
464 //(target targbox targagent -> targbox targagent target)
465 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
466 BDDVAR relvars
[18] = {gammai
*3, gammai
*3+1, gammai
*3+2, gammai
*3+3, gammai
*3+4, gammai
*3+5, deltai
*3, deltai
*3+1, deltai
*3+2, deltai
*3+3, deltai
*3+4, deltai
*3+5, i
*3, i
*3+1, i
*3+2, i
*3+3, i
*3+4, i
*3+5};
467 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 18);
468 uint8_t rel_enc
[18] = {0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1};
469 t
= sylvan_union_cube(t
, relvarset
, rel_enc
);
476 rels
*encode_rel(sokoban_screen
*screen
)
480 BDD tl
= sylvan_false
;
483 tl
= create_single_rel(screen
, LEFT
);
486 BDD tu
= create_single_rel(screen
, UP
);
489 BDD tr
= create_single_rel(screen
, RIGHT
);
492 BDD td
= create_single_rel(screen
, DOWN
);
495 rls
= (rels
*)malloc(sizeof(rels
));