[rules-users] Drools solver info => provide DSL instead of DRL to Drools Solver

Geoffrey De Smet ge0ffrey.spam at gmail.com
Sun Nov 22 11:47:17 EST 2009


dmzpippo-drools at yahoo.it schreef:
> Hi Geoffrey,
> I have modified the LocalSearchSolverConfig class to accept the 
> <scoreDsl> tag.

Thanks for the patch!
If you want credit, state your full name, and I 'll add an @author tag 
in the javadoc.

> To use this tag need gonfigure the XML solverConfig file adding the path 
> of Drl file and Dsl file associated in two line consecutive in the 
> configuration file. This code is not the best but is a start....

It seems a bit wierd to me add both the drl and the dsl in the 
<scoreDsl>, so like this:

<scoreDsl>/org/.../file1.drl</scoreDsl>
<scoreDsl>/org/.../file2.dsl</scoreDsl>

I am going experiment with this instead, and use it in one the examples, 
before I commit the changes.

<scoreDrl>/org/.../file1.drl</scoreDrl>
<scoreDsl>/org/.../file2.dsl</scoreDsl>

Just "watch" this issue to get notified when it's committed on trunk:
   https://jira.jboss.org/jira/browse/JBRULES-2333

> 
> I send you the code if it can be useful.
> I would also ask when it launches the new version of the solver, and if 
> this will also include other local search algorithms than Tabu Search

Simulated annealing and great deluge are available, but they aren't 
production-ready.
Take a look at SimulatedAnnealingAccepter and GreatDelugeAccepter.
I've also written a testcase for both.
Patches welcome :)
I am focusing on conflict based statistics and 
multi-threading/clustering first.

PS: If a patch is more then one file, do use "create patch" in your 
Eclipse/IntelliJ or "svn diff > jiraNumber.patch".
Also, attach it to the jira issue pls.

> 
> with kind regards,
> Marco


With kind regards,
Geoffrey De Smet

> 
> LocalSearchSolverConfig class Code
> 
> 
> /**
>  * @author Geoffrey De Smet
>  */
> @XStreamAlias("localSearchSolver")
> public class LocalSearchSolverConfig {
> 
>     private Long randomSeed = null;
> 
>     @XStreamImplicit(itemFieldName = "scoreDrl")
>     private List<String> scoreDrlList = null;
>     @XStreamImplicit(itemFieldName = "scoreDsl")//FIXME adding DslList
>     private List<String> scoreDslList = null;
>     @XStreamAlias("scoreDefinition")
>     private ScoreDefinitionConfig scoreDefinitionConfig = new 
> ScoreDefinitionConfig();
> 
>     private StartingSolutionInitializer startingSolutionInitializer = null;
>     private Class<StartingSolutionInitializer> 
> startingSolutionInitializerClass = null;
> 
>     @XStreamAlias("termination")
>     private TerminationConfig terminationConfig = new 
> TerminationConfig(); // TODO this new is pointless due to xstream
> 
>     @XStreamAlias("deciderScoreComparatorFactory")
>     private DeciderScoreComparatorFactoryConfig 
> deciderScoreComparatorFactoryConfig
>             = new DeciderScoreComparatorFactoryConfig();
>     @XStreamAlias("selector")
>     private SelectorConfig selectorConfig = new SelectorConfig();
>     @XStreamAlias("accepter")
>     private AccepterConfig accepterConfig = new AccepterConfig();
>     @XStreamAlias("forager")
>     private ForagerConfig foragerConfig = new ForagerConfig();
> 
>     public Long getRandomSeed() {
>         return randomSeed;
>     }
> 
>     public void setRandomSeed(Long randomSeed) {
>         this.randomSeed = randomSeed;
>     }
> 
>     public List<String> getScoreDrlList() {
>         return scoreDrlList;
>     }
> 
>     public void setScoreDrlList(List<String> scoreDrlList) {
>         this.scoreDrlList = scoreDrlList;
>     }
> 
>     public List<String> getScoreDslList() {
>         return scoreDslList;
>     }
> 
>     public void setScoreDslList(List<String> scoreDslList) {
>         this.scoreDslList = scoreDslList;
>     }
> 
>     public ScoreDefinitionConfig getScoreDefinitionConfig() {
>         return scoreDefinitionConfig;
>     }
> 
>     public void setScoreDefinitionConfig(ScoreDefinitionConfig 
> scoreDefinitionConfig) {
>         this.scoreDefinitionConfig = scoreDefinitionConfig;
>     }
> 
>     public StartingSolutionInitializer getStartingSolutionInitializer() {
>         return startingSolutionInitializer;
>     }
> 
>     public void 
> setStartingSolutionInitializer(StartingSolutionInitializer 
> startingSolutionInitializer) {
>         this.startingSolutionInitializer = startingSolutionInitializer;
>     }
> 
>     public Class<StartingSolutionInitializer> 
> getStartingSolutionInitializerClass() {
>         return startingSolutionInitializerClass;
>     }
> 
>     public void 
> setStartingSolutionInitializerClass(Class<StartingSolutionInitializer> 
> startingSolutionInitializerClass) {
>         this.startingSolutionInitializerClass = 
> startingSolutionInitializerClass;
>     }
> 
>     public TerminationConfig getTerminationConfig() {
>         return terminationConfig;
>     }
> 
>     public void setTerminationConfig(TerminationConfig terminationConfig) {
>         this.terminationConfig = terminationConfig;
>     }
> 
>     public DeciderScoreComparatorFactoryConfig 
> getDeciderScoreComparatorFactoryConfig() {
>         return deciderScoreComparatorFactoryConfig;
>     }
> 
>     public void setDeciderScoreComparatorFactoryConfig(
>             DeciderScoreComparatorFactoryConfig 
> deciderScoreComparatorFactoryConfig) {
>         this.deciderScoreComparatorFactoryConfig = 
> deciderScoreComparatorFactoryConfig;
>     }
> 
>     public SelectorConfig getSelectorConfig() {
>         return selectorConfig;
>     }
> 
>     public void setSelectorConfig(SelectorConfig selectorConfig) {
>         this.selectorConfig = selectorConfig;
>     }
> 
>     public AccepterConfig getAccepterConfig() {
>         return accepterConfig;
>     }
> 
>     public void setAccepterConfig(AccepterConfig accepterConfig) {
>         this.accepterConfig = accepterConfig;
>     }
> 
>     public ForagerConfig getForagerConfig() {
>         return foragerConfig;
>     }
> 
>     public void setForagerConfig(ForagerConfig foragerConfig) {
>         this.foragerConfig = foragerConfig;
>     }
> 
>     // 
> ************************************************************************
>     // Builder methods
>     // 
> ************************************************************************
> 
>     public LocalSearchSolver buildSolver() {
>         DefaultLocalSearchSolver localSearchSolver = new 
> DefaultLocalSearchSolver();
>         if (randomSeed != null) {
>             localSearchSolver.setRandomSeed(randomSeed);
>         } else {
>             localSearchSolver.setRandomSeed(0L);
>         }
>         localSearchSolver.setRuleBase(buildRuleBase());
>         ScoreDefinition scoreDefinition = 
> scoreDefinitionConfig.buildScoreDefinition();
>         localSearchSolver.setScoreDefinition(scoreDefinition);
>         // remove when score-in-solution refactor
>         
> localSearchSolver.setScoreCalculator(scoreDefinitionConfig.buildScoreCalculator());
>         
> localSearchSolver.setStartingSolutionInitializer(buildStartingSolutionInitializer());
>         localSearchSolver.setBestSolutionRecaller(new 
> BestSolutionRecaller());
>         
> localSearchSolver.setTermination(terminationConfig.buildTermination(scoreDefinition));
>         localSearchSolver.setDecider(buildDecider());
>         return localSearchSolver;
>     }
> 
>     private RuleBase buildRuleBase() {
>         PackageBuilder packageBuilder = new PackageBuilder();
>         if(scoreDrlList!=null)
>             for (String scoreDrl : scoreDrlList) {
>                 InputStream scoreDrlIn = 
> getClass().getResourceAsStream(scoreDrl);
>                 if (scoreDrlIn == null) {
>                     throw new IllegalArgumentException("scoreDrl (" + 
> scoreDrl + ") does not exist as a classpath resource.");
>                 }
>                 try {
>                     packageBuilder.addPackageFromDrl(new 
> InputStreamReader(scoreDrlIn, "utf-8"));
>                 } catch (DroolsParserException e) {
>                     throw new IllegalArgumentException("scoreDrl (" + 
> scoreDrl + ") could not be loaded.", e);
>                 } catch (IOException e) {
>                     throw new IllegalArgumentException("scoreDrl (" + 
> scoreDrl + ") could not be loaded.", e);
>                 } finally {
>                     IOUtils.closeQuietly(scoreDrlIn);
>                 }
>             }
> 
>         //FIXME scoreDslList addPackageFrom(Drl,Dsl)
>         if(scoreDslList!=null){
>             String scoreDrl=null;
>             String scoreDsl=null;
>             for(int i=0;i< scoreDslList.size();i++){
>                 if(scoreDslList.get(i).endsWith("drl")){
>                     scoreDrl=scoreDslList.get(i);
>                 }
>                 else{
>                     scoreDsl=scoreDslList.get(i);
>                 }
>                 if(scoreDrl!=null&&scoreDsl!=null){
>                     InputStream scoreDrlIn = 
> getClass().getResourceAsStream(scoreDrl);
>                     InputStream scoreDslIn = 
> getClass().getResourceAsStream(scoreDsl);
>                     if (scoreDrlIn == null || scoreDslIn == null) {
>                         throw new IllegalArgumentException("score does 
> not exist as a classpath resource.");
>                     }
>                     try {
>                         packageBuilder.addPackageFromDrl(new 
> InputStreamReader(scoreDrlIn, "utf-8"),new InputStreamReader(scoreDslIn, 
> "utf-8"));
>                     } catch (DroolsParserException e) {
>                         throw new IllegalArgumentException("scoreDrl  
> could not be loaded.", e);
>                     } catch (IOException e) {
>                         throw new IllegalArgumentException("scoreDrl 
> could not be loaded.", e);
>                     } finally {
>                         IOUtils.closeQuietly(scoreDrlIn);
>                     }
>                     scoreDrl=null;
>                     scoreDsl=null;
>                 }
>             }
>         }
>         RuleBaseConfiguration ruleBaseConfiguration = new 
> RuleBaseConfiguration();
>         RuleBase ruleBase = 
> RuleBaseFactory.newRuleBase(ruleBaseConfiguration);
>         if (packageBuilder.hasErrors()) {
>             throw new IllegalStateException("There are errors in the 
> scoreDrl's:"
>                     + packageBuilder.getErrors().toString());
>         }
>         ruleBase.addPackage(packageBuilder.getPackage());
>         return ruleBase;
>     }
> 
>     public StartingSolutionInitializer buildStartingSolutionInitializer() {
>         if (startingSolutionInitializer != null) {
>             return startingSolutionInitializer;
>         } else if (startingSolutionInitializerClass != null) {
>             try {
>                 return startingSolutionInitializerClass.newInstance();
>             } catch (InstantiationException e) {
>                 throw new 
> IllegalArgumentException("startingSolutionInitializerClass ("
>                         + startingSolutionInitializerClass.getName()
>                         + ") does not have a public no-arg constructor", e);
>             } catch (IllegalAccessException e) {
>                 throw new 
> IllegalArgumentException("startingSolutionInitializerClass ("
>                         + startingSolutionInitializerClass.getName()
>                         + ") does not have a public no-arg constructor", e);
>             }
>         } else {
>             return null;
>         }
>     }
> 
>     private Decider buildDecider() {
>         DefaultDecider decider = new DefaultDecider();
>         
> decider.setDeciderScoreComparator(deciderScoreComparatorFactoryConfig.buildDeciderScoreComparatorFactory());
>         decider.setSelector(selectorConfig.buildSelector());
>         decider.setAccepter(accepterConfig.buildAccepter());
>         decider.setForager(foragerConfig.buildForager());
>         return decider;
>     }
> 
>     public void inherit(LocalSearchSolverConfig inheritedConfig) {
>         if (randomSeed == null) {
>             randomSeed = inheritedConfig.getRandomSeed();
>         }
>         if (scoreDrlList == null) {
>             scoreDrlList = inheritedConfig.getScoreDrlList();
>         } else {
>             List<String> inheritedScoreDrlList = 
> inheritedConfig.getScoreDrlList();
>             if (inheritedScoreDrlList != null) {
>                 for (String inheritedScoreDrl : inheritedScoreDrlList) {
>                     if (!scoreDrlList.contains(inheritedScoreDrl)) {
>                         scoreDrlList.add(inheritedScoreDrl);
>                     }
>                 }
>             }
>         }
>         //FIXME scoreDSLlist
>         if(scoreDslList ==null){
>             scoreDslList=inheritedConfig.getScoreDslList();
>         }else{
>             List<String> 
> inheritedScoreDslList=inheritedConfig.getScoreDslList();
>             if(inheritedScoreDslList != null){
>                 for(String inheritedScoreDsl : inheritedScoreDslList){
>                     if(!scoreDslList.contains(inheritedScoreDsl)){
>                         scoreDslList.add(inheritedScoreDsl);
>                     }
>                 }
>             }
>         }
>         if (scoreDefinitionConfig == null) {
>             scoreDefinitionConfig = 
> inheritedConfig.getScoreDefinitionConfig();
>         } else if (inheritedConfig.getScoreDefinitionConfig() != null) {
>             
> scoreDefinitionConfig.inherit(inheritedConfig.getScoreDefinitionConfig());
>         }
>         if (startingSolutionInitializer == null && 
> startingSolutionInitializerClass == null) {
>             startingSolutionInitializer = 
> inheritedConfig.getStartingSolutionInitializer();
>             startingSolutionInitializerClass = 
> inheritedConfig.getStartingSolutionInitializerClass();
>         }
>         if (terminationConfig == null) {
>             terminationConfig = inheritedConfig.getTerminationConfig();
>         } else if (inheritedConfig.getTerminationConfig() != null) {
>             
> terminationConfig.inherit(inheritedConfig.getTerminationConfig());
>         }
>         if (deciderScoreComparatorFactoryConfig == null) {
>             deciderScoreComparatorFactoryConfig = 
> inheritedConfig.getDeciderScoreComparatorFactoryConfig();
>         } else if 
> (inheritedConfig.getDeciderScoreComparatorFactoryConfig() != null) {
>             
> deciderScoreComparatorFactoryConfig.inherit(inheritedConfig.getDeciderScoreComparatorFactoryConfig());
>         }
>         if (selectorConfig == null) {
>             selectorConfig = inheritedConfig.getSelectorConfig();
>         } else if (inheritedConfig.getSelectorConfig() != null) {
>             selectorConfig.inherit(inheritedConfig.getSelectorConfig());
>         }
>         if (accepterConfig == null) {
>             accepterConfig = inheritedConfig.getAccepterConfig();
>         } else if (inheritedConfig.getAccepterConfig() != null) {
>             accepterConfig.inherit(inheritedConfig.getAccepterConfig());
>         }
>         if (foragerConfig == null) {
>             foragerConfig = inheritedConfig.getForagerConfig();
>         } else if (inheritedConfig.getForagerConfig() != null) {
>             foragerConfig.inherit(inheritedConfig.getForagerConfig());
>         }
>     }
> 
> }
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users




More information about the rules-users mailing list