
org.sosy_lab.java_smt.basicimpl.AbstractSolverContext Maven / Gradle / Ivy
Show all versions of java-smt Show documentation
// This file is part of JavaSMT,
// an API wrapper for a collection of SMT solvers:
// https://github.com/sosy-lab/java-smt
//
// SPDX-FileCopyrightText: 2020 Dirk Beyer
//
// SPDX-License-Identifier: Apache-2.0
package org.sosy_lab.java_smt.basicimpl;
import com.google.common.base.Preconditions;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import org.sosy_lab.java_smt.api.FormulaManager;
import org.sosy_lab.java_smt.api.InterpolatingProverEnvironment;
import org.sosy_lab.java_smt.api.OptimizationProverEnvironment;
import org.sosy_lab.java_smt.api.ProverEnvironment;
import org.sosy_lab.java_smt.api.SolverContext;
import org.sosy_lab.java_smt.basicimpl.withAssumptionsWrapper.InterpolatingProverWithAssumptionsWrapper;
import org.sosy_lab.java_smt.basicimpl.withAssumptionsWrapper.ProverWithAssumptionsWrapper;
public abstract class AbstractSolverContext implements SolverContext {
private final FormulaManager fmgr;
protected AbstractSolverContext(FormulaManager fmgr) {
this.fmgr = fmgr;
}
@Override
public final FormulaManager getFormulaManager() {
return fmgr;
}
@SuppressWarnings("resource")
@Override
public final ProverEnvironment newProverEnvironment(ProverOptions... options) {
ProverEnvironment out = newProverEnvironment0(toSet(options));
if (!supportsAssumptionSolving()) {
// In the case we do not already have a prover environment with assumptions,
// we add a wrapper to it
out = new ProverWithAssumptionsWrapper(out);
}
return out;
}
protected abstract ProverEnvironment newProverEnvironment0(Set options);
@SuppressWarnings("resource")
@Override
public final InterpolatingProverEnvironment> newProverEnvironmentWithInterpolation(
ProverOptions... options) {
InterpolatingProverEnvironment> out = newProverEnvironmentWithInterpolation0(toSet(options));
if (!supportsAssumptionSolving()) {
// In the case we do not already have a prover environment with assumptions,
// we add a wrapper to it
out = new InterpolatingProverWithAssumptionsWrapper<>(out, fmgr);
}
return out;
}
protected abstract InterpolatingProverEnvironment> newProverEnvironmentWithInterpolation0(
Set pSet);
@SuppressWarnings("resource")
@Override
public final OptimizationProverEnvironment newOptimizationProverEnvironment(
ProverOptions... options) {
return newOptimizationProverEnvironment0(toSet(options));
}
protected abstract OptimizationProverEnvironment newOptimizationProverEnvironment0(
Set pSet);
/**
* Whether the solver supports solving under some given assumptions (with all corresponding
* features) by itself, i.e., whether {@link
* ProverEnvironment#isUnsatWithAssumptions(java.util.Collection)} and {@link
* InterpolatingProverEnvironment#isUnsatWithAssumptions(java.util.Collection)} are fully
* implemented.
*
* Otherwise, i.e., if this method returns {@code false}, the solver does not need to support
* this feature and may simply {@code throw UnsupportedOperationException} in the respective
* methods. This class will wrap the prover environments and provide an implementation of the
* feature.
*
*
This method is expected to always return the same value. Otherwise, the behavior of this
* class is undefined.
*/
protected abstract boolean supportsAssumptionSolving();
private static Set toSet(ProverOptions... options) {
Set opts = EnumSet.noneOf(ProverOptions.class);
Collections.addAll(opts, options);
return opts;
}
/**
* This method loads the given libraries.
*
* If the first list of libraries can not be loaded, the second list is used as a fallback. The
* two lists of libraries can be used to differ between libraries specific to Unix/Linux and
* Windows.
*
*
If the first try aborts after a few steps, we do not clean up partially loaded libraries,
* but directly start the second try.
*
*
Each list is applied in the given ordering.
*
* @param loader the loading mechanism that will be used for loading each single library.
* @param librariesForFirstTry list of library names that will be loaded, if possible.
* @param librariesForSecondTry list of library names that will be loaded, after the first attempt
* (using librariesForFirstTry) has failed.
* @throws UnsatisfiedLinkError if neither the first nor second try returned a successful loading
* process.
*/
protected static void loadLibrariesWithFallback(
Consumer loader,
List librariesForFirstTry,
List librariesForSecondTry)
throws UnsatisfiedLinkError {
Preconditions.checkNotNull(librariesForFirstTry);
Preconditions.checkNotNull(librariesForSecondTry);
try {
librariesForFirstTry.forEach(loader);
} catch (UnsatisfiedLinkError e1) {
try {
librariesForSecondTry.forEach(loader);
} catch (UnsatisfiedLinkError e2) {
e1.addSuppressed(e2);
throw e1;
}
}
}
}