package org.drools.semantics.builder.model.hierarchy.opt; import org.drools.planner.core.phase.custom.CustomSolverPhaseCommand; import org.drools.planner.core.score.director.ScoreDirector; import org.drools.semantics.builder.model.ConceptImplProxy; import org.drools.semantics.builder.model.Concept; import org.drools.semantics.builder.model.PropertyRelation; import java.util.Iterator; import java.util.LinkedHashMap; public class SolutionInitializer implements CustomSolverPhaseCommand { public void changeWorkingSolution( ScoreDirector scoreDirector ) { OptimalHierarchy hier = (OptimalHierarchy) scoreDirector.getWorkingSolution(); initialize( hier.getInheritances(), scoreDirector ); } private void initialize( LinkedHashMap<String, ConceptImplProxy> inheritances, ScoreDirector scoreDirector ) { for ( ConceptImplProxy con : inheritances.values() ) { con.getChosenProperties().putAll( con.getConcept().getProperties() ); for ( Concept sup : con.getConcept().getSuperConcepts() ) { for ( PropertyRelation pro : sup.getAvailableProperties() ) { con.getChosenProperties().put( pro.getProperty(), pro ); } } } for ( ConceptImplProxy con : inheritances.values() ) { if ( ! con.getConcept().getSuperConcepts().isEmpty() ) { Iterator<Concept> iter = con.getConcept().getSuperConcepts().iterator(); Concept next = iter.next(); ConceptStrengthEvaluator comparator = new ConceptStrengthEvaluator(); int score = -1; while ( iter.hasNext() ) { Concept candidate = iter.next(); int x = comparator.compare( candidate, next ); if ( x > score ) { score = x; next = candidate; } } scoreDirector.beforeEntityAdded( con ); scoreDirector.beforeVariableChanged( con, "chosenSuper" ); con.setChosenSuper( inheritances.get( next.getIri() ) ); scoreDirector.afterEntityAdded( con ); if ( inheritances.containsKey( next.getIri() ) ) { ConceptImplProxy supCon = inheritances.get( next.getIri() ); for ( String key : supCon.getAvailablePropertiesVirtual().keySet() ) { if ( con.getChosenProperties().containsKey( key ) ) { con.getChosenProperties().remove( key ); } // con.getAvailableProperties().put( key, supCon.getAvailableProperties().get( key ) ); } } scoreDirector.afterVariableChanged( con, "chosenSuper" ); } else { con.setChosenSuper( con ); } } } }