Changeset 10489 for trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunctions/CovariancePeriodic.cs
- Timestamp:
- 02/20/14 17:45:06 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunctions/CovariancePeriodic.cs
r9456 r10489 46 46 } 47 47 48 private bool HasFixedScaleParameter { 49 get { return ScaleParameter.Value != null; } 50 } 51 private bool HasFixedInverseLengthParameter { 52 get { return InverseLengthParameter.Value != null; } 53 } 54 private bool HasFixedPeriodParameter { 55 get { return PeriodParameter.Value != null; } 56 } 57 48 58 49 59 [StorableConstructor] … … 68 78 69 79 public int GetNumberOfParameters(int numberOfVariables) { 70 return ( ScaleParameter.Value != null? 0 : 1) +71 ( PeriodParameter.Value != null? 0 : 1) +72 ( InverseLengthParameter.Value != null? 0 : 1);80 return (HasFixedScaleParameter ? 0 : 1) + 81 (HasFixedPeriodParameter ? 0 : 1) + 82 (HasFixedInverseLengthParameter ? 0 : 1); 73 83 } 74 84 … … 82 92 83 93 84 private void GetParameterValues(double[] 94 private void GetParameterValues(double[] 85 95 p, out double scale, out double period, out double inverseLength) { 86 96 // gather parameter values 87 97 int c = 0; 88 if ( InverseLengthParameter.Value != null) {98 if (HasFixedInverseLengthParameter) { 89 99 inverseLength = InverseLengthParameter.Value.Value; 90 100 } else { … … 92 102 c++; 93 103 } 94 if ( PeriodParameter.Value != null) {104 if (HasFixedPeriodParameter) { 95 105 period = PeriodParameter.Value.Value; 96 106 } else { … … 98 108 c++; 99 109 } 100 if ( ScaleParameter.Value != null) {110 if (HasFixedScaleParameter) { 101 111 scale = ScaleParameter.Value.Value; 102 112 } else { … … 110 120 double inverseLength, period, scale; 111 121 GetParameterValues(p, out scale, out period, out inverseLength); 122 var fixedInverseLength = HasFixedInverseLengthParameter; 123 var fixedPeriod = HasFixedPeriodParameter; 124 var fixedScale = HasFixedScaleParameter; 112 125 // create functions 113 126 var cov = new ParameterizedCovarianceFunction(); … … 128 141 return scale * Math.Exp(-2.0 * k); 129 142 }; 130 cov.CovarianceGradient = (x, i, j) => GetGradient(x, i, j, columnIndices, scale, period, inverseLength );143 cov.CovarianceGradient = (x, i, j) => GetGradient(x, i, j, columnIndices, scale, period, inverseLength, fixedInverseLength, fixedPeriod, fixedScale); 131 144 return cov; 132 145 } 133 146 134 147 135 private static IEnumerable<double> GetGradient(double[,] x, int i, int j, IEnumerable<int> columnIndices, double scale, double period, double inverseLength) { 148 private static IEnumerable<double> GetGradient(double[,] x, int i, int j, IEnumerable<int> columnIndices, double scale, double period, double inverseLength, 149 bool fixedInverseLength, bool fixedPeriod, bool fixedScale) { 136 150 double k = i == j ? 0.0 : Math.PI * GetDistance(x, x, i, j, columnIndices) / period; 137 151 double gradient = Math.Sin(k) * inverseLength; 138 152 gradient *= gradient; 139 yield return 4.0 * scale * Math.Exp(-2.0 * gradient) * gradient; 140 double r = Math.Sin(k) * inverseLength; 141 yield return 2.0 * k * scale * Math.Exp(-2 * r * r) *Math.Sin(2*k) * inverseLength * inverseLength; 142 yield return 2.0 * scale * Math.Exp(-2 * gradient); 153 if (!fixedInverseLength) yield return 4.0 * scale * Math.Exp(-2.0 * gradient) * gradient; 154 if (!fixedPeriod) { 155 double r = Math.Sin(k) * inverseLength; 156 yield return 2.0 * k * scale * Math.Exp(-2 * r * r) * Math.Sin(2 * k) * inverseLength * inverseLength; 157 } 158 if (!fixedScale) 159 yield return 2.0 * scale * Math.Exp(-2 * gradient); 143 160 144 161 }
Note: See TracChangeset
for help on using the changeset viewer.