User Tools

Site Tools


ptidej_solver

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ptidej_solver [2014/03/31 14:34]
yann [Constraints Definitions]
ptidej_solver [2014/03/31 15:19]
yann [Constraints Definitions]
Line 5: Line 5:
 ===== Problem Motifs Definitions ===== ===== Problem Motifs Definitions =====
  
-Because it uses a constraint solver, Ptidej requires each motif to be defined as a constraint satisfaction problem.+Because it uses a constraint solver, Ptidej requires each motif to be defined as a constraint satisfaction problem. A simple example of problem follows: 
 + 
 +<​code>​ 
 +public final class CompositionAndInheritanceTest { 
 + public static Problem getProblem(final List allEntities) { 
 + final Problem pb = 
 + new Problem( 
 + 90, 
 + "​Composition and Strict Inheritance Test",​ 
 + allEntities);​ 
 + 
 + final Variable subEntity = 
 + new Variable(pb,​ "​SubEntity"​.toCharArray(),​ true); 
 + final Variable superEntity = 
 + new Variable(pb,​ "​SuperEntity"​.toCharArray(),​ true); 
 + 
 + pb.addVar(subEntity);​ 
 + pb.addVar(superEntity);​ 
 + 
 + final StrictInheritanceConstraint c1 = 
 + new StrictInheritanceConstraint( 
 + "​SuperEntity -|>- SubEntity",​ 
 + "​throw new RuntimeException(\"​SuperEntity -|>- SubEntity\"​);",​ 
 + subEntity,​ 
 + superEntity,​ 
 + 50, 
 + DefaultInheritanceApproximations.getDefaultApproximations());​ 
 + final ContainerCompositionConstraint c2 = 
 + new ContainerCompositionConstraint( 
 + "​SubEntity <#>​->​ SuperEntity",​ 
 + "​throw new RuntimeException(\"​SubEntity <#>​->​ SuperEntity\"​);",​ 
 + subEntity,​ 
 + superEntity,​ 
 + 100, 
 + DefaultNoApproximations.getDefaultApproximations());​ 
 + 
 + pb.post(c1);​ 
 + pb.post(c2);​ 
 + 
 + return pb; 
 +
 +
 +</​code>​ 
 + 
 +In this problem, two roles are defined: that of ''​SubClass''​ and of ''​SuperClass''​. For classes to play the roles of ''​SubClass''​ and ''​SuperClass'',​ the ''​SubClass''​ must inherit from the ''​SuperClass''​ (even if zero, one, or more entities stands between the ''​SubClass''​ and the ''​SuperClass''​ in the inheritance tree) and the ''​SubClass''​ must be composed of instances of the ''​SuperClass''​.
  
 ===== Constraints Definitions ===== ===== Constraints Definitions =====
Line 16: Line 60:
     * ''​Variable v0''​ and ''​Variable v1'':​ instances of class ''​ptidej.solver.Variable''​ that represent the two variable between which the constraint must hold;     * ''​Variable v0''​ and ''​Variable v1'':​ instances of class ''​ptidej.solver.Variable''​ that represent the two variable between which the constraint must hold;
     * ''​int weight'':​ the weight of the constraint in the problem. The sum of the weights of all the constraints in a problem should equal 100;     * ''​int weight'':​ the weight of the constraint in the problem. The sum of the weights of all the constraints in a problem should equal 100;
-    * ''​IApproximations approximations'':​ an instance of ''​ptidej.solver.approximation.IApproximations'',​ which returns and ordered array of constraint names, to try one after the other if the previous one cannot be verified. +    * ''​IApproximations approximations'':​ an instance of ''​ptidej.solver.approximation.IApproximations'',​ which returns and ordered array of constraint names, to try one after the other if the previous one cannot be verified
-    ​This ​class has two sub-classes to specialise for inheritance and binary-class relationships.+ 
 +{{ :​binaryconstraint.png?direct |}} 
 + 
 +  * ''​ptidej.solver.constraint.BinaryCounterConstraint'':​ for any binary constraint that count some properties between the two variables, for example a "​distance"​ in terms of number of relationships that must be followed to reach ''​v1''​ from ''​v0'';​ 
 + 
 +{{ :​binarycounterconstraint.png?​nolink |}} 
 + 
 +  * ''​ptidej.solver.constraint.UnaryConstraint'':​ for any unary constraint, i.e., constraint on a single variable to verify a property of an entity, for example if an entity is an interface vs. a class
 + 
 +{{ :​unaryconstraint.png?​nolink |}} 
 + 
 +''​BinaryConstraint'' ​has two sub-classes to specialise for inheritance and binary-class relationships.
     * ''​ptidej.solver.constraint.AbstractInheritanceConstraint''​     * ''​ptidej.solver.constraint.AbstractInheritanceConstraint''​
     * ''​ptidej.solver.constraint.AbstractRelationshipConstraint''​     * ''​ptidej.solver.constraint.AbstractRelationshipConstraint''​
-  * ''​ptidej.solver.constraint.BinaryCounterConstraint''​ + 
-  * ''​ptidej.solver.constraint.UnaryConstraint''​+''​BinaryConstraint''​ and ''​BinaryCounterConstraint'' ​may also be further specified using the methods: 
 +  * ''​setSymbol(String)'':​ the symbol to print in the result file, any string; 
 +  * ''​setStrict(boolean)'':​ whether the constraint ​allows a same entity to play both role (false) or not (true); 
 +  * ''​setFieldName(String)'':​ the name of the field supporting the property between entities that are candidate to play the two rolesFields include the following, whose names are somewhat self-explanatory:​ 
 +    * ''​aggregatedEntities''​ 
 +    * ''​allReachableAggregatedEntities''​ 
 +    * ''​allReachableAssociatedEntities''​ 
 +    * ''​allReachableComposedEntities''​ 
 +    * ''​allReachableContainerAggregatedEntities''​ 
 +    * ''​allReachableContainerComposedEntities''​ 
 +    * ''​allReachableCreatedEntities''​ 
 +    * ''​allReachableKnownEntities''​ 
 +    * ''​allReachableSuperEntities''​ 
 +    * ''​allReachableUnknownEntities''​ 
 +    * ''​associatedEntities''​ 
 +    * ''​composedEntities''​ 
 +    * ''​containerAggregatedEntities''​ 
 +    * ''​containerComposedEntities''​ 
 +    * ''​createdEntities''​ 
 +    * ''​knownEntities''​ 
 +    * ''​methodNames''​ 
 +    * ''​superEntities''​ 
 +    * ''​unknownEntities''​
  
 ===== Occurrences Identification ===== ===== Occurrences Identification =====
ptidej_solver.txt · Last modified: 2019/10/06 20:37 (external edit)