Beispiel #1
0
        /// <summary>
        /// Checks that the enumeration order is the same and that each parameter is equal according to OptimizationParameter.Equals(OptimizationParameter).
        /// </summary>
        public bool Equals(OptimizationParameterList list, bool ignoreEnumerationOrder = false)
        {
            if (list == null)
            {
                return(false);
            }
            if (Count != list.Count)
            {
                return(false);
            }
            if (!ignoreEnumerationOrder)
            {
                if ((this._enumerationOrder == null) != (list._enumerationOrder == null))
                {
                    return(false);
                }
                if (!_enumerationOrder.SequenceEqual(list._enumerationOrder))
                {
                    return(false);
                }
            }
            for (int i = 0; i < _asParameterList.Count; i++)
            {
                if (!_asParameterList[i].Equals(list._asParameterList[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #2
0
        public OptimizationParameterList Clone()
        {
            List <OptimizationParameter> parameterCollection = new List <OptimizationParameter>();

            foreach (OptimizationParameter parameter in _asParameterList)
            {
                parameterCollection.Add(parameter.Clone());
            }
            OptimizationParameterList result = GetInstance2(parameterCollection);

            if (_enumerationOrder != null)
            {
                result.SetEnumerationOrder(_enumerationOrder);
            }
            return(result);
        }
Beispiel #3
0
        public bool IsClose(OptimizationParameterList other, double eps)
        {
            if (other == null)
            {
                return(false);
            }

            Helper.CheckCondition(other.Count == Count);

            for (int iParam = 0; iParam < Count; ++iParam)
            {
                if (!IsClose(_asParameterList[iParam], other._asParameterList[iParam], eps))
                {
                    return(false);
                }
            }
            return(true);
        }
Beispiel #4
0
        public void ReadXml(System.Xml.XmlReader reader)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(OptimizationParameter[]));

            reader.ReadStartElement("Parameters");
            reader.ReadStartElement("AsParameterList");
            OptimizationParameter[]   asParameterList = (OptimizationParameter[])serializer.Deserialize(reader);
            OptimizationParameterList list            = OptimizationParameterList.GetInstance(asParameterList);

            reader.ReadEndElement();
            reader.ReadStartElement("EnumerationOrder");
            serializer = new XmlSerializer(typeof(int[]));
            int[] enumerationOrder = (int[])serializer.Deserialize(reader);
            reader.ReadEndElement();
            reader.ReadEndElement();
            list.SetEnumerationOrder(enumerationOrder);
            this._asDictionary    = list._asDictionary;
            this._asParameterList = list._asParameterList;
            this._asDictionary    = list._asDictionary;
            this.SetEnumerationOrder(enumerationOrder);
        }
Beispiel #5
0
        public static OptimizationParameterList GetInstance2(IEnumerable <OptimizationParameter> parameterCollection)
        {
            OptimizationParameterList aParamsList = new OptimizationParameterList();

            parameterCollection.ForEach(p => aParamsList.Add(p, false));
            //foreach (OptimizationParameter parameter in parameterCollection)
            //{
            //    aParamsList._asDictionary.Add(parameter.Name, parameter);
            //    aParamsList._asParameterList.Add(parameter);
            //}

            // no longer requires sort.
            ////Must do this after because the parameters may get re-ordered.
            //aQmrrParams._asParameterArray = new OptimizationParameter[aQmrrParams._asSortedDictionary.Count];
            //int iParam = -1;
            //foreach (OptimizationParameter parameter in aQmrrParams._asSortedDictionary.Values)
            //{
            //    ++iParam;
            //    aQmrrParams._asParameterArray[iParam] = parameter;
            //}

            return(aParamsList);
        }
Beispiel #6
0
        public double Optimize(Converter <OptimizationParameterList, double> functionToOptimize, OptimizationParameterList paramList)
        {
            double eps = 1e-9;

            List <double> pointList = paramList.ExtractParameterValueListForSearch();
            List <double> lowList   = paramList.ExtractParameterLowListForSearch();
            List <double> highList  = paramList.ExtractParameterHighListForSearch();

            double oldScore = double.NaN;
            //double tempOldScore = functionToOptimize(paramList);


            //Console.WriteLine("Original score: {0}", tempOldScore);
            //Console.WriteLine(tempOldScore);
            Dictionary <int, double> paramNumberToInitValue = new Dictionary <int, double>();
            bool gridConverged = false;

            for (int iterationOverParameters = 0; iterationOverParameters < NIterOverParams; ++iterationOverParameters)
            {
                double newScore = double.NaN;
                int    doSearchParameterCount = 0;
                foreach (OptimizationParameter paramToOptimize in paramList)
                {
                    //if (paramList.DoSearch(iParameter))
                    if (paramToOptimize.DoSearch)
                    {
                        ++doSearchParameterCount;

                        //double initValue = SpecialFunctions.GetValueOrDefault(paramNumberToInitValue, doSearchParameterCount, paramToOptimize.Value);
                        Debug.WriteLine("Search Param " + doSearchParameterCount.ToString());

                        //double bestInput;
                        newScore = OneDOptimization.Run(
                            delegate(OptimizationParameter param)
                        {
                            if (!double.IsNaN(param.Value) && paramList.SatisfiesConditions())
                            {
                                return(functionToOptimize(paramList));
                            }
                            else
                            {
                                return(double.NaN);
                            }
                        },
                            /*ref*/ paramToOptimize);
                        // /*ref*/ paramToOptimize, _gridLineCount, out bestInput);

                        Debug.WriteLine("bestInput " + paramToOptimize.ValueForSearch.ToString());

                        //paramToOptimize.ValueForSearch = bestInput;

                        //Debug.WriteLine("END ITER:" + Helper.StringJoin(point) + Helper.CreateTabString("", newScore));
                    }
                }
                if ((!double.IsNaN(oldScore) && Math.Abs(oldScore - newScore) < eps) ||
                    doSearchParameterCount < 2)    //If only 0 or 1 searchable params, then one pass is enough
                {
                    oldScore      = newScore;
                    gridConverged = true;
                    break;
                }
                oldScore = newScore;
            }

            if (!gridConverged)
            {
                //Console.WriteLine("WARNING: Grid failed to converge after {0} iterations.", _numberOfIterationsOverParameters);
            }

            return(oldScore);
        }