38 xy_bddvar_map
*getxy(int x
, int y
, xy_bddvar_map
*map
)
40 xy_bddvar_map k
, *r
= NULL
;
41 memset(&k
, 0, sizeof(xy_bddvar_map
));
44 HASH_FIND(hh
, map
, &k
.key
, sizeof(xy
), r
);
48 bddvar_xy_map
*getbdd(int key
, bddvar_xy_map
*map
)
50 bddvar_xy_map k
, *r
= NULL
;
51 memset(&k
, 0, sizeof(bddvar_xy_map
));
53 HASH_FIND(hh
, map
, &k
.key
, sizeof(int), r
);
58 bimap
*create_bimap_helper(sokoban_screen
*screen
)
62 xy_bddvar_map
*xybdd
= NULL
;
63 bddvar_xy_map
*bddxy
= NULL
;
64 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
65 xy_bddvar_map
*f
= NULL
;
66 f
= (xy_bddvar_map
*)malloc(sizeof(xy_bddvar_map
));
67 memset(f
, 0, sizeof(xy_bddvar_map
));
68 f
->key
.x
= r
->coord
.x
;
69 f
->key
.y
= r
->coord
.y
;
70 f
->value
.var
[0] = varcount
* 2;
71 f
->value
.var
[1] = (varcount
+ 1) * 2;
72 f
->value
.var
[2] = (varcount
+ 2) * 2;
73 HASH_ADD(hh
, xybdd
, key
, sizeof(xy
), f
);
75 for (int i
= 0; i
<3; i
++){
76 bddvar_xy_map
*t
= NULL
;
77 t
= (bddvar_xy_map
*)malloc(sizeof(bddvar_xy_map
));
78 memset(t
, 0, sizeof(bddvar_xy_map
));
79 t
->key
= (varcount
+ i
) * 2;
80 t
->value
.x
= r
->coord
.x
;
81 t
->value
.y
= r
->coord
.y
;
82 HASH_ADD(hh
, bddxy
, key
, sizeof(int), t
);
84 varcount
= varcount
+ 3;
87 bm
= (bimap
*)malloc(sizeof(bimap
));
93 int check_xy_exists(int x
, int y
, bimap
*bm
)
96 if (getxy(x
, y
, bm
->f
) != NULL
) res
= 1;
100 int check_space(int x
, int y
, direction d
, int delta
, bimap
*bm
)
103 case LEFT
: x
= x
- delta
; break;
104 case UP
: y
= y
- delta
; break;
105 case RIGHT
: x
= x
+ delta
; break;
106 case DOWN
: y
= y
+ delta
; break;
108 return check_xy_exists(x
, y
, bm
);
112 * Each coordinate has three related boolean variables. The combination of those boolean variables
120 * 110: Agent on target
121 * In the BDD representation, the state is represented by n * 3 variables, where n is the number of
122 * tiles in the shrinked screen.
123 * It seems that the move variable is not necessary since non-deterministic moves can be emvedded
124 * directly in transition relations.
127 state
*encode_screen(sokoban_screen
*screen
)
131 BDDVAR vars
[HASH_COUNT(screen
) * 3];
132 for (uint8_t i
= 0; i
< HASH_COUNT(screen
) * 3; i
++){
136 uint8_t st_enc
[HASH_COUNT(screen
) * 3];
138 BDDSET varset
= sylvan_set_fromarray(vars
, HASH_COUNT(screen
) * 3);
140 state
*fullState
= NULL
;
141 fullState
= (state
*)malloc(sizeof(state
));
142 fullState
->vars
.varset
= varset
;
143 fullState
->vars
.size
= HASH_COUNT(screen
) * 3;
146 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
149 st_enc
[tile_index
] = 0;
151 st_enc
[tile_index
] = 0;
153 st_enc
[tile_index
] = 1;
157 st_enc
[tile_index
] = 0;
159 st_enc
[tile_index
] = 0;
161 st_enc
[tile_index
] = 0;
165 st_enc
[tile_index
] = 0;
167 st_enc
[tile_index
] = 1;
169 st_enc
[tile_index
] = 0;
173 st_enc
[tile_index
] = 0;
175 st_enc
[tile_index
] = 1;
177 st_enc
[tile_index
] = 1;
181 st_enc
[tile_index
] = 1;
183 st_enc
[tile_index
] = 0;
186 st_enc
[tile_index
] = 1;
189 case TARGAGENT
: //110
190 st_enc
[tile_index
] = 1;
192 st_enc
[tile_index
] = 1;
194 st_enc
[tile_index
] = 0;
198 st_enc
[tile_index
] = 1;
200 st_enc
[tile_index
] = 0;
202 st_enc
[tile_index
] = 0;
207 s
= sylvan_cube(varset
, st_enc
);
209 printf("Initial state encoded\n");
213 lurd_t
*lappend(lurd_t
*l
, char c
){
214 lurd_t
*temp_lrd
= NULL
;
216 temp_lrd
= (lurd_t
*)malloc(sizeof(lurd_t
));
218 temp_lrd
->next
= NULL
;
223 while (temp_lrd
->next
!= NULL
){
224 temp_lrd
= temp_lrd
->next
;
226 temp_lrd
->next
= (lurd_t
*)malloc(sizeof(lurd_t
));
227 temp_lrd
->next
->c
= c
;
228 temp_lrd
->next
->next
= NULL
;
233 int check_goal(BDD s
, BDD g
, BDDSET vars
){
235 if(sylvan_satcount(sylvan_and(s
, g
), vars
) > 0) return 1;
239 int check_visited(BDD s
, BDD v
, BDDSET vars
){
241 if(sylvan_satcount(sylvan_and(s
, v
), vars
) > 0) return 1;
245 state_t
*explstate(state
*init
, rels
*rls
, state
*g
){
248 deque
*state_queue
= create();
250 state_t
*tmp_state
= NULL
;
251 BDD visited
= init
->bdd
;
253 tmp_state
->bdd
= init
->bdd
;
254 tmp_state
->vars
= init
->vars
;
255 tmp_state
->lrd
= lrd
;
256 state_queue
= enq(tmp_state
, state_queue
);
258 while (isEmpty(state_queue
) == 1){
259 tmp_state
= get_front(state_queue
);
260 state_queue
= deq(state_queue
);
264 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
267 if (check_visited(new, visited
, init
->vars
.varset
) == 0){
268 if (check_goal(new, g
->bdd
, init
->vars
.varset
) == 0){
269 lurd_t
*lrd
= tmp_state
->lrd
;
270 state_t
*new_state
= NULL
;
271 new_state
= (state_t
*)malloc(sizeof(state_t
));
272 new_state
->bdd
= new;
273 new_state
->vars
= init
->vars
;
274 lrd
= lappend(lrd
, 'l');
275 new_state
->lrd
= lrd
;
276 state_queue
= enq(new_state
, state_queue
);
277 visited
= sylvan_or(new, visited
);
280 lurd_t
*lrd
= tmp_state
->lrd
;
281 state_t
*new_state
= NULL
;
282 new_state
= (state_t
*)malloc(sizeof(state_t
));
283 new_state
->bdd
= new;
284 new_state
->vars
= init
->vars
;
285 lrd
= lappend(lrd
, 'l');
286 new_state
->lrd
= lrd
;
294 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
297 if (check_visited(new, visited
, init
->vars
.varset
) == 0){
298 if (check_goal(new, g
->bdd
, init
->vars
.varset
) == 0){
299 lurd_t
*lrd
= tmp_state
->lrd
;
300 state_t
*new_state
= NULL
;
301 new_state
= (state_t
*)malloc(sizeof(state_t
));
302 new_state
->bdd
= new;
303 new_state
->vars
= init
->vars
;
304 lrd
= lappend(lrd
, 'u');
305 new_state
->lrd
= lrd
;
306 state_queue
= enq(new_state
, state_queue
);
307 visited
= sylvan_or(new, visited
);
310 lurd_t
*lrd
= tmp_state
->lrd
;
311 state_t
*new_state
= NULL
;
312 new_state
= (state_t
*)malloc(sizeof(state_t
));
313 new_state
->bdd
= new;
314 new_state
->vars
= init
->vars
;
315 lrd
= lappend(lrd
, 'u');
316 new_state
->lrd
= lrd
;
324 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
327 if (check_visited(new, visited
, init
->vars
.varset
) == 0){
328 if (check_goal(new, g
->bdd
, init
->vars
.varset
) == 0){
329 lurd_t
*lrd
= tmp_state
->lrd
;
330 state_t
*new_state
= NULL
;
331 new_state
= (state_t
*)malloc(sizeof(state_t
));
332 new_state
->bdd
= new;
333 new_state
->vars
= init
->vars
;
334 lrd
= lappend(lrd
, 'r');
335 new_state
->lrd
= lrd
;
336 state_queue
= enq(new_state
, state_queue
);
337 visited
= sylvan_or(new, visited
);
340 lurd_t
*lrd
= tmp_state
->lrd
;
341 state_t
*new_state
= NULL
;
342 new_state
= (state_t
*)malloc(sizeof(state_t
));
343 new_state
->bdd
= new;
344 new_state
->vars
= init
->vars
;
345 lrd
= lappend(lrd
, 'r');
346 new_state
->lrd
= lrd
;
354 new = sylvan_or(new, sylvan_relnext(new, t
->bdd
, t
->varset
.varset
));
357 if (check_visited(new, visited
, init
->vars
.varset
) == 0){
358 if (check_goal(new, g
->bdd
, init
->vars
.varset
) == 0){
359 lurd_t
*lrd
= tmp_state
->lrd
;
360 state_t
*new_state
= NULL
;
361 new_state
= (state_t
*)malloc(sizeof(state_t
));
362 new_state
->bdd
= new;
363 new_state
->vars
= init
->vars
;
364 lrd
= lappend(lrd
, 'd');
365 new_state
->lrd
= lrd
;
366 state_queue
= enq(new_state
, state_queue
);
367 visited
= sylvan_or(new, visited
);
370 lurd_t
*lrd
= tmp_state
->lrd
;
371 state_t
*new_state
= NULL
;
372 new_state
= (state_t
*)malloc(sizeof(state_t
));
373 new_state
->bdd
= new;
374 new_state
->vars
= init
->vars
;
375 lrd
= lappend(lrd
, 'd');
376 new_state
->lrd
= lrd
;
386 state
*encode_goal(sokoban_screen
*screen
){
392 BDDVAR vars
[HASH_COUNT(screen
) * 3];
393 for (uint8_t i
= 0; i
< HASH_COUNT(screen
) * 3; i
++){
397 uint8_t st_enc
[HASH_COUNT(screen
) * 3];
399 BDDSET varset
= sylvan_set_fromarray(vars
, HASH_COUNT(screen
) * 3);
401 state
*fullState
= NULL
;
402 fullState
= (state
*)malloc(sizeof(state
));
403 fullState
->vars
.varset
= varset
;
404 fullState
->vars
.size
= HASH_COUNT(screen
) * 3;
407 for(r
=screen
; r
!= NULL
; r
= (sokoban_screen
*)(r
->hh
.next
)){
409 case FREE
: //001 -> any
410 st_enc
[tile_index
] = 2;
412 st_enc
[tile_index
] = 2;
414 st_enc
[tile_index
] = 2;
417 case WALL
: //000 -> stays the same
418 st_enc
[tile_index
] = 0;
420 st_enc
[tile_index
] = 0;
422 st_enc
[tile_index
] = 0;
425 case BOX
: //010 -> any
427 st_enc
[tile_index
] = 2;
429 st_enc
[tile_index
] = 2;
431 st_enc
[tile_index
] = 2;
434 case TARGET
: //011 -> targbox
436 st_enc
[tile_index
] = 1;
438 st_enc
[tile_index
] = 0;
440 st_enc
[tile_index
] = 0;
443 case AGENT
: //101 -> any
444 st_enc
[tile_index
] = 2;
446 st_enc
[tile_index
] = 2;
448 st_enc
[tile_index
] = 2;
451 case TARGAGENT
: //110 -> targbox
453 st_enc
[tile_index
] = 1;
455 st_enc
[tile_index
] = 0;
457 st_enc
[tile_index
] = 0;
460 case TARGBOX
: //100 -> stays the same
463 st_enc
[tile_index
] = 1;
465 st_enc
[tile_index
] = 0;
467 st_enc
[tile_index
] = 0;
472 s
= sylvan_cube(varset
, st_enc
);
474 printf("Goal state encoded\n");
475 if (targets
== 0 || (boxes
!= targets
)) return NULL
;
476 else return fullState
;
481 //int countTrans(trans_t *trs);
483 trans_t
*create_single_rel(sokoban_screen
*screen
, direction dir
)
486 trans_t
*trs
, *trs_current
;
487 bimap
*bm
= create_bimap_helper(screen
);
490 bddvar_xy_map
*bddxy
= NULL
;
523 for (unsigned int i
= 0; i
< HASH_COUNT(screen
); i
++){
524 bddxy
= getbdd(i
*6, bm
->t
);
527 if (check_space(x
, y
, dir
, 1, bm
) == 0){
529 //1 1 0 0 1 1 (1 0 1 -> 1 0 1)
530 BDDVAR relvars
[6] = {i
* 6, i
* 6 + 1, i
* 6 + 2, i
* 6 + 3, i
* 6 + 4, i
* 6 + 5};
531 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 6);
532 uint8_t rel_enc
[6] = {1, 1, 0, 0, 1, 1};
533 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
534 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
535 trs_current
->varset
.varset
= relvarset
;
536 trs_current
->varset
.size
= 6;
537 trs_current
->next_rel
= trs
;
540 //Targagent -> Targagent
541 //1 1 1 1 0 0 (1 1 0 -> 1 1 0)
542 relvarset
= sylvan_set_fromarray(relvars
, 6);
543 uint8_t rel_enc1
[6] = {1, 1, 1, 1, 0, 0};
544 memcpy(rel_enc
, rel_enc1
, 6*sizeof(uint8_t));
546 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
547 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
548 trs_current
->varset
.varset
= relvarset
;
549 trs_current
->varset
.size
= 6;
550 trs_current
->next_rel
= trs
;
555 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 0){
556 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
557 unsigned int deltai
= bddvar
->value
.var
[0];
558 //Agent Free -> Free Agent
559 //(1 0 0 0 1 1 0 1 0 0 1 1)
561 //(0 1 0 0 1 1 1 0 0 0 1 1)
562 BDDVAR relvars
[12] = {i
*6, i
*6+1, i
*6+2, i
*6+3, i
*6+4, i
*6+5, deltai
, deltai
+1, deltai
+2, deltai
+3, deltai
+4, deltai
+5};
563 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
566 uint8_t rel_enc0
[12] = {1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1};
567 memcpy(rel_enc
, rel_enc0
, 12*sizeof(uint8_t));
570 uint8_t rel_enc0
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
571 memcpy(rel_enc
, rel_enc0
, 12*sizeof(uint8_t));
573 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
574 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
575 trs_current
->varset
.varset
= relvarset
;
576 trs_current
->varset
.size
= 12;
577 trs_current
->next_rel
= trs
;
580 //Agent Target -> Free Targagent
581 //(1 0 0 0 1 1 0 1 1 1 1 0)
583 //(0 1 1 1 1 0 1 0 0 0 1 1)
584 relvarset
= sylvan_set_fromarray(relvars
, 12);
586 uint8_t rel_enc2
[12] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0};
587 memcpy(rel_enc
, rel_enc2
, 12*sizeof(uint8_t));
590 uint8_t rel_enc2
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1};
591 memcpy(rel_enc
, rel_enc2
, 12*sizeof(uint8_t));
593 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
594 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
595 trs_current
->varset
.varset
= relvarset
;
596 trs_current
->varset
.size
= 12;
597 trs_current
->next_rel
= trs
;
600 //Targagent Free -> Target Agent
601 //(1 0 1 1 0 1 0 1 0 0 1 1)
603 //(0 1 0 0 1 1 1 0 1 1 0 1)
604 relvarset
= sylvan_set_fromarray(relvars
, 12);
606 uint8_t rel_enc3
[12] = {1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1};
607 memcpy(rel_enc
, rel_enc3
, 12*sizeof(uint8_t));
610 uint8_t rel_enc3
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1};
611 memcpy(rel_enc
, rel_enc3
, 12*sizeof(uint8_t));
613 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
614 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
615 trs_current
->varset
.varset
= relvarset
;
616 trs_current
->varset
.size
= 12;
617 trs_current
->next_rel
= trs
;
620 //Targagent Target -> Target Targagent
621 //(1 0 1 1 0 1 0 1 1 1 1 0)
623 //(0 1 1 1 1 0 1 0 1 1 0 1)
624 relvarset
= sylvan_set_fromarray(relvars
, 12);
626 uint8_t rel_enc4
[12] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0};
627 memcpy(rel_enc
, rel_enc4
, 12*sizeof(uint8_t));
630 uint8_t rel_enc4
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1};
631 memcpy(rel_enc
, rel_enc4
, 12*sizeof(uint8_t));
633 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
634 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
635 trs_current
->varset
.varset
= relvarset
;
636 trs_current
->varset
.size
= 12;
637 trs_current
->next_rel
= trs
;
640 //Agent Box -> Agent Box
641 //(1 1 0 0 1 1 0 0 1 1 0 0)
643 //(0 0 1 1 0 0 1 1 0 0 1 1)
644 relvarset
= sylvan_set_fromarray(relvars
, 12);
646 uint8_t rel_enc5
[12] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
647 memcpy(rel_enc
, rel_enc5
, 12*sizeof(uint8_t));
650 uint8_t rel_enc5
[12] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
651 memcpy(rel_enc
, rel_enc5
, 12*sizeof(uint8_t));
653 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
654 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
655 trs_current
->varset
.varset
= relvarset
;
656 trs_current
->varset
.size
= 12;
657 trs_current
->next_rel
= trs
;
660 //Agent Targbox -> Agent Targbox
661 //(1 1 0 0 1 1 1 1 0 0 0 0)
663 //(1 1 0 0 0 0 1 1 0 0 1 1)
664 relvarset
= sylvan_set_fromarray(relvars
, 12);
666 uint8_t rel_enc6
[12] = {1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0};
667 memcpy(rel_enc
, rel_enc6
, 12*sizeof(uint8_t));
670 uint8_t rel_enc6
[12] = {1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1};
671 memcpy(rel_enc
, rel_enc6
, 12*sizeof(uint8_t));
673 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
674 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
675 trs_current
->varset
.varset
= relvarset
;
676 trs_current
->varset
.size
= 12;
677 trs_current
->next_rel
= trs
;
680 //Targagent Box -> Targagent Box
681 //(1 1 1 1 0 0 0 0 1 1 0 0)
683 //(0 0 1 1 0 0 1 1 1 1 0 0)
684 relvarset
= sylvan_set_fromarray(relvars
, 12);
686 uint8_t rel_enc7
[12] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
687 memcpy(rel_enc
, rel_enc7
, 12*sizeof(uint8_t));
690 uint8_t rel_enc7
[12] = {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
691 memcpy(rel_enc
, rel_enc7
, 12*sizeof(uint8_t));
693 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
694 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
695 trs_current
->varset
.varset
= relvarset
;
696 trs_current
->varset
.size
= 12;
697 trs_current
->next_rel
= trs
;
700 //Targagent Targbox -> Targagent Targbox
701 //(1 1 1 1 0 0 1 1 0 0 0 0)
703 //(1 1 0 0 0 0 1 1 1 1 0 0)
704 relvarset
= sylvan_set_fromarray(relvars
, 12);
706 uint8_t rel_enc8
[12] = {1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0};
707 memcpy(rel_enc
, rel_enc8
, 12*sizeof(uint8_t));
710 uint8_t rel_enc8
[12] = {1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
711 memcpy(rel_enc
, rel_enc8
, 12*sizeof(uint8_t));
713 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
714 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
715 trs_current
->varset
.varset
= relvarset
;
716 trs_current
->varset
.size
= 12;
717 trs_current
->next_rel
= trs
;
723 else if (check_space(x
, y
, dir
, 1, bm
) == 1 && check_space(x
, y
, dir
, 2, bm
) == 1){
724 xy_bddvar_map
*bddvar
= getxy(x
+ xdelta
, y
+ ydelta
, bm
->f
);
725 unsigned int deltai
= bddvar
->value
.var
[0];
726 bddvar
= getxy(x
+ xgamma
, y
+ ygamma
, bm
->f
);
727 unsigned int gammai
= bddvar
->value
.var
[0];
728 //Agent Free -> Free Agent
729 //(1 0 0 0 1 1 0 1 0 0 1 1)
731 //(0 1 0 0 1 1 1 0 0 0 1 1)
732 BDDVAR relvars
[12] = {i
*6, i
*6+1, i
*6+2, i
*6+3, i
*6+4, i
*6+5, deltai
, deltai
+1, deltai
+2, deltai
+3, deltai
+4, deltai
+5};
733 BDDSET relvarset
= sylvan_set_fromarray(relvars
, 12);
736 uint8_t rel_enc_
[12] = {1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1};
737 memcpy(rel_enc
, rel_enc_
, 12*sizeof(uint8_t));
740 uint8_t rel_enc_
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1};
741 memcpy(rel_enc
, rel_enc_
, 12*sizeof(uint8_t));
743 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
744 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
745 trs_current
->varset
.varset
= relvarset
;
746 trs_current
->varset
.size
= 12;
747 trs_current
->next_rel
= trs
;
750 //Agent Target -> Free Targagent
751 //(1 0 0 0 1 1 0 1 1 1 1 0)
753 //(0 1 1 1 1 0 1 0 0 0 1 1)
754 relvarset
= sylvan_set_fromarray(relvars
, 12);
756 uint8_t rel_enc9
[12] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0};
757 memcpy(rel_enc
, rel_enc9
, 12*sizeof(uint8_t));
760 uint8_t rel_enc9
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1};
761 memcpy(rel_enc
, rel_enc9
, 12*sizeof(uint8_t));
763 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
764 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
765 trs_current
->varset
.varset
= relvarset
;
766 trs_current
->varset
.size
= 12;
767 trs_current
->next_rel
= trs
;
770 //Targagent Free -> Target Agent (LEFT || UP)
771 //(1 0 1 1 0 1 0 1 0 0 1 1)
773 //(0 1 0 0 1 1 1 0 1 1 0 1)
774 relvarset
= sylvan_set_fromarray(relvars
, 12);
776 uint8_t rel_enc10
[12] = {1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1};
777 memcpy(rel_enc
, rel_enc10
, 12*sizeof(uint8_t));
780 uint8_t rel_enc10
[12] = {0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1};
781 memcpy(rel_enc
, rel_enc10
, 12*sizeof(uint8_t));
783 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
784 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
785 trs_current
->varset
.varset
= relvarset
;
786 trs_current
->varset
.size
= 12;
787 trs_current
->next_rel
= trs
;
790 //Targagent Target -> Target Targagent (LEFT || UP)
791 //(1 0 1 1 0 1 0 1 1 1 1 0)
793 //(0 1 1 1 1 0 1 0 1 1 0 1)
794 relvarset
= sylvan_set_fromarray(relvars
, 12);
796 uint8_t rel_enc11
[12] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0};
797 memcpy(rel_enc
, rel_enc11
, 12*sizeof(uint8_t));
800 uint8_t rel_enc11
[12] = {0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1};
801 memcpy(rel_enc
, rel_enc11
, 12*sizeof(uint8_t));
803 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
804 trs_current
->bdd
= sylvan_cube(relvarset
, rel_enc
);
805 trs_current
->varset
.varset
= relvarset
;
806 trs_current
->varset
.size
= 12;
807 trs_current
->next_rel
= trs
;
810 //Agent Box Box -> Agent Box Box
811 //(1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 (i delta gamma)
813 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1) (delta gamma i)
815 //(0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0) (gamma i delta)
817 //(1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0) (i gamma delta)
819 //(0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0) (delta i gamma)
821 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1) (gamma delta i)
822 BDDVAR relvars1
[18] = {i
*6, i
*6+1, i
*6+2, i
*6+3, i
*6+4, i
*6+5, deltai
, deltai
+1, deltai
+2, deltai
+3, deltai
+4, deltai
+5, gammai
, gammai
+1, gammai
+2, gammai
+3, gammai
+4, gammai
+5};
823 BDD relvarset1
= sylvan_set_fromarray(relvars1
, 18);
824 uint8_t rel_enc1
[18];
825 if (i
*6 < deltai
&& deltai
< gammai
){
826 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
827 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
829 else if (deltai
< gammai
&& gammai
< i
*6){
830 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
831 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
833 else if (gammai
< i
*6 && i
*6 < deltai
){
834 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
835 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
837 else if (i
*6 < gammai
&& gammai
< deltai
){
838 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
839 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
841 else if (deltai
< i
*6 && i
*6 < gammai
){
842 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
843 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
846 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
847 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
850 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
851 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
852 trs_current
->varset
.varset
= relvarset1
;
853 trs_current
->varset
.size
= 18;
854 trs_current
->next_rel
= trs
;
857 //Agent Box Targbox -> Agent Box Targbox (LEFT || UP)
858 //(1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0) (i delta gamma)
860 //(0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1) (delta gamma i)
862 //(1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0) (gamma i delta)
864 //(1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0) (i gamma delta)
866 //(0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0) (delta i gamma)
868 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1) (gamma delta i)
869 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
870 if (i
*6 < deltai
&& deltai
< gammai
){
871 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0};
872 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
874 else if (deltai
< gammai
&& gammai
< i
*6){
875 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1};
876 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
878 else if (gammai
< i
*6 && i
*6 < deltai
){
879 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
880 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
882 else if (i
*6 < gammai
&& gammai
< deltai
){
883 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
884 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
886 else if (deltai
< i
*6 && i
*6 < gammai
){
887 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0};
888 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
891 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
892 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
894 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
895 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
896 trs_current
->varset
.varset
= relvarset1
;
897 trs_current
->varset
.size
= 18;
898 trs_current
->next_rel
= trs
;
901 //Targagent Box Box -> Targagent Box Box
902 //(1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0)
904 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
906 //(0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0)
908 //(1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0)
910 //(0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0)
912 //(0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
913 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
914 if (i
*6 < deltai
&& deltai
< gammai
){
915 uint8_t rel_enc__
[18] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
916 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
918 else if (deltai
< gammai
&& gammai
< i
*6){
919 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
920 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
922 else if (gammai
< i
*6 && i
*6 < deltai
){
923 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
924 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
926 else if (i
*6 < gammai
&& gammai
< deltai
){
927 uint8_t rel_enc__
[18] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
928 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
930 else if (deltai
< i
*6 && i
*6 < gammai
){
931 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
932 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
935 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
936 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
938 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
939 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
940 trs_current
->varset
.varset
= relvarset1
;
941 trs_current
->varset
.size
= 18;
942 trs_current
->next_rel
= trs
;
945 //Targagent Box Targbox -> Targagent Box Targbox (LEFT || UP)
946 //(1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0)
948 //(0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0)
950 //(1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0)
952 //(1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 0)
954 //(0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0)
956 //(1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0)
957 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
958 if (i
*6 < deltai
&& deltai
< gammai
){
959 uint8_t rel_enc__
[18] = {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0};
960 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
962 else if (deltai
< gammai
&& gammai
< i
*6){
963 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0};
964 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
966 else if (gammai
< i
*6 && i
*6 < deltai
){
967 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0};
968 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
970 else if (i
*6 < gammai
&& gammai
< deltai
){
971 uint8_t rel_enc__
[18] = {1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
972 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
974 else if (deltai
< i
*6 && i
*6 < gammai
){
975 uint8_t rel_enc__
[18] = {0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0};
976 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
979 uint8_t rel_enc__
[18] = {1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0};
980 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
982 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
983 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
984 trs_current
->varset
.varset
= relvarset1
;
985 trs_current
->varset
.size
= 18;
986 trs_current
->next_rel
= trs
;
989 //Agent Box Free -> Free Agent Box
990 //(1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0)
992 //(0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 1)
994 //(0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1)
996 //(1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1)
998 //(0 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0)
1000 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
1001 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1002 if (i
*6 < deltai
&& deltai
< gammai
){
1003 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0};
1004 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1007 else if (deltai
< gammai
&& gammai
< i
*6){
1008 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1};
1009 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1012 else if (gammai
< i
*6 && i
*6 < deltai
){
1013 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
1014 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1017 else if (i
*6 < gammai
&& gammai
< deltai
){
1018 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1};
1019 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1021 else if (deltai
< i
*6 && i
*6 < gammai
){
1022 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0};
1023 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1026 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1};
1027 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1030 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1032 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1033 trs_current
->varset
.varset
= relvarset1
;
1034 trs_current
->varset
.size
= 18;
1035 trs_current
->next_rel
= trs
;
1038 //Agent Targbox Free -> Free Targagent Box
1039 //(1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0)
1041 //(1 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1)
1043 //(0 0 0 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0)
1045 //(1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0)
1047 //(1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0)
1049 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
1050 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1051 if (i
*6 < deltai
&& deltai
< gammai
){
1052 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0};
1053 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1055 else if (deltai
< gammai
&& gammai
< i
*6){
1056 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1};
1057 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1059 else if (gammai
< i
*6 && i
*6 < deltai
){
1060 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0};
1061 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1063 else if (i
*6 < gammai
&& gammai
< deltai
){
1064 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0};
1065 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1067 else if (deltai
< i
*6 && i
*6 < gammai
){
1068 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0};
1069 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1072 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1};
1073 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1075 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1076 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1077 trs_current
->varset
.varset
= relvarset1
;
1078 trs_current
->varset
.size
= 18;
1079 trs_current
->next_rel
= trs
;
1082 //Agent Box Target -> Free Agent Targbox
1083 //(1 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0)
1085 //(0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 1)
1087 //(0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1)
1089 //(1 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1)
1091 //(0 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0)
1093 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1)
1094 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1095 if (i
*6 < deltai
&& deltai
< gammai
){
1096 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0};
1097 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1099 else if (deltai
< gammai
&& gammai
< i
*6){
1100 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1};
1101 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1103 else if (gammai
< i
*6 && i
*6 < deltai
){
1104 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1};
1105 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1107 else if (i
*6 < gammai
&& gammai
< deltai
){
1108 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1};
1109 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1111 else if (deltai
< i
*6 && i
*6 < gammai
){
1112 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0};
1113 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1116 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1};
1117 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1119 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1120 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1121 trs_current
->varset
.varset
= relvarset1
;
1122 trs_current
->varset
.size
= 18;
1123 trs_current
->next_rel
= trs
;
1126 //Agent Targbox Target -> Free Targagent Targbox
1127 //(1 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0)
1129 //(1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1)
1131 //(0 1 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0)
1133 //(1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0)
1135 //(1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0)
1137 //(0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1)
1138 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1139 if (i
*6 < deltai
&& deltai
< gammai
){
1140 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};
1141 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1143 else if (deltai
< gammai
&& gammai
< i
*6){
1144 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1};
1145 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1147 else if (gammai
< i
*6 && i
*6 < deltai
){
1148 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0};
1149 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1151 else if (i
*6 < gammai
&& gammai
< deltai
){
1152 uint8_t rel_enc__
[18] = {1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0};
1153 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1155 else if (deltai
< i
*6 && i
*6 < gammai
){
1156 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0};
1157 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1160 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1};
1161 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1163 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1164 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1165 trs_current
->varset
.varset
= relvarset1
;
1166 trs_current
->varset
.size
= 18;
1167 trs_current
->next_rel
= trs
;
1170 //Targagent Box Free -> Target Agent Box
1171 //(1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0)
1173 //(0 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 1)
1175 //(0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1)
1177 //(1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1)
1179 //(0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0)
1181 //(0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1182 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1183 if (i
*6 < deltai
&& deltai
< gammai
){
1184 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0};
1185 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1187 else if (deltai
< gammai
&& gammai
< i
*6){
1188 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1};
1189 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1191 else if (gammai
< i
*6 && i
*6 < deltai
){
1192 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1};
1193 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1195 else if (i
*6 < gammai
&& gammai
< deltai
){
1196 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1};
1197 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1199 else if (deltai
< i
*6 && i
*6 < gammai
){
1200 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0};
1201 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1204 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1};
1205 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1207 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1208 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1209 trs_current
->varset
.varset
= relvarset1
;
1210 trs_current
->varset
.size
= 18;
1211 trs_current
->next_rel
= trs
;
1214 //Targagent Targbox Free -> Target Targagent Box
1215 //(1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0)
1217 //(1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1)
1219 //(0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 0)
1221 //(1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0)
1223 //(1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0)
1225 //(0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1)
1226 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1227 if (i
*6 < deltai
&& deltai
< gammai
){
1228 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0};
1229 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1231 else if (deltai
< gammai
&& gammai
< i
*6){
1232 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1};
1233 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1235 else if (gammai
< i
*6 && i
*6 < deltai
){
1236 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0};
1237 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1239 else if (i
*6 < gammai
&& gammai
< deltai
){
1240 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0};
1241 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1243 else if (deltai
< i
*6 && i
*6 < gammai
){
1244 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1 ,1, 0};
1245 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1248 uint8_t rel_enc__
[18] = {0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1};
1249 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1251 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1252 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1253 trs_current
->varset
.varset
= relvarset1
;
1254 trs_current
->varset
.size
= 18;
1255 trs_current
->next_rel
= trs
;
1258 //Targagent Box Target -> Target Agent Targbox
1259 //(1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0)
1261 //(0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1)
1263 //(0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 1)
1265 //(1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1)
1267 //(0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0)
1269 //(0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1)
1270 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1271 if (i
*6 < deltai
&& deltai
< gammai
){
1272 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0};
1273 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1275 else if (deltai
< gammai
&& gammai
< i
*6){
1276 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1};
1277 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1279 else if (gammai
< i
*6 && i
*6 < deltai
){
1280 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1};
1281 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1283 else if (i
*6 < gammai
&& gammai
< deltai
){
1284 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1};
1285 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1287 else if (deltai
< i
*6 && i
*6 < gammai
){
1288 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0};
1289 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1292 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1};
1293 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1295 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1296 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1297 trs_current
->varset
.varset
= relvarset1
;
1298 trs_current
->varset
.size
= 18;
1299 trs_current
->next_rel
= trs
;
1302 //Targagent Targbox Target -> Target Targagent Targbox
1303 //(1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0)
1305 //(1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1)
1307 //(0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0)
1309 //(1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0)
1311 //(1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0)
1313 //(1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0)
1314 relvarset1
= sylvan_set_fromarray(relvars1
, 18);
1315 if (i
*6 < deltai
&& deltai
< gammai
){
1316 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0};
1317 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1319 else if (deltai
< gammai
&& gammai
< i
*6){
1320 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1};
1321 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1323 else if (gammai
< i
*6 && i
*6 < deltai
){
1324 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0};
1325 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1327 else if (i
*6 < gammai
&& gammai
< deltai
){
1328 uint8_t rel_enc__
[18] = {1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0};
1329 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1331 else if (deltai
< i
*6 && i
*6 < gammai
){
1332 uint8_t rel_enc__
[18] = {1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0};
1333 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1336 uint8_t rel_enc__
[18] = {0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1};
1337 memcpy(rel_enc1
, rel_enc__
, 18*sizeof(uint8_t));
1339 trs_current
= (trans_t
*)malloc(sizeof(trans_t
));
1340 trs_current
->bdd
= sylvan_cube(relvarset1
, rel_enc1
);
1341 trs_current
->varset
.varset
= relvarset1
;
1342 trs_current
->varset
.size
= 18;
1343 trs_current
->next_rel
= trs
;
1354 if (trs_current != NULL) printf("LEFT ok!\n");
1355 else printf ("LEFT is empty\n");
1356 printf("Num of trans relations:%d\n", countTrans(trs));
1359 if (trs_current != NULL) printf("UP ok!\n");
1360 else printf ("UP is empty\n");
1361 printf("Num of trans relations:%d\n", countTrans(trs));
1364 if (trs_current != NULL) printf("RIGHT ok!\n");
1365 else printf ("RIGHT is empty\n");
1366 printf("Num of trans relations:%d\n", countTrans(trs));
1369 if (trs_current != NULL) printf("DOWN ok!\n");
1370 else printf ("DOWN is empty\n");
1371 printf("Num of trans relations:%d\n", countTrans(trs));
1380 int countTrans(trans_t *trs)
1383 while (trs != NULL){
1385 trs = trs->next_rel;
1390 rels
*encode_rel(sokoban_screen
*screen
)
1394 trans_t
*tl
= sylvan_false
;
1397 tl
= create_single_rel(screen
, LEFT
);
1400 trans_t
*tu
= create_single_rel(screen
, UP
);
1403 trans_t
*tr
= create_single_rel(screen
, RIGHT
);
1406 trans_t
*td
= create_single_rel(screen
, DOWN
);
1409 rls
= (rels
*)malloc(sizeof(rels
));
1418 int test_trans(state
*s
, trans_t
*t
)
1421 BDD next
= sylvan_false
;
1423 next
= sylvan_relnext(s
->bdd
, t
->bdd
, t
->varset
.varset
);
1424 if (next
== s
->bdd
) printf("Same\n");
1425 if (next
!= s
->bdd
&& next
!= sylvan_false
) printf("Different\n");
1426 if (next
== sylvan_false
) printf("False\n");