/// <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); }
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); }
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); }
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); }
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); }
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); }