Changeset 17203
 Timestamp:
 08/13/19 09:28:45 (5 years ago)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

branches/2994AutoDiffForIntervals/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Interpreter/Interpreter.cs
r17200 r17203 940 940 941 941 public AlgebraicInterval AssignSin(AlgebraicInterval a) { 942 if (Math.Abs(a.UpperBound.Value.Value  a.LowerBound.Value.Value) >= Math.PI * 2) { 943 low = new MultivariateDual<AlgebraicDouble>(1.0); 942 var lower = a.LowerBound.Value.Value; 943 var size = a.UpperBound.Value.Value  lower; 944 if (size < 0) throw new InvalidProgramException(); // ASSERT interval >= 0; 945 946 if (size >= Math.PI * 2) { 947 low = new MultivariateDual<AlgebraicDouble>(1.0); // zero gradient 944 948 high = new MultivariateDual<AlgebraicDouble>(1.0); 945 949 } 946 950 947 // divide the interval by PI/2 so that the optima lie at x element of N (0,1,2,3,4,...)948 double Pihalf = Math.PI / 2;949 var scaled = a.Clone().Scale(1.0 / Pihalf);950 //move to positive scale 951 if (scaled.LowerBound.Value.Value < 0) {952 int periodsToMove = Math.Abs((int)scaled.LowerBound.Value.Value / 4) + 1; 953 scaled.Add(new AlgebraicInterval(periodsToMove * 4, periodsToMove * 4));954 }955 956 double scaledLowerBound = scaled.LowerBound.Value.Value % 4.0;957 double scaledUpperBound = scaled.UpperBound.Value.Value % 4.0;958 if (scaledUpperBound < scaledLowerBound) scaledUpperBound += 4.0;959 List<double> sinValues = new List<double>();960 sinValues.Add(Math.Sin(scaledLowerBound * Pihalf)); 961 sinValues.Add(Math.Sin(scaledUpperBound * Pihalf));962 963 int startValue = (int)Math.Ceiling(scaledLowerBound);964 while (startValue < scaledUpperBound) {965 sinValues.Add(Math.Sin(startValue * Pihalf));966 startValue += 1; 967 }968 969 low = new MultivariateDual<AlgebraicDouble>(sinValues.Min()); // TODO, XXX FIX CALCULATION TO SUPPORT GRADIENTS!970 high = new MultivariateDual<AlgebraicDouble>(sinValues.Max());951 // assume low and high are in the same quadrant 952 low = Algebraic.Min(a.LowerBound.Clone().Sin(), a.UpperBound.Clone().Sin()); 953 high = Algebraic.Max(a.LowerBound.Clone().Sin(), a.UpperBound.Clone().Sin()); 954 955 // override min and max if necessary 956 957 // shift interval 'a' into the range [2pi .. 2pi] without changing the size of the interval to simplify the checks 958 lower = lower % (2 * Math.PI); // lower in [2pi .. 2pi] 959 960 // handle min = 1 and max = 1 cases explicitly 961 var pi_2 = Math.PI / 2.0; 962 var maxima = new double[] { 3 * pi_2, pi_2 }; 963 var minima = new double[] { pi_2, 3 * pi_2 }; 964 965 // override min and max if necessary 966 if (maxima.Any(m => lower < m && lower + size > m)) { 967 // max = 1 968 high = new MultivariateDual<AlgebraicDouble>(1.0); // zero gradient 969 } 970 971 if (minima.Any(m => lower < m && lower + size > m)) { 972 // min = 1; 973 low = new MultivariateDual<AlgebraicDouble>(1.0); // zero gradient 974 } 971 975 return this; 972 976 }
Note: See TracChangeset
for help on using the changeset viewer.