Search code examples
mathematical-optimizationscipsat

What does Aggregation mean for SAT problems in SCIP?


In the SCIP Optimization Suite 6.0 paper, there is a section on Aggregation Presolver. The example given is a linear constraint with 2 variables a1x1+a2x2=b where either x1 or x2 is made the subject, then substituting it to the other constraints. I understand the logic when this is a linear program.

However, for SAT problems, my problem file and transproblem files show the following:

[logicor] <c301>: logicor(<x591>[B],<~x666>[B]); (This comes from problem file)
[logicor] <c302>: logicor(<~x591>[B],<x666>[B]);

is transformed to

[binary] <t_x666>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: +1<t_x591>

and

[logicor] <c1402>: logicor(<x538>[B],<x138>[B]); (This comes from problem file)
[logicor] <c1403>: logicor(<~x538>[B],<~x138>[B]);

is transformed to

  [binary] <t_x138>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: 1 -1<t_x538>

I don't understand how aggregation works in these 2 cases because of the logicor constraints. Would anybody explain this to me please? Thank you!


Solution

  • (Lots of guessing as i don't know much about scip internals)

    The example

    [logicor] <c301>: logicor(<x591>[B],<~x666>[B]); (This comes from problem file)
    [logicor] <c302>: logicor(<~x591>[B],<x666>[B]);
    

    is equivalent (boolean alg) to:

    ~591 -> ~x666
    x591 -> x666
    

    This really looks like case 2 of 4 (from presol_implics.h):

    x=0 ⇒ y=lb and x=1 ⇒ y=ub : aggregate y == lb + (ub − lb)x
    

    with:

    lb = 0 
    ub = 1
    

    leading to:

    aggregate y == lb + (ub − lb)x
    <-> x666 == 0 + (1-0) x591 
    <-> x666 == +1 x591
    
    for comparison:
    [binary] <t_x666>: obj=-0, global bounds=[-0,1], local bounds=[-0,1], aggregated: +1<t_x591>
    

    So if scip's output means t_x666 is the replaced version of x666 this makes some sense to me.

    The final aggregation-term also fits the truth-table:

    a    b    (a | ~b) & (~a | b)
    0    0        1
    0    1        0
    1    0        0
    1    1        1
    

    -> basically a negated XOR -> equality -> true iff both are equal

    As the implication-graph is the natural thing to reason about 2-sat clauses, i'm inclined to say, that this really is the part of scips internals acting here.