Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/20/09 17:38:19 (15 years ago)
Author:
gkronber
Message:

Worked on different dispatching of deterministic and non-deterministic modeling algorithms. #635

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.CEDMA.Server/3.3/SimpleDispatcher.cs

    r1857 r1873  
    3838
    3939namespace HeuristicLab.CEDMA.Server {
    40   public class RandomDispatcher : DispatcherBase {
     40  public class SimpleDispatcher : DispatcherBase {
    4141    private Random random;
    42     public RandomDispatcher(IStore store)
     42    private IStore store;
     43    private Dictionary<Entity, Dictionary<int, List<string>>> finishedAndDispatchedRuns;
     44
     45    public SimpleDispatcher(IStore store)
    4346      : base(store) {
     47      this.store = store;
    4448      random = new Random();
     49      finishedAndDispatchedRuns = new Dictionary<Entity, Dictionary<int, List<string>>>();
     50      PopulateFinishedRuns();
    4551    }
    4652
    47     public override IAlgorithm SelectAlgorithm(DataSet dataSet, int targetVariable, LearningTask learningTask) {
     53    public override IAlgorithm SelectAlgorithm(Entity dataSetEntity, int targetVariable, LearningTask learningTask) {
    4854      DiscoveryService ds = new DiscoveryService();
    4955      IAlgorithm[] algos = ds.GetInstances<IAlgorithm>();
     56      IAlgorithm selectedAlgorithm = null;
    5057      switch (learningTask) {
    5158        case LearningTask.Regression: {
    5259            var regressionAlgos = algos.Where(a => (a as IClassificationAlgorithm) == null && (a as ITimeSeriesAlgorithm) == null);
    53             if (regressionAlgos.Count() == 0) return null;
    54             return regressionAlgos.ElementAt(random.Next(regressionAlgos.Count()));
     60            selectedAlgorithm = ChooseDeterministic(dataSetEntity, targetVariable, regressionAlgos) ?? ChooseStochastic(regressionAlgos);
     61            break;
    5562          }
    5663        case LearningTask.Classification: {
    5764            var classificationAlgos = algos.Where(a => (a as IClassificationAlgorithm) != null);
    58             if (classificationAlgos.Count() == 0) return null;
    59             return classificationAlgos.ElementAt(random.Next(classificationAlgos.Count()));
     65            selectedAlgorithm = ChooseDeterministic(dataSetEntity, targetVariable, classificationAlgos) ?? ChooseStochastic(classificationAlgos);
     66            break;
    6067          }
    6168        case LearningTask.TimeSeries: {
    6269            var timeSeriesAlgos = algos.Where(a => (a as ITimeSeriesAlgorithm) != null);
    63             if (timeSeriesAlgos.Count() == 0) return null;
    64             return timeSeriesAlgos.ElementAt(random.Next(timeSeriesAlgos.Count()));
     70            selectedAlgorithm = ChooseDeterministic(dataSetEntity, targetVariable, timeSeriesAlgos) ?? ChooseStochastic(timeSeriesAlgos);
     71            break;
    6572          }
    6673      }
    67       return null;
     74      if (selectedAlgorithm != null) {
     75        AddDispatchedRun(dataSetEntity, targetVariable, selectedAlgorithm.Name);
     76      }
     77      return selectedAlgorithm;
     78    }
     79
     80    private IAlgorithm ChooseDeterministic(Entity dataSetEntity, int targetVariable, IEnumerable<IAlgorithm> algos) {
     81      var deterministicAlgos = algos
     82        .Where(a => (a as IStochasticAlgorithm) == null)
     83        .Where(a => AlgorithmFinishedOrDispatched(dataSetEntity, targetVariable, a.Name) == false);
     84
     85      if (deterministicAlgos.Count() == 0) return null;
     86      return deterministicAlgos.ElementAt(random.Next(deterministicAlgos.Count()));
     87    }
     88
     89    private IAlgorithm ChooseStochastic(IEnumerable<IAlgorithm> regressionAlgos) {
     90      var stochasticAlgos = regressionAlgos.Where(a => (a as IStochasticAlgorithm) != null);
     91      if (stochasticAlgos.Count() == 0) return null;
     92      return stochasticAlgos.ElementAt(random.Next(stochasticAlgos.Count()));
    6893    }
    6994
     
    7297    }
    7398
    74     public override int SelectTargetVariable(DataSet dataSet, int[] targetVariables) {
     99    public override int SelectTargetVariable(Entity dataSet, int[] targetVariables) {
    75100      return targetVariables[random.Next(targetVariables.Length)];
     101    }
     102
     103    private void PopulateFinishedRuns() {
     104      var result = store
     105        .Query("?DataSet <" + Ontology.PredicateInstanceOf.Uri + "> <" + Ontology.TypeDataSet.Uri + "> ." + Environment.NewLine +
     106        "?DataSet <" + Ontology.PredicateHasModel + "> ?Model ." + Environment.NewLine +
     107        "?Model <" + Ontology.TargetVariable + "> ?TargetVariable ." + Environment.NewLine +
     108        "?Model <" + Ontology.AlgorithmName + "> ?AlgoName .",
     109        0, 1000)
     110        .Select(x => new Resource[] { (Entity)x.Get("DataSet"), (Literal)x.Get("TargetVariable"), (Literal)x.Get("AlgoName") });
     111
     112      foreach (Resource[] row in result) {
     113        Entity dataset = (Entity)row[0];
     114        int targetVariable = (int)((Literal)row[1]).Value;
     115        string algoName = (string)((Literal)row[2]).Value;
     116        if (!AlgorithmFinishedOrDispatched(dataset, targetVariable, algoName))
     117          AddDispatchedRun(dataset, targetVariable, algoName);
     118      }
     119    }
     120
     121    private void AddDispatchedRun(Entity dataSetEntity, int targetVariable, string algoName) {
     122      if (!finishedAndDispatchedRuns.ContainsKey(dataSetEntity)) {
     123        finishedAndDispatchedRuns[dataSetEntity] = new Dictionary<int, List<string>>();
     124      }
     125      if (!finishedAndDispatchedRuns[dataSetEntity].ContainsKey(targetVariable)) {
     126        finishedAndDispatchedRuns[dataSetEntity][targetVariable] = new List<string>();
     127      }
     128      finishedAndDispatchedRuns[dataSetEntity][targetVariable].Add(algoName);
     129    }
     130
     131    private bool AlgorithmFinishedOrDispatched(Entity dataSetEntity, int targetVariable, string algoName) {
     132      return
     133        finishedAndDispatchedRuns.ContainsKey(dataSetEntity) &&
     134        finishedAndDispatchedRuns[dataSetEntity].ContainsKey(targetVariable) &&
     135        finishedAndDispatchedRuns[dataSetEntity][targetVariable].Contains(algoName);
    76136    }
    77137  }
Note: See TracChangeset for help on using the changeset viewer.