24{
25 int i,
var, *paired, newvar;
26 int old_num_vars, old_num_binary_vars, old_size, old_mv_start;
27 int *new_part_size, new_num_vars, new_num_binary_vars, new_mv_start;
29 char scratch[1000], **oldlabel, *var1, *var1bar, *var2, *var2bar;
30
31 if (adjust_labels)
33
34
35
36
37 paired =
ALLOC(
bool,
cube.num_binary_vars);
38 for(var = 0;
var <
cube.num_binary_vars;
var++)
40 for(i = 0; i < pair->
cnt; i++)
41 if ((pair->
var1[i] > 0 && pair->
var1[i] <=
cube.num_binary_vars) &&
42 (pair->
var2[i] > 0 && pair->
var2[i] <=
cube.num_binary_vars)) {
45 } else
46 fatal(
"can only pair binary-valued variables");
47
51
52
54 old_num_vars =
cube.num_vars;
55 old_num_binary_vars =
cube.num_binary_vars;
56 old_mv_start =
cube.first_part[
cube.num_binary_vars];
57
58 new_num_binary_vars = 0;
59 for(var = 0;
var < old_num_binary_vars;
var++)
60 new_num_binary_vars += (paired[var] ==
FALSE);
61 new_num_vars = new_num_binary_vars + pair->
cnt;
62 new_num_vars += old_num_vars - old_num_binary_vars;
63 new_part_size =
ALLOC(
int, new_num_vars);
65 new_part_size[new_num_binary_vars + var] = 4;
66 for(var = 0;
var < old_num_vars - old_num_binary_vars;
var++)
67 new_part_size[new_num_binary_vars + pair->
cnt + var] =
68 cube.part_size[old_num_binary_vars + var];
71 cube.num_vars = new_num_vars;
72 cube.num_binary_vars = new_num_binary_vars;
73 cube.part_size = new_part_size;
75
76
77 if (adjust_labels) {
78 oldlabel = PLA->
label;
81 newvar =
cube.num_binary_vars*2 +
var*4;
82 var1 = oldlabel[ (pair->
var1[
var]-1) * 2 + 1];
83 var2 = oldlabel[ (pair->
var2[
var]-1) * 2 + 1];
84 var1bar = oldlabel[ (pair->
var1[
var]-1) * 2];
85 var2bar = oldlabel[ (pair->
var2[
var]-1) * 2];
86 (void)
sprintf(scratch,
"%s+%s", var1bar, var2bar);
87 PLA->
label[newvar] = util_strsav(scratch);
88 (void)
sprintf(scratch,
"%s+%s", var1bar, var2);
89 PLA->
label[newvar+1] = util_strsav(scratch);
90 (void)
sprintf(scratch,
"%s+%s", var1, var2bar);
91 PLA->
label[newvar+2] = util_strsav(scratch);
92 (void)
sprintf(scratch,
"%s+%s", var1, var2);
93 PLA->
label[newvar+3] = util_strsav(scratch);
94 }
95
96 i = 0;
97 for(var = 0;
var < old_num_binary_vars;
var++) {
98 if (paired[var] ==
FALSE) {
100 PLA->
label[2*i+1] = oldlabel[2*
var+1];
101 oldlabel[2*
var] = oldlabel[2*
var+1] = (
char *) NULL;
102 i++;
103 }
104 }
105
106 new_mv_start =
cube.num_binary_vars*2 + pair->
cnt*4;
107 for(i = old_mv_start; i < old_size; i++) {
108 PLA->
label[new_mv_start + i - old_mv_start] = oldlabel[i];
109 oldlabel[i] = (char *) NULL;
110 }
111
112 for(i = 0; i < old_size; i++)
113 if (oldlabel[i] != (char *) NULL)
116 }
117
118
120 cube.sparse[
cube.num_binary_vars + var] = 0;
122}