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 trans_t
*create_single_rel(sokoban_screen
*screen
, direction dir
)
224 trans_t
*trs
, *trs_current
;
225 bimap
*bm
= create_bimap_helper(screen
);
228 bddvar_xy_map
*bddxy
= NULL
;
261 for (unsigned int i
= 0; i
< HASH_COUNT(screen
); i
++){
262 bddxy
= getbdd(i
*3, bm
->t
);
265 if (check_space(x
, y
, dir
, 1, bm
) == 0){
268 //1 1 0 0 1 1 (1 0 1 -> 1 0 1)
269 BDDVAR relvars
[6] = {i
* 3, i
* 3 + 1, i
* 3 + 2, i
* 3 + 3, i
* 3 + 4, i
* 3 + 5};
270 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 6);
271 uint8_t rel_enc
[6] = {1, 1, 0, 0, 1, 1};
273 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
274 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
275 trs_current
->varset
.varset
= relvarset
;
276 trs_current
->varset
.size
= 6;
277 trs_current
->next_rel
= trs
;
280 //Targagent -> Targagent
281 //1 1 1 1 0 0 (1 1 0 -> 1 1 0)
283 relvars
[1] = i
* 3 + 1;
284 relvars
[2] = i
* 3 + 2;
285 relvars
[3] = i
* 3 + 3;
286 relvars
[4] = i
* 3 + 4;
287 relvars
[5] = i
* 3 + 5;
288 relvarset
= sylvan_set_fromarray(relvars
, 6);
296 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
297 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
298 trs_current
->varset
.varset
= relvarset
;
299 trs_current
->varset
.size
= 6;
300 trs_current
->next_rel
= trs
;
304 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 0){
306 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
307 int deltai
= bddvar
->value
.var
[0];
309 //Free Agent -> Agent Free
310 //(0 1 0 0 1 1 1 0 0 0 1 1)
311 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};
312 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
313 uint8_t rel_enc
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
314 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
315 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
316 trs_current
->varset
.varset
= relvarset
;
317 trs_current
->varset
.size
= 12;
318 trs_current
->next_rel
= trs
;
321 //Target Agent -> Targagent Free
322 //(0 1 1 1 1 0 1 0 0 0 1 1)
323 relvars
[0] = deltai
*3;
324 relvars
[1] = deltai
*3+1;
325 relvars
[2] = deltai
*3+2;
326 relvars
[3] = deltai
*3+3;
327 relvars
[4] = deltai
*3+4;
328 relvars
[5] = deltai
*3+5;
335 relvarset
= sylvan_set_fromarray(relvars
, 12);
348 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
349 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
350 trs_current
->varset
.varset
= relvarset
;
351 trs_current
->varset
.size
= 12;
352 trs_current
->next_rel
= trs
;
355 //Must be: Free Targagent -> Agent Target
356 //(0 1 0 0 1 1 1 0 1 1 0 1)
357 relvars
[0] = deltai
*3;
358 relvars
[1] = deltai
*3+1;
359 relvars
[2] = deltai
*3+2;
360 relvars
[3] = deltai
*3+3;
361 relvars
[4] = deltai
*3+4;
362 relvars
[5] = deltai
*3+5;
369 relvarset
= sylvan_set_fromarray(relvars
, 12);
382 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
383 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
384 trs_current
->varset
.varset
= relvarset
;
385 trs_current
->varset
.size
= 12;
386 trs_current
->next_rel
= trs
;
389 //Target Targagent -> Targagent Target
390 //(0 1 1 1 1 0 1 0 1 1 0 1)
391 relvars
[0] = deltai
*3;
392 relvars
[1] = deltai
*3+1;
393 relvars
[2] = deltai
*3+2;
394 relvars
[3] = deltai
*3+3;
395 relvars
[4] = deltai
*3+4;
396 relvars
[5] = deltai
*3+5;
403 relvarset
= sylvan_set_fromarray(relvars
, 12);
416 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
417 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
418 trs_current
->varset
.varset
= relvarset
;
419 trs_current
->varset
.size
= 12;
420 trs_current
->next_rel
= trs
;
423 //Box Agent -> Box Agent
424 //(0 0 1 1 0 0 1 1 0 0 1 1)
425 relvars
[0] = deltai
*3;
426 relvars
[1] = deltai
*3+1;
427 relvars
[2] = deltai
*3+2;
428 relvars
[3] = deltai
*3+3;
429 relvars
[4] = deltai
*3+4;
430 relvars
[5] = deltai
*3+5;
437 relvarset
= sylvan_set_fromarray(relvars
, 12);
450 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
451 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
452 trs_current
->varset
.varset
= relvarset
;
453 trs_current
->varset
.size
= 12;
454 trs_current
->next_rel
= trs
;
457 //Targbox Agent -> Targbox Agent
458 //(1 1 0 0 0 0 1 1 0 0 1 1)
459 relvars
[0] = deltai
*3;
460 relvars
[1] = deltai
*3+1;
461 relvars
[2] = deltai
*3+2;
462 relvars
[3] = deltai
*3+3;
463 relvars
[4] = deltai
*3+4;
464 relvars
[5] = deltai
*3+5;
471 relvarset
= sylvan_set_fromarray(relvars
, 12);
484 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
485 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
486 trs_current
->varset
.varset
= relvarset
;
487 trs_current
->varset
.size
= 12;
488 trs_current
->next_rel
= trs
;
491 //Box Targagent -> Box Targagent
492 //(0 0 1 1 0 0 1 1 1 1 0 0)
493 relvars
[0] = deltai
*3;
494 relvars
[1] = deltai
*3+1;
495 relvars
[2] = deltai
*3+2;
496 relvars
[3] = deltai
*3+3;
497 relvars
[4] = deltai
*3+4;
498 relvars
[5] = deltai
*3+5;
505 relvarset
= sylvan_set_fromarray(relvars
, 12);
518 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
519 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
520 trs_current
->varset
.varset
= relvarset
;
521 trs_current
->varset
.size
= 12;
522 trs_current
->next_rel
= trs
;
525 //Targbox Targagent -> Targbox Targagent
526 //(1 1 0 0 0 0 1 1 1 1 0 0)
527 relvars
[0] = deltai
*3;
528 relvars
[1] = deltai
*3+1;
529 relvars
[2] = deltai
*3+2;
530 relvars
[3] = deltai
*3+3;
531 relvars
[4] = deltai
*3+4;
532 relvars
[5] = deltai
*3+5;
539 relvarset
= sylvan_set_fromarray(relvars
, 12);
552 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
553 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
554 trs_current
->varset
.varset
= relvarset
;
555 trs_current
->varset
.size
= 12;
556 trs_current
->next_rel
= trs
;
560 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 1){
562 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
563 int deltai
= bddvar
->value
.var
[0];
564 bddvar
= getxy(x
+ xgamma
, y
+ ygamma
, bm
->f
);
565 int gammai
= bddvar
->value
.var
[0];
567 //Free Agent -> 1 0 1 0 0 1 Agent Free
568 //(0 1 0 0 1 1 1 0 0 0 1 1)
569 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};
570 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
571 uint8_t rel_enc
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
572 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
573 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
574 trs_current
->varset
.varset
= relvarset
;
575 trs_current
->varset
.size
= 12;
576 trs_current
->next_rel
= trs
;
579 //Target Agent -> Targagent Free
580 //(0 1 1 1 1 0 1 0 0 0 1 1)
581 relvars
[0] = deltai
*3;
582 relvars
[1] = deltai
*3+1;
583 relvars
[2] = deltai
*3+2;
584 relvars
[3] = deltai
*3+3;
585 relvars
[4] = deltai
*3+4;
586 relvars
[5] = deltai
*3+5;
593 relvarset
= sylvan_set_fromarray(relvars
, 12);
606 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
607 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
608 trs_current
->varset
.varset
= relvarset
;
609 trs_current
->varset
.size
= 12;
610 trs_current
->next_rel
= trs
;
613 //Free Targagent -> Agent Target
614 //(0 1 0 0 1 1 1 0 1 1 0 1)
615 relvars
[0] = deltai
*3;
616 relvars
[1] = deltai
*3+1;
617 relvars
[2] = deltai
*3+2;
618 relvars
[3] = deltai
*3+3;
619 relvars
[4] = deltai
*3+4;
620 relvars
[5] = deltai
*3+5;
627 relvarset
= sylvan_set_fromarray(relvars
, 12);
640 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
641 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
642 trs_current
->varset
.varset
= relvarset
;
643 trs_current
->varset
.size
= 12;
644 trs_current
->next_rel
= trs
;
647 //Target Targagent -> Targagent Target
648 //(0 1 1 1 1 0 1 0 1 1 0 1)
649 relvars
[0] = deltai
*3;
650 relvars
[1] = deltai
*3+1;
651 relvars
[2] = deltai
*3+2;
652 relvars
[3] = deltai
*3+3;
653 relvars
[4] = deltai
*3+4;
654 relvars
[5] = deltai
*3+5;
661 relvarset
= sylvan_set_fromarray(relvars
, 12);
674 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
675 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
676 trs_current
->varset
.varset
= relvarset
;
677 trs_current
->varset
.size
= 12;
678 trs_current
->next_rel
= trs
;
681 //Box Box Agent -> Box Box Agent
682 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
683 BDDVAR relvars1
[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};
684 relvars1
[0] = gammai
*3;
685 relvars1
[1] = gammai
*3+1;
686 relvars1
[2] = gammai
*3+2;
687 relvars1
[3] = gammai
*3+3;
688 relvars1
[4] = gammai
*3+4;
689 relvars1
[5] = gammai
*3+5;
690 relvars1
[6] = deltai
*3;
691 relvars1
[7] = deltai
*3+1;
692 relvars1
[8] = deltai
*3+2;
693 relvars1
[9] = deltai
*3+3;
694 relvars1
[10] = deltai
*3+4;
695 relvars1
[11] = deltai
*3+5;
697 relvars1
[13] = i
*3+1;
698 relvars1
[14] = i
*3+2;
699 relvars1
[15] = i
*3+3;
700 relvars1
[16] = i
*3+4;
701 relvars1
[17] = i
*3+5;
702 BDD relvarset1
= sylvan_set_fromarray(relvars1
, 18);
703 uint8_t rel_enc1
[18];
704 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
723 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
724 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
725 trs_current
->varset
.varset
= relvarset1
;
726 trs_current
->varset
.size
= 18;
727 trs_current
->next_rel
= trs
;
730 //Targbox Box Agent -> Targbox Box Agent
731 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
732 relvars1
[0] = gammai
*3;
733 relvars1
[1] = gammai
*3+1;
734 relvars1
[2] = gammai
*3+2;
735 relvars1
[3] = gammai
*3+3;
736 relvars1
[4] = gammai
*3+4;
737 relvars1
[5] = gammai
*3+5;
738 relvars1
[6] = deltai
*3;
739 relvars1
[7] = deltai
*3+1;
740 relvars1
[8] = deltai
*3+2;
741 relvars1
[9] = deltai
*3+3;
742 relvars1
[10] = deltai
*3+4;
743 relvars1
[11] = deltai
*3+5;
745 relvars1
[13] = i
*3+1;
746 relvars1
[14] = i
*3+2;
747 relvars1
[15] = i
*3+3;
748 relvars1
[16] = i
*3+4;
749 relvars1
[17] = i
*3+5;
750 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
751 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1)
770 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
771 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
772 trs_current
->varset
.varset
= relvarset1
;
773 trs_current
->varset
.size
= 18;
774 trs_current
->next_rel
= trs
;
777 //Box Box Targagent -> Box Box Targagent
778 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
779 relvars1
[0] = gammai
*3;
780 relvars1
[1] = gammai
*3+1;
781 relvars1
[2] = gammai
*3+2;
782 relvars1
[3] = gammai
*3+3;
783 relvars1
[4] = gammai
*3+4;
784 relvars1
[5] = gammai
*3+5;
785 relvars1
[6] = deltai
*3;
786 relvars1
[7] = deltai
*3+1;
787 relvars1
[8] = deltai
*3+2;
788 relvars1
[9] = deltai
*3+3;
789 relvars1
[10] = deltai
*3+4;
790 relvars1
[11] = deltai
*3+5;
792 relvars1
[13] = i
*3+1;
793 relvars1
[14] = i
*3+2;
794 relvars1
[15] = i
*3+3;
795 relvars1
[16] = i
*3+4;
796 relvars1
[17] = i
*3+5;
797 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
798 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
817 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
818 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
819 trs_current
->varset
.varset
= relvarset1
;
820 trs_current
->varset
.size
= 18;
821 trs_current
->next_rel
= trs
;
824 //Targbox Box Targagent -> Targbox Box Targagent
825 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
826 relvars1
[0] = gammai
*3;
827 relvars1
[1] = gammai
*3+1;
828 relvars1
[2] = gammai
*3+2;
829 relvars1
[3] = gammai
*3+3;
830 relvars1
[4] = gammai
*3+4;
831 relvars1
[5] = gammai
*3+5;
832 relvars1
[6] = deltai
*3;
833 relvars1
[7] = deltai
*3+1;
834 relvars1
[8] = deltai
*3+2;
835 relvars1
[9] = deltai
*3+3;
836 relvars1
[10] = deltai
*3+4;
837 relvars1
[11] = deltai
*3+5;
839 relvars1
[13] = i
*3+1;
840 relvars1
[14] = i
*3+2;
841 relvars1
[15] = i
*3+3;
842 relvars1
[16] = i
*3+4;
843 relvars1
[17] = i
*3+5;
844 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
845 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
864 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
865 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
866 trs_current
->varset
.varset
= relvarset1
;
867 trs_current
->varset
.size
= 18;
868 trs_current
->next_rel
= trs
;
871 //Free Box Agent -> Box Agent Free
872 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
873 relvars1
[0] = gammai
*3;
874 relvars1
[1] = gammai
*3+1;
875 relvars1
[2] = gammai
*3+2;
876 relvars1
[3] = gammai
*3+3;
877 relvars1
[4] = gammai
*3+4;
878 relvars1
[5] = gammai
*3+5;
879 relvars1
[6] = deltai
*3;
880 relvars1
[7] = deltai
*3+1;
881 relvars1
[8] = deltai
*3+2;
882 relvars1
[9] = deltai
*3+3;
883 relvars1
[10] = deltai
*3+4;
884 relvars1
[11] = deltai
*3+5;
886 relvars1
[13] = i
*3+1;
887 relvars1
[14] = i
*3+2;
888 relvars1
[15] = i
*3+3;
889 relvars1
[16] = i
*3+4;
890 relvars1
[17] = i
*3+5;
891 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
892 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
911 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
912 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
913 trs_current
->varset
.varset
= relvarset1
;
914 trs_current
->varset
.size
= 18;
915 trs_current
->next_rel
= trs
;
918 //Free Targbox Agent -> Box Targagent Free
919 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
920 relvars1
[0] = gammai
*3;
921 relvars1
[1] = gammai
*3+1;
922 relvars1
[2] = gammai
*3+2;
923 relvars1
[3] = gammai
*3+3;
924 relvars1
[4] = gammai
*3+4;
925 relvars1
[5] = gammai
*3+5;
926 relvars1
[6] = deltai
*3;
927 relvars1
[7] = deltai
*3+1;
928 relvars1
[8] = deltai
*3+2;
929 relvars1
[9] = deltai
*3+3;
930 relvars1
[10] = deltai
*3+4;
931 relvars1
[11] = deltai
*3+5;
933 relvars1
[13] = i
*3+1;
934 relvars1
[14] = i
*3+2;
935 relvars1
[15] = i
*3+3;
936 relvars1
[16] = i
*3+4;
937 relvars1
[17] = i
*3+5;
938 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
939 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
958 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
959 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
960 trs_current
->varset
.varset
= relvarset1
;
961 trs_current
->varset
.size
= 18;
962 trs_current
->next_rel
= trs
;
965 //Target Box Agent -> Targbox Agent Free
966 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
967 relvars1
[0] = gammai
*3;
968 relvars1
[1] = gammai
*3+1;
969 relvars1
[2] = gammai
*3+2;
970 relvars1
[3] = gammai
*3+3;
971 relvars1
[4] = gammai
*3+4;
972 relvars1
[5] = gammai
*3+5;
973 relvars1
[6] = deltai
*3;
974 relvars1
[7] = deltai
*3+1;
975 relvars1
[8] = deltai
*3+2;
976 relvars1
[9] = deltai
*3+3;
977 relvars1
[10] = deltai
*3+4;
978 relvars1
[11] = deltai
*3+5;
980 relvars1
[13] = i
*3+1;
981 relvars1
[14] = i
*3+2;
982 relvars1
[15] = i
*3+3;
983 relvars1
[16] = i
*3+4;
984 relvars1
[17] = i
*3+5;
985 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
986 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
1005 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1006 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1007 trs_current
->varset
.varset
= relvarset1
;
1008 trs_current
->varset
.size
= 18;
1009 trs_current
->next_rel
= trs
;
1012 //Target Targbox Agent -> Targbox Targagent Free
1013 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
1014 relvars1
[0] = gammai
*3;
1015 relvars1
[1] = gammai
*3+1;
1016 relvars1
[2] = gammai
*3+2;
1017 relvars1
[3] = gammai
*3+3;
1018 relvars1
[4] = gammai
*3+4;
1019 relvars1
[5] = gammai
*3+5;
1020 relvars1
[6] = deltai
*3;
1021 relvars1
[7] = deltai
*3+1;
1022 relvars1
[8] = deltai
*3+2;
1023 relvars1
[9] = deltai
*3+3;
1024 relvars1
[10] = deltai
*3+4;
1025 relvars1
[11] = deltai
*3+5;
1027 relvars1
[13] = i
*3+1;
1028 relvars1
[14] = i
*3+2;
1029 relvars1
[15] = i
*3+3;
1030 relvars1
[16] = i
*3+4;
1031 relvars1
[17] = i
*3+5;
1032 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1033 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
1052 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1053 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1054 trs_current
->varset
.varset
= relvarset1
;
1055 trs_current
->varset
.size
= 18;
1056 trs_current
->next_rel
= trs
;
1059 //Free Box Targagent -> Box Agent Target
1060 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1061 relvars1
[0] = gammai
*3;
1062 relvars1
[1] = gammai
*3+1;
1063 relvars1
[2] = gammai
*3+2;
1064 relvars1
[3] = gammai
*3+3;
1065 relvars1
[4] = gammai
*3+4;
1066 relvars1
[5] = gammai
*3+5;
1067 relvars1
[6] = deltai
*3;
1068 relvars1
[7] = deltai
*3+1;
1069 relvars1
[8] = deltai
*3+2;
1070 relvars1
[9] = deltai
*3+3;
1071 relvars1
[10] = deltai
*3+4;
1072 relvars1
[11] = deltai
*3+5;
1074 relvars1
[13] = i
*3+1;
1075 relvars1
[14] = i
*3+2;
1076 relvars1
[15] = i
*3+3;
1077 relvars1
[16] = i
*3+4;
1078 relvars1
[17] = i
*3+5;
1079 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1080 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1099 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1100 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1101 trs_current
->varset
.varset
= relvarset1
;
1102 trs_current
->varset
.size
= 18;
1103 trs_current
->next_rel
= trs
;
1106 //Free Targbox Targagent -> Box Targagent Target
1107 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
1108 relvars1
[0] = gammai
*3;
1109 relvars1
[1] = gammai
*3+1;
1110 relvars1
[2] = gammai
*3+2;
1111 relvars1
[3] = gammai
*3+3;
1112 relvars1
[4] = gammai
*3+4;
1113 relvars1
[5] = gammai
*3+5;
1114 relvars1
[6] = deltai
*3;
1115 relvars1
[7] = deltai
*3+1;
1116 relvars1
[8] = deltai
*3+2;
1117 relvars1
[9] = deltai
*3+3;
1118 relvars1
[10] = deltai
*3+4;
1119 relvars1
[11] = deltai
*3+5;
1121 relvars1
[13] = i
*3+1;
1122 relvars1
[14] = i
*3+2;
1123 relvars1
[15] = i
*3+3;
1124 relvars1
[16] = i
*3+4;
1125 relvars1
[17] = i
*3+5;
1126 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1127 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
1146 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1147 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1148 trs_current
->varset
.varset
= relvarset1
;
1149 trs_current
->varset
.size
= 18;
1150 trs_current
->next_rel
= trs
;
1153 //Target Box Targagent -> Targbox Agent Target
1154 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1155 relvars1
[0] = gammai
*3;
1156 relvars1
[1] = gammai
*3+1;
1157 relvars1
[2] = gammai
*3+2;
1158 relvars1
[3] = gammai
*3+3;
1159 relvars1
[4] = gammai
*3+4;
1160 relvars1
[5] = gammai
*3+5;
1161 relvars1
[6] = deltai
*3;
1162 relvars1
[7] = deltai
*3+1;
1163 relvars1
[8] = deltai
*3+2;
1164 relvars1
[9] = deltai
*3+3;
1165 relvars1
[10] = deltai
*3+4;
1166 relvars1
[11] = deltai
*3+5;
1168 relvars1
[13] = i
*3+1;
1169 relvars1
[14] = i
*3+2;
1170 relvars1
[15] = i
*3+3;
1171 relvars1
[16] = i
*3+4;
1172 relvars1
[17] = i
*3+5;
1173 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1174 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1193 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1194 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1195 trs_current
->varset
.varset
= relvarset1
;
1196 trs_current
->varset
.size
= 18;
1197 trs_current
->next_rel
= trs
;
1200 //Target Targbox Targagent -> Targbox Targagent Target
1201 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
1202 relvars1
[0] = gammai
*3;
1203 relvars1
[1] = gammai
*3+1;
1204 relvars1
[2] = gammai
*3+2;
1205 relvars1
[3] = gammai
*3+3;
1206 relvars1
[4] = gammai
*3+4;
1207 relvars1
[5] = gammai
*3+5;
1208 relvars1
[6] = deltai
*3;
1209 relvars1
[7] = deltai
*3+1;
1210 relvars1
[8] = deltai
*3+2;
1211 relvars1
[9] = deltai
*3+3;
1212 relvars1
[10] = deltai
*3+4;
1213 relvars1
[11] = deltai
*3+5;
1215 relvars1
[13] = i
*3+1;
1216 relvars1
[14] = i
*3+2;
1217 relvars1
[15] = i
*3+3;
1218 relvars1
[16] = i
*3+4;
1219 relvars1
[17] = i
*3+5;
1220 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1221 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
1240 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1241 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1242 trs_current
->varset
.varset
= relvarset1
;
1243 trs_current
->varset
.size
= 18;
1244 trs_current
->next_rel
= trs
;
1252 rels
*encode_rel(sokoban_screen
*screen
)
1256 trans_t
*tl
= sylvan_false
;
1259 tl
= create_single_rel(screen
, LEFT
);
1262 trans_t
*tu
= create_single_rel(screen
, UP
);
1265 trans_t
*tr
= create_single_rel(screen
, RIGHT
);
1268 trans_t
*td
= create_single_rel(screen
, DOWN
);
1271 rls
= (rels
*)malloc(sizeof(rels
));
1285 BDDVAR vars
[] = {0,2,4};
1286 BDDVAR all_vars
[] = {0,1,2,3,4,5};
1287 BDDVAR all_vars2
[] = {0,1};
1288 //BDDVAR short_vars[] = {0,1};
1289 /*BDDVAR short_vars2[] = {2,3};
1290 BDDVAR short_vars3[] = {0,1,2,3};*/
1292 BDDSET vars_set
= sylvan_set_fromarray(vars
, 3);
1293 BDDSET all_vars_set
= sylvan_set_fromarray(all_vars
, 6);
1294 BDDSET all_vars_set2
= sylvan_set_fromarray(all_vars2
, 2);
1295 //BDDSET short_vars_set = sylvan_set_fromarray(short_vars, 2);
1296 /*BDDSET short_vars_set2 = sylvan_set_fromarray(short_vars2, 2);
1297 BDDSET short_vars_set3 = sylvan_set_fromarray(short_vars3, 4);*/
1299 BDD s
, t
, next
, prev
;
1302 // transition relation: 000 --> 111 and !000 --> 000
1304 t
= sylvan_union_cube(t
, all_vars_set2
, ((uint8_t[]){0,1}));
1305 //t = sylvan_union_cube(t, all_vars_set, ((uint8_t[]){1,0,2,0,2,0}));
1306 t
= sylvan_union_cube(t
, all_vars_set2
, ((uint8_t[]){1,0}));
1307 // t = sylvan_union_cube(t, all_vars_set, ((uint8_t[]){0,1}));
1309 s
= sylvan_cube(vars_set
, (uint8_t[]){0,0,0});
1310 zeroes
= sylvan_cube(vars_set
, (uint8_t[]){1,0,0});
1311 ones
= sylvan_cube(vars_set
, (uint8_t[]){0,0,0});
1313 next
= sylvan_relnext(s
, t
, all_vars_set
);
1314 prev
= sylvan_relprev(t
, next
, all_vars_set
);
1315 if (next
== zeroes
) printf("Pass 1\n");
1316 if (prev
== ones
) printf("Pass 2\n");