Changeset 15884 for branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs
- Timestamp:
- 04/04/18 17:18:02 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2906_Transformations/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/DataAnalysisTransformationModel.cs
r15880 r15884 35 35 public IDataAnalysisModel OriginalModel { get; protected set; } 36 36 37 IEnumerable<IDataAnalysisTransformation> IDataAnalysisTransformationModel.InputTransformations { 38 get { return InputTransformations; } 39 } 40 37 41 [Storable] 38 42 public ReadOnlyItemList<IDataAnalysisTransformation> InputTransformations { get; protected set; } … … 55 59 56 60 public override IEnumerable<string> VariablesUsedForPrediction { 57 get { return OriginalModel.VariablesUsedForPrediction; /* TODO: reduce extend-inputs */}61 get { return DataAnalysisTransformation.ReduceVariables(OriginalModel.VariablesUsedForPrediction, InputTransformations); } 58 62 } 59 63 60 64 #region Constructor, Cloning & Persistence 61 65 protected DataAnalysisTransformationModel(IDataAnalysisModel originalModel, IEnumerable<IDataAnalysisTransformation> transformations) 62 : base( originalModel.Name) {66 : base("Transformation Model " + originalModel.Name) { 63 67 OriginalModel = originalModel; 64 var transitiveInputs = CalculateTransitiveVariables(originalModel.VariablesUsedForPrediction, transformations);68 var transitiveInputs = DataAnalysisTransformation.GetTransitiveVariables(originalModel.VariablesUsedForPrediction, transformations, inverse: true); 65 69 InputTransformations = new ItemList<IDataAnalysisTransformation>(transformations.Where(t => transitiveInputs.Contains(t.OriginalVariable))).AsReadOnly(); 66 70 TargetTransformations = new ReadOnlyItemList<IDataAnalysisTransformation>(); … … 80 84 #endregion 81 85 82 // extended -> include originals83 public static ISet<string> CalculateTransitiveVariables(IEnumerable<string> inputVariables, IEnumerable<IDataAnalysisTransformation> transformations) {84 var transitiveInputs = new HashSet<string>(inputVariables);85 86 foreach (var transformation in transformations.Reverse()) {87 if (transitiveInputs.Contains(transformation.TransformedVariable)) {88 transitiveInputs.Add(transformation.OriginalVariable);89 }90 }91 92 return transitiveInputs;93 }94 // originals => include extended95 public static IEnumerable<string> ExtendInputVariables(IEnumerable<string> oldInputVariables, IEnumerable<IDataAnalysisTransformation> transformations) {96 var inputs = new HashSet<string>(oldInputVariables);97 98 foreach (var transformation in transformations) {99 if (inputs.Contains(transformation.OriginalVariable))100 inputs.Add(transformation.TransformedVariable);101 }102 103 return inputs;104 }105 [Obsolete]106 public static IEnumerable<string> RemoveVirtualVariables(IEnumerable<string> variables, IEnumerable<IDataAnalysisTransformation> transformations) {107 var remainingVariables = new HashSet<string>(variables);108 109 var transformationsStack = new Stack<IDataAnalysisTransformation>(transformations);110 111 while (transformationsStack.Any()) {112 var transformation = transformationsStack.Pop();113 114 115 bool transformedVariablePending = transformationsStack.Any(x => x.OriginalVariable == transformation.TransformedVariable);116 if (!transformedVariablePending)117 remainingVariables.Remove(transformation.TransformedVariable);118 }119 120 return remainingVariables;121 }122 123 public static IDataset Transform(IDataset dataset, IEnumerable<IDataAnalysisTransformation> transformations) {124 var modifiableDataset = ((Dataset)dataset).ToModifiable();125 126 foreach (var transformation in transformations) {127 var trans = (ITransformation<double>)transformation.Transformation;128 129 var originalData = modifiableDataset.GetDoubleValues(transformation.OriginalVariable);130 if (!trans.Check(originalData, out string errorMessage))131 throw new InvalidOperationException($"Cannot estimate Values, Transformation is invalid: {errorMessage}");132 133 var transformedData = trans.Apply(originalData).ToList();134 if (modifiableDataset.VariableNames.Contains(transformation.TransformedVariable))135 modifiableDataset.ReplaceVariable(transformation.TransformedVariable, transformedData);136 else137 modifiableDataset.AddVariable(transformation.TransformedVariable, transformedData);138 }139 140 return modifiableDataset;141 }142 143 86 #region Events 144 87 public event EventHandler TargetVariableChanged;
Note: See TracChangeset
for help on using the changeset viewer.