Beispiel #1
0
        /// <summary>
        /// Return an positive factor instance with given low and high bounds. Author: Henry Lin.
        /// </summary>
        /// <param name="name">Name of the parameter</param>
        /// <param name="value">Initial value</param>
        /// <param name="doSearch">Whether search on this parameter or not</param>
        /// <returns>An instance whose search is on the log space</returns>
        static public OptimizationParameter GetPositiveFactorInstance(string name, double value, bool doSearch, double low, double high)
        {
            OptimizationParameter parameter = GetPositiveFactorInstance(name, value, doSearch);

            parameter.Low = low; parameter.High = high;
            return(parameter);
        }
Beispiel #2
0
        static public OptimizationParameter GetUntransformedInstance(string name, double value, bool doSearch, double low, double high)
        {
            OptimizationParameter parameter = new OptimizationParameter();

            parameter.Name     = name;
            parameter.Value    = value;
            parameter.DoSearch = doSearch;
            parameter.ConvertToUntransformedInstance(low, high);

            return(parameter);
        }
Beispiel #3
0
        static public OptimizationParameter GetTanInstance(string name, double value, bool doSearch, double low, double high)
        {
            OptimizationParameter parameter = new OptimizationParameter();

            parameter.Name     = name;
            parameter.Value    = value;
            parameter.DoSearch = doSearch;
            //parameter.LowForSearch = parameter.TransformForSearch(parameter.Low);
            //parameter.HighForSearch = parameter.TransformForSearch(parameter.High);
            parameter.ConvertToTanInstance(low, high);

            return(parameter);
        }
Beispiel #4
0
        public OptimizationParameter Clone()
        {
            OptimizationParameter parameter = new OptimizationParameter();

            parameter.TransformForSearch  = TransformForSearch;
            parameter.TransformFromSearch = TransformFromSearch;
            parameter.Name     = Name;
            parameter.Value    = Value;
            parameter.DoSearch = DoSearch;
            parameter.Low      = Low;
            parameter.High     = High;

            return(parameter);
        }
Beispiel #5
0
        static public OptimizationParameter GetPositiveFactorInstance(string name, double value, bool doSearch)
        {
            OptimizationParameter parameter = new OptimizationParameter();

            //parameter.TransformForSearch = delegate(double r) { return Math.Log(r); };
            //parameter.TransformFromSearch = delegate(double r) { return Math.Exp(r); };
            //parameter.Low = 1.0 / 1000.0;
            //parameter.High = 1000;
            //parameter.LowForSearch = parameter.TransformForSearch(parameter.Low);
            //parameter.HighForSearch = parameter.TransformForSearch(parameter.High);

            parameter.Name     = name;
            parameter.Value    = value;
            parameter.DoSearch = doSearch;
            parameter.ConvertToPositiveFactorInstance();

            return(parameter);
        }
Beispiel #6
0
        static public OptimizationParameter GetProbabilityInstance(string name, double value, bool doSearch)
        {
            OptimizationParameter parameter = new OptimizationParameter();

            //parameter.TransformForSearch = SpecialFunctions.LogOdds;
            //parameter.TransformFromSearch = SpecialFunctions.Probability;
            //parameter.Low = .001;
            //parameter.High = .999;
            //parameter.LowForSearch = parameter.TransformForSearch(parameter.Low);
            //parameter.HighForSearch = parameter.TransformForSearch(parameter.High);

            parameter.Name     = name;
            parameter.Value    = value;
            parameter.DoSearch = doSearch;

            parameter.ConvertToProbabilityInstance();

            return(parameter);
        }
Beispiel #7
0
        override public double Run(Converter <OptimizationParameter, double> oneDRealFunction,
                                   /*ref*/ OptimizationParameter param)
        {
            try
            {
                return(Brent.Run(oneDRealFunction, param));
                //return Brent.Run(oneDRealFunction, param, gridLineCount, out bestInput);
            }
            catch (Exception exception)
            {
                Console.WriteLine("Error calling Brent");
                Console.WriteLine(exception.Message);
                if (exception.InnerException != null)
                {
                    Console.WriteLine(exception.InnerException.Message);
                }
            }

            return(Grid.Run(oneDRealFunction, param));
        }
Beispiel #8
0
        override public double Run(Converter <OptimizationParameter, double> oneDRealFunction,
                                   OptimizationParameter param)
        {
            double low  = param.LowForSearch;
            double high = param.HighForSearch;
            Converter <double, double> oneDRealFunctionInDoubleSpace = delegate(double d)
            {
                param.ValueForSearch = d;
                return(oneDRealFunction(param));
            };

            double initParamValue = param.ValueForSearch;
            BestSoFar <double, double> bestFound = OneDOptimizationX(oneDRealFunctionInDoubleSpace, low, high, GridLineCount, Tolerance);

            bestFound.Compare(oneDRealFunctionInDoubleSpace(initParamValue), initParamValue); // make sure we didn't get any worse

            //bestInput = bestFound.Champ;
            param.ValueForSearch = bestFound.Champ;
            return(bestFound.ChampsScore);
        }
Beispiel #9
0
 /// <summary>
 /// Runs maximization for f(x) and returns the best f(x). The corresponding argmax x is in the paramToOptimize.
 /// </summary>
 abstract public double Run(Converter <OptimizationParameter, double> oneDRealFunction, OptimizationParameter paramToOptimize);
Beispiel #10
0
        /// <summary>
        /// Runs brent's method as a MAXIMIZATION procedure (I think).
        /// </summary>
        /// <param name="oneDRealFunction"></param>
        /// <param name="param"></param>
        /// <param name="gridLineCount"></param>
        /// <returns></returns>
        override public double Run(Converter <OptimizationParameter, double> oneDRealFunction, /*ref*/ OptimizationParameter param)
        {
            ++DebugCount;

            double outputTol = .00000001;

            Converter <double, double> oneDRealFunctionInDoubleSpace = delegate(double d)
            {
                Debug.Assert(!double.IsNaN(d));
                param.ValueForSearch = d;
                try
                {
                    double odrf = oneDRealFunction(param);
                    if (double.IsNaN(odrf))
                    {
                        return(double.PositiveInfinity);
                    }
                    //Debug.Assert(!double.IsNegativeInfinity(odrf)); //!!!for debugging
                    return(-odrf);
                }
                catch (Exception exception)
                {
                    Console.WriteLine("Exception turned to NaN in OneDOptimizationBrent");
                    Console.WriteLine(exception.Message);
                    if (exception.InnerException != null)
                    {
                        Console.WriteLine(exception.InnerException.Message);
                    }
                    return(double.NaN);
                }
            };

            double a = param.LowForSearch;
            double b = param.ValueForSearch;

            Debug.WriteLine(Helper.CreateTabString(DebugCount, "Get a and b from param\n", "", "a", a, "\n", "", "b", b, "\n"));

            double c;

            // !! why would we not want to always base our starting off low and high, rather than arbitrarily basing high of starting and low??
            // !! hm, note that changing it so this always goes in does some weird things to TreeBuilding regression tests. Maybe I'm missing something... JC
            if (a > b || Math.Abs(a - b) < Tolerance || double.IsInfinity(b))
            {
                c = param.HighForSearch;
                b = a + GoldenRatio * (c - a);
                Debug.WriteLine(Helper.CreateTabString(DebugCount, "if (a > b || Math.Abs(a - b) < inputTol || double.IsInfinity(b)){c = param.HighForSearch;b = a + goldenRatio * (c - a);}\n", "", "a", a, "\n", "", "b", b, "\n", "", "c", c, "\n"));
            }
            else
            {
                Debug.Assert(a <b && Math.Abs(a - b)> Tolerance);   // real assert
                c = b + InvGold * (b - a);
                Debug.WriteLine(Helper.CreateTabString(DebugCount, "NOT if (a > b || Math.Abs(a - b) < inputTol || double.IsInfinity(b)){c = b + invGold * (b - a);}", "a", a, "", "\n", "", "b", b, "", "\n", "", "c", c, "", "\n"));
            }


            double fOfA;
            double fOfB;
            double fOfC;
            double bestInput;

            if (FindBracketWithInfinities(ref a, ref b, ref c, oneDRealFunctionInDoubleSpace, Tolerance, outputTol, out bestInput, out fOfA, out fOfB, out fOfC, DebugCount))
            {
                param.ValueForSearch = bestInput;
                return(-fOfB);
            }


            Debug.WriteLine(Helper.CreateTabString(DebugCount, "About to enter Brent\n", "", "a", a, fOfA, "\n", "", "b", b, fOfB, "\n", "", "c", c, fOfC, "\n"));
            Helper.CheckCondition(fOfB < fOfA && fOfB < fOfC, string.Format("About to enter Brent, but prediction, f(b)<f(a) && f(b) < f(c), has failed"));
            FuncMin.FuncMinBrent(a, ref b, c, fOfA, ref fOfB, fOfC, Tolerance, oneDRealFunctionInDoubleSpace);
            Debug.WriteLine(Helper.CreateTabString(DebugCount, "After Brent\n", "", "a", a, fOfA, "\n", "", "b", b, fOfB, "\n", "", "c", c, fOfC, "\n"));
            bestInput            = b;
            param.ValueForSearch = bestInput;

            return(-fOfB);
        }
Beispiel #11
0
 /// <summary>
 /// Checks equals based off having identical fields for Name, DoSearch, Value, High, Low and the corresponding values under transformation.
 /// Name check is case sensitive.
 /// </summary>
 public bool Equals(OptimizationParameter param)
 {
     return(this.Name.Equals(param.Name) && this.Value == param.Value && this.High == param.High && this.Low == param.Low && this.DoSearch == param.DoSearch &&
            this.HighForSearch == param.HighForSearch && this.LowForSearch == param.LowForSearch && this.ValueForSearch == param.ValueForSearch); // not guaranteed to check that transformation is the same, but awefully close.
 }