de.fosd.typechef.featureexpr.sat

SATFeatureExpr

sealed abstract class SATFeatureExpr extends FeatureExpr

Propositional (or boolean) feature expressions.

Feature expressions are compared on object identity (comparing them for equivalence is an additional but expensive operation). Connectives such as "and", "or" and "not" memoize results, so that the operation yields identical results on identical parameters. Classes And, Or and Not are made package-private, and their constructors wrapped through companion objects, to prevent the construction of formulas in any other way.

However, this is not yet enough to guarantee the 'maximal sharing' property, because the and/or operators are also associative, but the memoization cannot be associative. Papers on hash-consing explain that one needs to perform a further normalization step.

More in general, one can almost prove a theorem called the weak-canonicalization guarantee:

If at a given time during program execution, two formula objects represent structurally equal formulas, i.e. which are deeply equal modulo the order of operands of "and" and "or", then they are represented by the same object.

XXX: HOWEVER, that the associative property does not hold with pointer equality: (a and b) and c ne a and (b and c). Hopefully this is fixable through different caching.

Note that this is not related to formula equivalence, rather to pointer equality. This does not hold for formulas existing at different moments, because caches are implemented using weak references, so if a formula disappears from the heap it is recreated. However, this is not observable for the code.

The weak canonicalization property, if true, should allows also ensuring the strong-canonicalization guarantee: If at a given time during program execution, two formula objects a and b represent equivalent formulas, then a.toCNF eq b.toCNF (where eq denotes pointer equality).

CNF canonicalization, by construction, ensures that a.toCNF and b.toCNF are structurally equal. The weak canonicalization property would also ensure that they are the same object.

It would be interesting to see what happens for toEquiCNF.

Linear Supertypes
FeatureExpr, Serializable, AnyRef, Any
Known Subclasses
Ordering
  1. Alphabetic
  2. By inheritance
Inherited
  1. SATFeatureExpr
  2. FeatureExpr
  3. Serializable
  4. AnyRef
  5. Any
  1. Hide All
  2. Show all
Learn more about member selection
Visibility
  1. Public
  2. All

Instance Constructors

  1. new SATFeatureExpr()

Abstract Value Members

  1. abstract def calcCNF: SATFeatureExpr

    Attributes
    protected
  2. abstract def calcCNFEquiSat: SATFeatureExpr

    Attributes
    protected
  3. abstract def calcSize: Int

    Attributes
    protected
    Definition Classes
    FeatureExpr
  4. abstract def evaluate(selectedFeatures: Set[String]): Boolean

    evaluate the expression for a given feature selection (all features not provided are assumed deselected)

    evaluate the expression for a given feature selection (all features not provided are assumed deselected)

    features provided as a list of names (how they would be created with createDefinedExternal)

    evaluates to true or false

    Definition Classes
    SATFeatureExprFeatureExpr
  5. abstract def mapDefinedExpr(f: (DefinedExpr) ⇒ SATFeatureExpr, cache: Map[SATFeatureExpr, SATFeatureExpr]): SATFeatureExpr

    map function that applies to all leafs in the feature expression (i.

    map function that applies to all leafs in the feature expression (i.e. all DefinedExpr nodes)

  6. abstract def substitute(feature: SingleFeatureExpr, replacement: SATFeatureExpr): SATFeatureExpr

  7. abstract def toTextExpr: String

    Definition Classes
    FeatureExpr

Concrete Value Members

  1. final def !=(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  2. final def !=(arg0: Any): Boolean

    Definition Classes
    Any
  3. final def ##(): Int

    Definition Classes
    AnyRef → Any
  4. final def &(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  5. final def ==(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  6. final def ==(arg0: Any): Boolean

    Definition Classes
    Any
  7. def and(that: FeatureExpr): FeatureExpr

    Definition Classes
    SATFeatureExprFeatureExpr
  8. final def andNot(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  9. final def asInstanceOf[T0]: T0

    Definition Classes
    Any
  10. def calcHashCode: Int

    Attributes
    protected
  11. def clone(): AnyRef

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  12. def collectDistinctFeatureObjects: Set[SingleFeatureExpr]

    Definition Classes
    SATFeatureExprFeatureExpr
  13. def collectDistinctFeatures: Set[String]

    helper function for statistics and such that determines which features are involved in this feature expression

    helper function for statistics and such that determines which features are involved in this feature expression

    Definition Classes
    SATFeatureExprFeatureExpr
  14. def collectDistinctFeatures2: Set[DefinedExternal]

  15. def countDistinctFeatures: Int

    counts the number of features in this expression for statistic purposes

  16. def debug_print(indent: Int): String

    Definition Classes
    FeatureExpr
  17. final def eq(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  18. final def equals(that: Any): Boolean

    Definition Classes
    SATFeatureExpr → AnyRef → Any
  19. def equiv(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  20. def equivalentTo(that: FeatureExpr, fm: FeatureModel): Boolean

    Definition Classes
    FeatureExpr
  21. def equivalentTo(that: FeatureExpr): Boolean

    uses a SAT solver to determine whether two expressions are equivalent.

    uses a SAT solver to determine whether two expressions are equivalent.

    for performance reasons, it checks pointer equivalence first, but won't use the recursive equals on aexpr (there should only be few cases when equals is more accurate than eq, which are not worth the performance overhead)

    Definition Classes
    FeatureExpr
  22. def finalize(): Unit

    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  23. final def getClass(): Class[_]

    Definition Classes
    AnyRef → Any
  24. def getConfIfSimpleAndExpr(): Option[(Set[SingleFeatureExpr], Set[SingleFeatureExpr])]

    NOT implemented, this method will always return None.

    NOT implemented, this method will always return None.

    returns
    Definition Classes
    SATFeatureExprFeatureExpr
  25. def getConfIfSimpleOrExpr(): Option[(Set[SingleFeatureExpr], Set[SingleFeatureExpr])]

    NOT implemented, this method will always return None.

    NOT implemented, this method will always return None.

    Definition Classes
    SATFeatureExprFeatureExpr
  26. def getSatisfiableAssignment(featureModel: FeatureModel, interestingFeatures: Set[SingleFeatureExpr], preferDisabledFeatures: Boolean): Option[(List[SingleFeatureExpr], List[SingleFeatureExpr])]

    Definition Classes
    SATFeatureExprFeatureExpr
  27. def hashCode(): Int

    Definition Classes
    AnyRef → Any
  28. def implies(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  29. def indent(level: Int): String

    Attributes
    protected
    Definition Classes
    FeatureExpr
  30. def isContradiction(fm: FeatureModel): Boolean

    Definition Classes
    FeatureExpr
  31. final def isContradiction(): Boolean

    Definition Classes
    FeatureExpr
  32. final def isInstanceOf[T0]: Boolean

    Definition Classes
    Any
  33. lazy val isResolved: Boolean

    checks whether there is some unresolved macro (DefinedMacro) somewhere in the expression tree

  34. def isSatisfiable(fm: FeatureModel): Boolean

    x.

    x.isSatisfiable(fm) is short for x.and(fm).isSatisfiable but is faster because FM is cached

    Definition Classes
    SATFeatureExprFeatureExpr
  35. final def isSatisfiable(): Boolean

    Definition Classes
    FeatureExpr
  36. def isSmall(): Boolean

    heuristic to determine whether a feature expression is small (may be used to decide whether to inline it or not)

    heuristic to determine whether a feature expression is small (may be used to decide whether to inline it or not)

    use with care

  37. def isTautology(fm: FeatureModel): Boolean

    FM -> X is tautology if FM.

    FM -> X is tautology if FM.implies(X).isTautology or !FM.and.(x.not).isSatisfiable

    not final for optimization purposes

    Definition Classes
    FeatureExpr
  38. final def isTautology(): Boolean

    Definition Classes
    FeatureExpr
  39. def mex(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  40. final def ne(arg0: AnyRef): Boolean

    Definition Classes
    AnyRef
  41. def not(): SATFeatureExpr

    Definition Classes
    SATFeatureExprFeatureExpr
  42. def notS(): SATFeatureExpr

  43. final def notify(): Unit

    Definition Classes
    AnyRef
  44. final def notifyAll(): Unit

    Definition Classes
    AnyRef
  45. def or(that: FeatureExpr): FeatureExpr

    Definition Classes
    SATFeatureExprFeatureExpr
  46. final def orNot(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  47. def print(p: Writer): Unit

    Prints the textual representation of this formula on a Writer.

    Prints the textual representation of this formula on a Writer. The result shall be equivalent to p.print(toTextExpr), but it should avoid consuming so much temporary space.

    p

    the output Writer

    Definition Classes
    FeatureExpr
  48. lazy val resolveToExternal: SATFeatureExpr

    replaces all DefinedMacro tokens by their full expansion.

    replaces all DefinedMacro tokens by their full expansion.

    the resulting feature expression contains only DefinedExternal nodes as leafs and can be printed and read again

  49. final lazy val size: Int

    Definition Classes
    FeatureExpr
  50. final def synchronized[T0](arg0: ⇒ T0): T0

    Definition Classes
    AnyRef
  51. def toCNF(): SATFeatureExpr

    creates an equivalent feature expression in CNF

    creates an equivalent feature expression in CNF

    be aware of exponential explosion. consider using toCnfEquiSat instead if possible

  52. def toCnfEquiSat(): SATFeatureExpr

    creates an equisatisfiable feature expression in CNF

    creates an equisatisfiable feature expression in CNF

    the result is not equivalent but will yield the same result in satisifiability tests with SAT solvers

    the algorithm introduces new variables and is faster than toCNF

  53. def toString(): String

    Converts this formula to a textual expression.

    Converts this formula to a textual expression.

    Definition Classes
    FeatureExpr → AnyRef → Any
  54. final def unary_!: FeatureExpr

    Definition Classes
    FeatureExpr
  55. def unique(feature: SingleFeatureExpr): FeatureExpr

    unique existential quantification over feature "feature".

    unique existential quantification over feature "feature".

    This has the effect of substituting the feature by true and false respectively and returning the xor of both: this[feature->True] xor this[feature->False]

    It can be seen as identifying under which condition the feature matters for the result of the formula

    Definition Classes
    SATFeatureExprFeatureExpr
  56. final def wait(): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  57. final def wait(arg0: Long, arg1: Int): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  58. final def wait(arg0: Long): Unit

    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  59. def xor(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr
  60. final def |(that: FeatureExpr): FeatureExpr

    Definition Classes
    FeatureExpr

Inherited from FeatureExpr

Inherited from Serializable

Inherited from AnyRef

Inherited from Any

Ungrouped