Changeset 7120 for branches/HeuristicLab.TimeSeries
- Timestamp:
- 12/05/11 08:22:36 (13 years ago)
- Location:
- branches/HeuristicLab.TimeSeries
- Files:
-
- 1 added
- 1 deleted
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.TimeSeries/HeuristicLab.Algorithms.DataAnalysis/3.4/Linear/LinearTimeSeriesPrognosis.cs
r7100 r7120 142 142 } 143 143 144 SymbolicTimeSeriesPrognosisSolution solution = new SymbolicTimeSeriesPrognosisSolution(new SymbolicTimeSeriesPrognosisModel(tree, new Symbolic TimeSeriesPrognosisInterpreter(problemData.TargetVariables.ToArray())), (ITimeSeriesPrognosisProblemData)problemData.Clone());144 SymbolicTimeSeriesPrognosisSolution solution = new SymbolicTimeSeriesPrognosisSolution(new SymbolicTimeSeriesPrognosisModel(tree, new SymbolicDataAnalysisExpressionTreeInterpreter(), problemData.TargetVariables.ToArray()), (ITimeSeriesPrognosisProblemData)problemData.Clone()); 145 145 solution.Model.Name = "Linear Time-Series Prognosis Model"; 146 146 return solution; -
branches/HeuristicLab.TimeSeries/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Symbols/StartSymbol.cs
r6803 r7120 26 26 [StorableClass] 27 27 [Item(StartSymbol.StartSymbolName, StartSymbol.StartSymbolDescription)] 28 public sealed class StartSymbol : Symbol , IReadOnlySymbol{28 public sealed class StartSymbol : Symbol { 29 29 public const string StartSymbolName = "StartSymbol"; 30 30 public const string StartSymbolDescription = "Special symbol that represents the starting node of the result producing branch of a symbolic expression tree."; 31 31 private const int minimumArity = 1; 32 private const int maximumArity = 1;32 private const int maximumArity = 255; 33 33 34 34 public override int MinimumArity { -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis.Views-3.4.csproj
r7099 r7120 111 111 <ItemGroup> 112 112 <Compile Include="Plugin.cs" /> 113 <Compile Include="SymbolicTimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs">114 <SubType>UserControl</SubType>115 </Compile>116 <Compile Include="SymbolicTimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.Designer.cs">117 <DependentUpon>SymbolicTimeSeriesPrognosisSolutionErrorCharacteristicsCurveView.cs</DependentUpon>118 </Compile>119 <Compile Include="SymbolicTimeSeriesPrognosisSolutionView.cs">120 <SubType>UserControl</SubType>121 </Compile>122 <Compile Include="SymbolicTimeSeriesPrognosisSolutionView.Designer.cs">123 <DependentUpon>SymbolicTimeSeriesPrognosisSolutionView.cs</DependentUpon>124 </Compile>125 113 <None Include="HeuristicLab.snk" /> 126 114 <None Include="Plugin.cs.frame" /> 127 <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs">128 <SubType>UserControl</SubType>129 </Compile>130 <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.Designer.cs">131 <DependentUpon>InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs</DependentUpon>132 </Compile>133 115 <Compile Include="Properties\AssemblyInfo.cs" /> 134 116 <None Include="Properties\AssemblyInfo.cs.frame" /> -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis-3.4.csproj
r7100 r7120 111 111 <ItemGroup> 112 112 <Compile Include="Interfaces\ISymbolicTimeSeriesPrognosisInterpreterOperator.cs" /> 113 <Compile Include="Interfaces\ISymbolicTimeSeriesPrognogisInterpreter.cs" />114 113 <Compile Include="Interfaces\ISymbolicTimeSeriesPrognosisEvaluator.cs" /> 115 114 <Compile Include="Interfaces\ISymbolicTimeSeriesPrognosisModel.cs" /> … … 122 121 <Compile Include="SingleObjective\SymbolicTimeSeriesPrognosisSingleObjectiveProblem.cs" /> 123 122 <Compile Include="SingleObjective\SymbolicTimeSeriesPrognosisSingleObjectiveTrainingBestSolutionAnalyzer.cs" /> 124 <Compile Include="SymbolicTimeSeriesPrognosisInterpreter.cs" />125 123 <Compile Include="SymbolicTimeSeriesPrognosisModel.cs" /> 126 124 <Compile Include="SymbolicTimeSeriesPrognosisSolution.cs" /> … … 139 137 <Name>HeuristicLab.Collections-3.3</Name> 140 138 </ProjectReference> 139 <ProjectReference Include="..\..\HeuristicLab.Common.Resources\3.3\HeuristicLab.Common.Resources-3.3.csproj"> 140 <Project>{0E27A536-1C4A-4624-A65E-DC4F4F23E3E1}</Project> 141 <Name>HeuristicLab.Common.Resources-3.3</Name> 142 </ProjectReference> 141 143 <ProjectReference Include="..\..\HeuristicLab.Common\3.3\HeuristicLab.Common-3.3.csproj"> 142 144 <Project>{A9AD58B9-3EF9-4CC1-97E5-8D909039FF5C}</Project> … … 182 184 <Project>{DF87C13E-A889-46FF-8153-66DCAA8C5674}</Project> 183 185 <Name>HeuristicLab.Problems.DataAnalysis-3.4</Name> 186 </ProjectReference> 187 <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj"> 188 <Project>{F4539FB6-4708-40C9-BE64-0A1390AEA197}</Project> 189 <Name>HeuristicLab.Random-3.3</Name> 184 190 </ProjectReference> 185 191 </ItemGroup> -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/Interfaces/ISymbolicTimeSeriesPrognosisEvaluator.cs
r6802 r7120 20 20 #endregion 21 21 22 using HeuristicLab.Core; 23 using HeuristicLab.Data; 22 24 23 25 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis { 24 26 public interface ISymbolicTimeSeriesPrognosisEvaluator : ISymbolicDataAnalysisEvaluator<ITimeSeriesPrognosisProblemData> { 27 IValueLookupParameter<IntValue> HorizonParameter { get; } 25 28 } 26 29 } -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/Interfaces/ISymbolicTimeSeriesPrognosisInterpreterOperator.cs
r7100 r7120 24 24 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis { 25 25 public interface ISymbolicTimeSeriesPrognosisInterpreterOperator : IOperator { 26 ILookupParameter<ISymbolicTimeSeriesPrognosis Interpreter> SymbolicTimeSeriesPrognosisInterpreterParameter { get; }26 ILookupParameter<ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter> SymbolicTimeSeriesPrognosisInterpreterParameter { get; } 27 27 } 28 28 } -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/Interfaces/ISymbolicTimeSeriesPrognosisModel.cs
r6802 r7120 22 22 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 23 23 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis { 24 public interface ISymbolicTimeSeriesPrognosisModel : ITimeSeriesPrognosisModel, ISymbolicDataAnalysisModel { 24 public interface ISymbolicTimeSeriesPrognosisModel : ITimeSeriesPrognosisModel { 25 ISymbolicExpressionTree SymbolicExpressionTree { get; } 26 ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter Interpreter { get; } 25 27 } 26 28 } -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveEvaluator.cs
r6802 r7120 22 22 23 23 using HeuristicLab.Common; 24 using HeuristicLab.Core; 25 using HeuristicLab.Data; 26 using HeuristicLab.Parameters; 24 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 25 28 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis { 26 29 public abstract class SymbolicTimeSeriesPrognosisSingleObjectiveEvaluator : SymbolicDataAnalysisSingleObjectiveEvaluator<ITimeSeriesPrognosisProblemData>, ISymbolicTimeSeriesPrognosisSingleObjectiveEvaluator { 30 private const string HorizonParameterName = "Horizon"; 31 32 public IValueLookupParameter<IntValue> HorizonParameter { 33 get { return (IValueLookupParameter<IntValue>)Parameters[HorizonParameterName]; } 34 } 35 27 36 [StorableConstructor] 28 37 protected SymbolicTimeSeriesPrognosisSingleObjectiveEvaluator(bool deserializing) : base(deserializing) { } … … 31 40 } 32 41 33 protected SymbolicTimeSeriesPrognosisSingleObjectiveEvaluator() : base() { } 42 protected SymbolicTimeSeriesPrognosisSingleObjectiveEvaluator() 43 : base() { 44 Parameters.Add(new ValueLookupParameter<IntValue>(HorizonParameterName, "The time interval for which the prognosis should be calculated.", new IntValue(1))); 45 } 34 46 } 35 47 } -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveMeanSquaredErrorEvaluator.cs
r7100 r7120 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 24 using System.Linq; 23 25 using HeuristicLab.Common; 24 26 using HeuristicLab.Core; … … 48 50 IEnumerable<int> rows = GenerateRowsToEvaluate(); 49 51 50 double quality = Calculate(SymbolicTimeSeriesPrognosisInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows); 52 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, 53 solution, 54 EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, 55 ProblemDataParameter.ActualValue, 56 rows, HorizonParameter.ActualValue.Value); 51 57 QualityParameter.ActualValue = new DoubleValue(quality); 52 58 … … 54 60 } 55 61 56 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows) { 57 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 58 OnlineMeanAndVarianceCalculator meanCalculator = new OnlineMeanAndVarianceCalculator(); 62 public static double Calculate(ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows, int horizon) { 63 var allPredictedContinuations = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, problemData.TargetVariables.ToArray(), rows, horizon); 64 var meanCalculator = new OnlineMeanAndVarianceCalculator(); 65 var allPredictedContinuationsEnumerator = allPredictedContinuations.GetEnumerator(); 59 66 foreach (var targetVariable in problemData.TargetVariables) { 60 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(targetVariable, rows); 61 IEnumerable<double> boundedEstimationValues = estimatedValues.LimitToRange(lowerEstimationLimit, 62 upperEstimationLimit); 63 OnlineCalculatorError errorState; 64 meanCalculator.Add(OnlineMeanSquaredErrorCalculator.Calculate(originalValues, boundedEstimationValues, out errorState)); 65 if (errorState != OnlineCalculatorError.None) return double.NaN; 67 if (!allPredictedContinuationsEnumerator.MoveNext()) throw new InvalidOperationException(); 68 var actualContinuations = from r in rows 69 select problemData.Dataset.GetDoubleValues(targetVariable, Enumerable.Range(r, horizon)); 70 var actualContinuationsEnumerator = actualContinuations.GetEnumerator(); 71 var predictedContinuationsEnumerator = allPredictedContinuationsEnumerator.Current.GetEnumerator(); 72 while (actualContinuationsEnumerator.MoveNext() & predictedContinuationsEnumerator.MoveNext()) { 73 OnlineCalculatorError errorState; 74 meanCalculator.Add(OnlineMeanSquaredErrorCalculator.Calculate(predictedContinuationsEnumerator.Current.LimitToRange(lowerEstimationLimit, upperEstimationLimit), 75 actualContinuationsEnumerator.Current, out errorState)); 76 if (errorState != OnlineCalculatorError.None) return double.NaN; 77 } 66 78 } 67 79 return meanCalculator.Mean; … … 69 81 70 82 public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows) { 71 Symbolic TimeSeriesPrognosisInterpreterParameter.ExecutionContext = context;83 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 72 84 EstimationLimitsParameter.ExecutionContext = context; 85 HorizonParameter.ExecutionContext = context; 73 86 74 double mse = Calculate(Symbolic TimeSeriesPrognosisInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows);87 double mse = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, HorizonParameter.ActualValue.Value); 75 88 76 77 Symbolic TimeSeriesPrognosisInterpreterParameter.ExecutionContext = null;89 HorizonParameter.ExecutionContext = null; 90 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 78 91 EstimationLimitsParameter.ExecutionContext = null; 79 92 -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectivePearsonRSquaredEvaluator.cs
r7100 r7120 20 20 #endregion 21 21 22 using System; 22 23 using System.Collections.Generic; 24 using System.Linq; 23 25 using HeuristicLab.Common; 24 26 using HeuristicLab.Core; … … 48 50 IEnumerable<int> rows = GenerateRowsToEvaluate(); 49 51 50 double quality = Calculate(SymbolicTimeSeriesPrognosisInterpreterParameter.ActualValue, solution, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, ProblemDataParameter.ActualValue, rows); 52 double quality = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, solution, 53 EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, 54 ProblemDataParameter.ActualValue, 55 rows, HorizonParameter.ActualValue.Value); 51 56 QualityParameter.ActualValue = new DoubleValue(quality); 52 57 … … 54 59 } 55 60 56 public static double Calculate(ISymbolicDataAnalysisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows) { 57 IEnumerable<double> estimatedValues = interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, rows); 61 public static double Calculate(ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter interpreter, ISymbolicExpressionTree solution, double lowerEstimationLimit, double upperEstimationLimit, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows, int horizon) { 62 var allPredictedContinuations = 63 interpreter.GetSymbolicExpressionTreeValues(solution, problemData.Dataset, problemData.TargetVariables.ToArray(), 64 rows, horizon).ToArray(); 65 58 66 var meanCalculator = new OnlineMeanAndVarianceCalculator(); 67 int i = 0; 59 68 foreach (var targetVariable in problemData.TargetVariables) { 60 IEnumerable<double> originalValues = problemData.Dataset.GetDoubleValues(targetVariable, rows); 69 var actualContinuations = from r in rows 70 select problemData.Dataset.GetDoubleValues(targetVariable, Enumerable.Range(r, horizon)); 71 var startValues = problemData.Dataset.GetDoubleValues(targetVariable, rows.Select(r => r - 1)); 61 72 OnlineCalculatorError errorState; 62 meanCalculator.Add(OnlinePearsonsRSquaredCalculator.Calculate(estimatedValues, originalValues, out errorState)); 63 if (errorState != OnlineCalculatorError.None) return 0.0; 73 meanCalculator.Add(OnlineTheilsUStatisticCalculator.Calculate( 74 startValues, 75 allPredictedContinuations.Select(v => v.ElementAt(i)), 76 actualContinuations, out errorState)); 77 if (errorState != OnlineCalculatorError.None) return double.NaN; 78 i++; 64 79 } 65 80 return meanCalculator.Mean; … … 67 82 68 83 public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, ITimeSeriesPrognosisProblemData problemData, IEnumerable<int> rows) { 69 Symbolic TimeSeriesPrognosisInterpreterParameter.ExecutionContext = context;84 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = context; 70 85 EstimationLimitsParameter.ExecutionContext = context; 86 HorizonParameter.ExecutionContext = context; 71 87 72 double r2 = Calculate(Symbolic TimeSeriesPrognosisInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows);88 double r2 = Calculate(SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, tree, EstimationLimitsParameter.ActualValue.Lower, EstimationLimitsParameter.ActualValue.Upper, problemData, rows, HorizonParameter.ActualValue.Value); 73 89 74 SymbolicTimeSeriesPrognosisInterpreterParameter.ExecutionContext = null; 90 HorizonParameter.ExecutionContext = null; 91 SymbolicDataAnalysisTreeInterpreterParameter.ExecutionContext = null; 75 92 EstimationLimitsParameter.ExecutionContext = null; 76 93 -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveProblem.cs
r7100 r7120 31 31 [Creatable("Problems")] 32 32 public class SymbolicTimeSeriesPrognosisSingleObjectiveProblem : SymbolicDataAnalysisSingleObjectiveProblem<ITimeSeriesPrognosisProblemData, ISymbolicTimeSeriesPrognosisSingleObjectiveEvaluator, ISymbolicDataAnalysisSolutionCreator>, ITimeSeriesPrognosisProblem { 33 private const double PunishmentFactor = 10;34 33 private const int InitialMaximumTreeDepth = 8; 35 34 private const int InitialMaximumTreeLength = 25; -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SingleObjective/SymbolicTimeSeriesPrognosisSingleObjectiveTrainingBestSolutionAnalyzer.cs
r7100 r7120 20 20 #endregion 21 21 22 using System.Linq; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 34 35 [StorableClass] 35 36 public sealed class SymbolicTimeSeriesPrognosisSingleObjectiveTrainingBestSolutionAnalyzer : SymbolicDataAnalysisSingleObjectiveTrainingBestSolutionAnalyzer<ISymbolicTimeSeriesPrognosisSolution>, 36 ISymbolic TimeSeriesPrognosisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator {37 ISymbolicDataAnalysisInterpreterOperator, ISymbolicDataAnalysisBoundedOperator { 37 38 private const string ProblemDataParameterName = "ProblemData"; 38 private const string Symbolic TimeSeriesPrognosisInterpreterParameterName = "SymbolicTimeSeriesPrognosisInterpreter";39 private const string SymbolicDataAnalysisTreeInterpreterParameterName = "SymbolicDataAnalysisTreeInterpreter"; 39 40 private const string EstimationLimitsParameterName = "EstimationLimits"; 40 41 private const string ApplyLinearScalingParameterName = "ApplyLinearScaling"; … … 43 44 get { return (ILookupParameter<ITimeSeriesPrognosisProblemData>)Parameters[ProblemDataParameterName]; } 44 45 } 45 public ILookupParameter<ISymbolic TimeSeriesPrognosisInterpreter> SymbolicTimeSeriesPrognosisInterpreterParameter {46 get { return (ILookupParameter<ISymbolic TimeSeriesPrognosisInterpreter>)Parameters[SymbolicTimeSeriesPrognosisInterpreterParameterName]; }46 public ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter> SymbolicDataAnalysisTreeInterpreterParameter { 47 get { return (ILookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>)Parameters[SymbolicDataAnalysisTreeInterpreterParameterName]; } 47 48 } 48 49 public IValueLookupParameter<DoubleLimit> EstimationLimitsParameter { … … 66 67 : base() { 67 68 Parameters.Add(new LookupParameter<ITimeSeriesPrognosisProblemData>(ProblemDataParameterName, "The problem data for the symbolic regression solution.")); 68 Parameters.Add(new LookupParameter<ISymbolic TimeSeriesPrognosisInterpreter>(SymbolicTimeSeriesPrognosisInterpreterParameterName, "The symbolic time series prognosis interpreter for the symbolic expression tree."));69 Parameters.Add(new LookupParameter<ISymbolicDataAnalysisExpressionTreeInterpreter>(SymbolicDataAnalysisTreeInterpreterParameterName, "The symbolic time series prognosis interpreter for the symbolic expression tree.")); 69 70 Parameters.Add(new ValueLookupParameter<DoubleLimit>(EstimationLimitsParameterName, "The lower and upper limit for the estimated values produced by the symbolic regression model.")); 70 71 Parameters.Add(new ValueParameter<BoolValue>(ApplyLinearScalingParameterName, "Flag that indicates if the produced symbolic regression solution should be linearly scaled.", new BoolValue(true))); … … 75 76 76 77 protected override ISymbolicTimeSeriesPrognosisSolution CreateSolution(ISymbolicExpressionTree bestTree, double bestQuality) { 77 var model = new SymbolicTimeSeriesPrognosisModel((ISymbolicExpressionTree)bestTree.Clone(), Symbolic TimeSeriesPrognosisInterpreterParameter.ActualValue);78 var model = new SymbolicTimeSeriesPrognosisModel((ISymbolicExpressionTree)bestTree.Clone(), SymbolicDataAnalysisTreeInterpreterParameter.ActualValue, ProblemDataParameter.ActualValue.TargetVariables.ToArray()); 78 79 if (ApplyLinearScaling.Value) 79 80 SymbolicTimeSeriesPrognosisModel.Scale(model, ProblemDataParameter.ActualValue); -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SymbolicTimeSeriesPrognosisInterpreter.cs
r7100 r7120 33 33 [StorableClass] 34 34 [Item("SymbolicTimeSeriesPrognosisInterpreter", "Interpreter for symbolic expression trees including automatically defined functions.")] 35 public sealed class SymbolicTimeSeriesPrognosisInterpreter : ParameterizedNamedItem, ISymbolicTimeSeriesPrognosis Interpreter {35 public sealed class SymbolicTimeSeriesPrognosisInterpreter : ParameterizedNamedItem, ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter { 36 36 private const string CheckExpressionsWithIntervalArithmeticParameterName = "CheckExpressionsWithIntervalArithmetic"; 37 37 #region private classes -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic.TimeSeriesPrognosis/3.4/SymbolicTimeSeriesPrognosisModel.cs
r7100 r7120 21 21 22 22 using System.Collections.Generic; 23 using System.Drawing; 23 24 using System.Linq; 24 25 using HeuristicLab.Common; … … 33 34 [StorableClass] 34 35 [Item(Name = "Symbolic Time-Series Prognosis Model", Description = "Represents a symbolic time series prognosis model.")] 35 public class SymbolicTimeSeriesPrognosisModel : SymbolicDataAnalysisModel, ISymbolicTimeSeriesPrognosisModel {36 public new ISymbolicTimeSeriesPrognosisInterpreter Interpreter{37 get { return (ISymbolicTimeSeriesPrognosisInterpreter)base.Interpreter; }36 public class SymbolicTimeSeriesPrognosisModel : NamedItem, ISymbolicTimeSeriesPrognosisModel { 37 public override Image ItemImage { 38 get { return HeuristicLab.Common.Resources.VSImageLibrary.Function; } 38 39 } 40 41 #region properties 42 43 [Storable] 44 private ISymbolicExpressionTree symbolicExpressionTree; 45 public ISymbolicExpressionTree SymbolicExpressionTree { 46 get { return symbolicExpressionTree; } 47 } 48 49 [Storable] 50 private ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter interpreter; 51 public ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter Interpreter { 52 get { return interpreter; } 53 } 54 55 #endregion 56 57 [Storable] 58 private string[] targetVariables; 59 39 60 40 61 [StorableConstructor] … … 42 63 protected SymbolicTimeSeriesPrognosisModel(SymbolicTimeSeriesPrognosisModel original, Cloner cloner) 43 64 : base(original, cloner) { 65 this.symbolicExpressionTree = cloner.Clone(original.symbolicExpressionTree); 66 this.interpreter = cloner.Clone(original.interpreter); 44 67 } 45 public SymbolicTimeSeriesPrognosisModel(ISymbolicExpressionTree tree, ISymbolicTimeSeriesPrognosisInterpreter interpreter) 46 : base(tree, interpreter) { 68 public SymbolicTimeSeriesPrognosisModel(ISymbolicExpressionTree tree, ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter interpreter, IEnumerable<string> targetVariables) 69 : base() { 70 this.name = ItemName; 71 this.description = ItemDescription; 72 this.symbolicExpressionTree = tree; 73 this.interpreter = interpreter; this.targetVariables = targetVariables.ToArray(); 47 74 } 48 75 … … 52 79 53 80 public IEnumerable<IEnumerable<IEnumerable<double>>> GetPrognosedValues(Dataset dataset, IEnumerable<int> rows, int horizon) { 54 return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, rows, horizon);81 return Interpreter.GetSymbolicExpressionTreeValues(SymbolicExpressionTree, dataset, targetVariables, rows, horizon); 55 82 } 56 83 … … 68 95 int i = 0; 69 96 int horizon = 1; 70 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows, horizon)97 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, problemData.TargetVariables.ToArray(), rows, horizon) 71 98 .ToArray(); 72 99 foreach (var targetVariable in targetVariables) { -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/HeuristicLab.Problems.DataAnalysis.Symbolic-3.4.csproj
r7037 r7120 126 126 <Compile Include="Creators\SymbolicDataAnalysisExpressionRampedHalfAndHalfTreeCreator.cs" /> 127 127 <Compile Include="Creators\SymbolicDataAnalysisExpressionTreeCreator.cs" /> 128 <Compile Include="Interfaces\ISymbolicTimeSeriesPrognogisExpressionTreeInterpreter.cs" /> 128 129 <Compile Include="Plugin.cs" /> 129 130 <Compile Include="SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs" /> -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interfaces/ISymbolicDataAnalysisExpressionTreeInterpreter.cs
r5809 r7120 25 25 26 26 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 27 public interface ISymbolicDataAnalysisExpressionTreeInterpreter : I NamedItem{27 public interface ISymbolicDataAnalysisExpressionTreeInterpreter : ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter { 28 28 IEnumerable<double> GetSymbolicExpressionTreeValues(ISymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows); 29 29 } -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeILEmittingInterpreter.cs
r7077 r7120 222 222 } 223 223 } 224 public IEnumerable<IEnumerable<IEnumerable<double>>> GetSymbolicExpressionTreeValues(ISymbolicExpressionTree tree, Dataset dataset, string[] targetVariables, IEnumerable<int> rows, int horizon) { 225 throw new NotImplementedException(); 226 } 224 227 225 228 private void CompileInstructions(ILGenerator il, InterpreterState state, Dataset ds) { -
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeInterpreter.cs
r6860 r7120 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Linq; 24 25 using HeuristicLab.Common; 25 26 using HeuristicLab.Core; … … 32 33 [StorableClass] 33 34 [Item("SymbolicDataAnalysisExpressionTreeInterpreter", "Interpreter for symbolic expression trees including automatically defined functions.")] 34 public sealed class SymbolicDataAnalysisExpressionTreeInterpreter : ParameterizedNamedItem, ISymbolicDataAnalysisExpressionTreeInterpreter { 35 public sealed class SymbolicDataAnalysisExpressionTreeInterpreter : ParameterizedNamedItem, 36 ISymbolicDataAnalysisExpressionTreeInterpreter, ISymbolicTimeSeriesPrognosisExpressionTreeInterpreter { 35 37 private const string CheckExpressionsWithIntervalArithmeticParameterName = "CheckExpressionsWithIntervalArithmetic"; 36 38 #region private classes … … 199 201 200 202 public IEnumerable<double> GetSymbolicExpressionTreeValues(ISymbolicExpressionTree tree, Dataset dataset, IEnumerable<int> rows) { 203 return from prog in GetSymbolicExpressionTreeValues(tree, dataset, new string[] { "#NOTHING#" }, rows, 1) 204 select prog.First().First(); 205 } 206 207 // for each row for each target variable one prognosis (=enumerable of future values) 208 public IEnumerable<IEnumerable<IEnumerable<double>>> GetSymbolicExpressionTreeValues(ISymbolicExpressionTree tree, Dataset dataset, string[] targetVariables, IEnumerable<int> rows, int horizon) { 201 209 if (CheckExpressionsWithIntervalArithmetic.Value) 202 210 throw new NotSupportedException("Interval arithmetic is not yet supported in the symbolic data analysis interpreter."); … … 223 231 var state = new InterpreterState(code, necessaryArgStackSize); 224 232 233 int nComponents = tree.Root.GetSubtree(0).SubtreeCount; 234 // produce a n-step forecast for each target variable for all rows 235 var cachedPrognosedValues = new Dictionary<string, double[]>(); 236 foreach (var targetVariable in targetVariables) 237 cachedPrognosedValues[targetVariable] = new double[horizon]; 225 238 foreach (var rowEnum in rows) { 226 239 int row = rowEnum; 227 state.Reset(); 228 yield return Evaluate(dataset, ref row, state); 229 } 230 } 231 232 private double Evaluate(Dataset dataset, ref int row, InterpreterState state) { 240 List<double[]> vProgs = new List<double[]>(); 241 foreach (var horizonRow in Enumerable.Range(row, horizon)) { 242 int localRow = horizonRow; // create a local variable for the ref parameter 243 var vPrognosis = from i in Enumerable.Range(0, nComponents) 244 select Evaluate(dataset, ref localRow, row - 1, state, cachedPrognosedValues); 245 246 var vPrognosisArr = vPrognosis.ToArray(); 247 vProgs.Add(vPrognosisArr); 248 // set cachedValues for prognosis of future values 249 for (int i = 0; i < vPrognosisArr.Length; i++) 250 cachedPrognosedValues[targetVariables[i]][horizonRow - row] = vPrognosisArr[i]; 251 252 state.Reset(); 253 } 254 255 yield return from component in Enumerable.Range(0, nComponents) 256 select from prognosisStep in Enumerable.Range(0, vProgs.Count) 257 select vProgs[prognosisStep][component]; 258 } 259 } 260 261 private double Evaluate(Dataset dataset, ref int row, int lastObservedRow, InterpreterState state, Dictionary<string, double[]> cachedPrognosedValues) { 233 262 Instruction currentInstr = state.NextInstruction(); 234 263 switch (currentInstr.opCode) { 235 264 case OpCodes.Add: { 236 double s = Evaluate(dataset, ref row, state);237 for (int i = 1; i < currentInstr.nArguments; i++) { 238 s += Evaluate(dataset, ref row, state);265 double s = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 266 for (int i = 1; i < currentInstr.nArguments; i++) { 267 s += Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 239 268 } 240 269 return s; 241 270 } 242 271 case OpCodes.Sub: { 243 double s = Evaluate(dataset, ref row, state);244 for (int i = 1; i < currentInstr.nArguments; i++) { 245 s -= Evaluate(dataset, ref row, state);272 double s = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 273 for (int i = 1; i < currentInstr.nArguments; i++) { 274 s -= Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 246 275 } 247 276 if (currentInstr.nArguments == 1) s = -s; … … 249 278 } 250 279 case OpCodes.Mul: { 251 double p = Evaluate(dataset, ref row, state);252 for (int i = 1; i < currentInstr.nArguments; i++) { 253 p *= Evaluate(dataset, ref row, state);280 double p = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 281 for (int i = 1; i < currentInstr.nArguments; i++) { 282 p *= Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 254 283 } 255 284 return p; 256 285 } 257 286 case OpCodes.Div: { 258 double p = Evaluate(dataset, ref row, state);259 for (int i = 1; i < currentInstr.nArguments; i++) { 260 p /= Evaluate(dataset, ref row, state);287 double p = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 288 for (int i = 1; i < currentInstr.nArguments; i++) { 289 p /= Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 261 290 } 262 291 if (currentInstr.nArguments == 1) p = 1.0 / p; … … 264 293 } 265 294 case OpCodes.Average: { 266 double sum = Evaluate(dataset, ref row, state);267 for (int i = 1; i < currentInstr.nArguments; i++) { 268 sum += Evaluate(dataset, ref row, state);295 double sum = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 296 for (int i = 1; i < currentInstr.nArguments; i++) { 297 sum += Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 269 298 } 270 299 return sum / currentInstr.nArguments; 271 300 } 272 301 case OpCodes.Cos: { 273 return Math.Cos(Evaluate(dataset, ref row, state));302 return Math.Cos(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 274 303 } 275 304 case OpCodes.Sin: { 276 return Math.Sin(Evaluate(dataset, ref row, state));305 return Math.Sin(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 277 306 } 278 307 case OpCodes.Tan: { 279 return Math.Tan(Evaluate(dataset, ref row, state));308 return Math.Tan(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 280 309 } 281 310 case OpCodes.Power: { 282 double x = Evaluate(dataset, ref row, state);283 double y = Math.Round(Evaluate(dataset, ref row, state));311 double x = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 312 double y = Math.Round(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 284 313 return Math.Pow(x, y); 285 314 } 286 315 case OpCodes.Root: { 287 double x = Evaluate(dataset, ref row, state);288 double y = Math.Round(Evaluate(dataset, ref row, state));316 double x = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 317 double y = Math.Round(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 289 318 return Math.Pow(x, 1 / y); 290 319 } 291 320 case OpCodes.Exp: { 292 return Math.Exp(Evaluate(dataset, ref row, state));321 return Math.Exp(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 293 322 } 294 323 case OpCodes.Log: { 295 return Math.Log(Evaluate(dataset, ref row, state));324 return Math.Log(Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues)); 296 325 } 297 326 case OpCodes.IfThenElse: { 298 double condition = Evaluate(dataset, ref row, state);327 double condition = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 299 328 double result; 300 329 if (condition > 0.0) { 301 result = Evaluate(dataset, ref row, state); SkipInstructions(state);330 result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); SkipInstructions(state); 302 331 } else { 303 SkipInstructions(state); result = Evaluate(dataset, ref row, state);332 SkipInstructions(state); result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 304 333 } 305 334 return result; 306 335 } 307 336 case OpCodes.AND: { 308 double result = Evaluate(dataset, ref row, state);309 for (int i = 1; i < currentInstr.nArguments; i++) { 310 if (result > 0.0) result = Evaluate(dataset, ref row, state);337 double result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 338 for (int i = 1; i < currentInstr.nArguments; i++) { 339 if (result > 0.0) result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 311 340 else { 312 341 SkipInstructions(state); … … 316 345 } 317 346 case OpCodes.OR: { 318 double result = Evaluate(dataset, ref row, state);319 for (int i = 1; i < currentInstr.nArguments; i++) { 320 if (result <= 0.0) result = Evaluate(dataset, ref row, state);347 double result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 348 for (int i = 1; i < currentInstr.nArguments; i++) { 349 if (result <= 0.0) result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 321 350 else { 322 351 SkipInstructions(state); … … 326 355 } 327 356 case OpCodes.NOT: { 328 return Evaluate(dataset, ref row, state) > 0.0 ? -1.0 : 1.0;357 return Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues) > 0.0 ? -1.0 : 1.0; 329 358 } 330 359 case OpCodes.GT: { 331 double x = Evaluate(dataset, ref row, state);332 double y = Evaluate(dataset, ref row, state);360 double x = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 361 double y = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 333 362 if (x > y) return 1.0; 334 363 else return -1.0; 335 364 } 336 365 case OpCodes.LT: { 337 double x = Evaluate(dataset, ref row, state);338 double y = Evaluate(dataset, ref row, state);366 double x = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 367 double y = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 339 368 if (x < y) return 1.0; 340 369 else return -1.0; … … 343 372 var timeLagTreeNode = (LaggedTreeNode)currentInstr.dynamicNode; 344 373 row += timeLagTreeNode.Lag; 345 double result = Evaluate(dataset, ref row, state);374 double result = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 346 375 row -= timeLagTreeNode.Lag; 347 376 return result; … … 353 382 for (int i = 0; i < Math.Abs(timeLagTreeNode.Lag); i++) { 354 383 row += Math.Sign(timeLagTreeNode.Lag); 355 sum += Evaluate(dataset, ref row, state);384 sum += Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 356 385 state.ProgramCounter = savedPc; 357 386 } 358 387 row -= timeLagTreeNode.Lag; 359 sum += Evaluate(dataset, ref row, state);388 sum += Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 360 389 return sum; 361 390 } … … 367 396 case OpCodes.Derivative: { 368 397 int savedPc = state.ProgramCounter; 369 double f_0 = Evaluate(dataset, ref row, state); row--;398 double f_0 = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); row--; 370 399 state.ProgramCounter = savedPc; 371 double f_1 = Evaluate(dataset, ref row, state); row -= 2;400 double f_1 = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); row -= 2; 372 401 state.ProgramCounter = savedPc; 373 double f_3 = Evaluate(dataset, ref row, state); row--;402 double f_3 = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); row--; 374 403 state.ProgramCounter = savedPc; 375 double f_4 = Evaluate(dataset, ref row, state);404 double f_4 = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 376 405 row += 4; 377 406 … … 382 411 double[] argValues = new double[currentInstr.nArguments]; 383 412 for (int i = 0; i < currentInstr.nArguments; i++) { 384 argValues[i] = Evaluate(dataset, ref row, state);413 argValues[i] = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 385 414 } 386 415 // push on argument values on stack … … 392 421 state.ProgramCounter = (ushort)currentInstr.iArg0; 393 422 // evaluate the function 394 double v = Evaluate(dataset, ref row, state);423 double v = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 395 424 396 425 // delete the stack frame … … 408 437 return double.NaN; 409 438 var variableTreeNode = (VariableTreeNode)currentInstr.dynamicNode; 410 return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight; 439 if (row <= lastObservedRow || !cachedPrognosedValues.ContainsKey(variableTreeNode.VariableName)) return ((IList<double>)currentInstr.iArg0)[row] * variableTreeNode.Weight; 440 else return cachedPrognosedValues[variableTreeNode.VariableName][row - lastObservedRow - 1] * variableTreeNode.Weight; 411 441 } 412 442 case OpCodes.LagVariable: { … … 415 445 if (actualRow < 0 || actualRow >= dataset.Rows) 416 446 return double.NaN; 417 return ((IList<double>)currentInstr.iArg0)[actualRow] * laggedVariableTreeNode.Weight; 447 if (actualRow <= lastObservedRow || !cachedPrognosedValues.ContainsKey(laggedVariableTreeNode.VariableName)) return ((IList<double>)currentInstr.iArg0)[actualRow] * laggedVariableTreeNode.Weight; 448 else return cachedPrognosedValues[laggedVariableTreeNode.VariableName][actualRow - lastObservedRow - 1] * laggedVariableTreeNode.Weight; 418 449 } 419 450 case OpCodes.Constant: { … … 428 459 return double.NaN; 429 460 var variableConditionTreeNode = (VariableConditionTreeNode)currentInstr.dynamicNode; 430 double variableValue = ((IList<double>)currentInstr.iArg0)[row]; 461 double variableValue; 462 if (row <= lastObservedRow || !cachedPrognosedValues.ContainsKey(variableConditionTreeNode.VariableName)) 463 variableValue = ((IList<double>)currentInstr.iArg0)[row]; 464 else 465 variableValue = cachedPrognosedValues[variableConditionTreeNode.VariableName][row - lastObservedRow - 1]; 466 431 467 double x = variableValue - variableConditionTreeNode.Threshold; 432 468 double p = 1 / (1 + Math.Exp(-variableConditionTreeNode.Slope * x)); 433 469 434 double trueBranch = Evaluate(dataset, ref row, state);435 double falseBranch = Evaluate(dataset, ref row, state);470 double trueBranch = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 471 double falseBranch = Evaluate(dataset, ref row, lastObservedRow, state, cachedPrognosedValues); 436 472 437 473 return trueBranch * p + falseBranch * (1 - p);
Note: See TracChangeset
for help on using the changeset viewer.