Skip to content

Commit b783c19

Browse files
committed
bugfix: added backbone literals to intermediate result in AdvancedSimplifier
1 parent 09e61b0 commit b783c19

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/main/java/org/logicng/transformations/simplification/AdvancedSimplifier.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,23 +142,26 @@ public Formula apply(final Formula formula, final boolean cache) {
142142
}
143143
final Formula simplifyMinDnf = computeMinDnf(f, simplified, config);
144144
if (simplifyMinDnf == null) {
145-
return config.returnIntermediateResult ? simplified : null;
145+
return config.returnIntermediateResult ? addLiterals(simplified, backboneLiterals) : null;
146146
}
147147
simplified = simplifyWithRating(simplified, simplifyMinDnf, config);
148148
if (config.factorOut) {
149149
final Formula factoredOut = simplified.transform(new FactorOutSimplifier(config.ratingFunction));
150150
simplified = simplifyWithRating(simplified, factoredOut, config);
151151
}
152-
if (config.restrictBackbone) {
153-
simplified = f.and(f.and(backboneLiterals), simplified);
154-
}
152+
simplified = addLiterals(simplified, backboneLiterals);
155153
if (config.simplifyNegations) {
156154
final Formula negationSimplified = simplified.transform(NegationSimplifier.get());
157155
simplified = simplifyWithRating(simplified, negationSimplified, config);
158156
}
159157
return simplified;
160158
}
161159

160+
private static Formula addLiterals(final Formula formula, final SortedSet<Literal> literals) {
161+
final FormulaFactory f = formula.factory();
162+
return f.and(f.and(literals), formula);
163+
}
164+
162165
private Formula computeMinDnf(final FormulaFactory f, final Formula simplified, final AdvancedSimplifierConfig config) {
163166
final PrimeResult primeResult =
164167
PrimeCompiler.getWithMinimization().compute(simplified, PrimeResult.CoverageType.IMPLICANTS_COMPLETE, config.optimizationConfig);

src/test/java/org/logicng/transformations/simplification/AdvancedSimplifierTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import static org.logicng.solvers.maxsat.OptimizationConfig.OptimizationType.MAXSAT_MSU3;
3636
import static org.logicng.solvers.maxsat.OptimizationConfig.OptimizationType.MAXSAT_OLL;
3737
import static org.logicng.solvers.maxsat.OptimizationConfig.OptimizationType.MAXSAT_WBO;
38+
import static org.mockito.Mockito.mock;
39+
import static org.mockito.Mockito.when;
3840

3941
import org.junit.jupiter.api.Test;
4042
import org.junit.jupiter.params.ParameterizedTest;
@@ -63,6 +65,7 @@
6365
import java.util.Arrays;
6466
import java.util.Collection;
6567
import java.util.List;
68+
import java.util.concurrent.atomic.AtomicInteger;
6669

6770
/**
6871
* Unit Tests for the class {@link AdvancedSimplifier}.
@@ -210,6 +213,17 @@ public void testAdvancedSimplifierConfig() {
210213
}
211214
}
212215

216+
@Test
217+
public void testBackboneIntermediateResult() {
218+
final FormulaFactory f = new FormulaFactory();
219+
Formula formula = parse(f, "(a & b) | (a & c)");
220+
OptimizationHandler optHandler = mock(OptimizationHandler.class);
221+
// abort simplification after successful backbone computation
222+
final AtomicInteger count = new AtomicInteger(0);
223+
when(optHandler.aborted()).then(invocationOnMock -> count.addAndGet(1) > 1);
224+
testHandler(optHandler, formula, true, true);
225+
}
226+
213227
private void computeAndVerify(final Formula formula, final AdvancedSimplifier simplifier) {
214228
final Formula simplified = formula.transform(simplifier);
215229
assertThat(formula.factory().equivalence(formula, simplified).holds(new TautologyPredicate(this.f)))

0 commit comments

Comments
 (0)