using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AForge; using System.Drawing; using System.Text.RegularExpressions; using AForge.Genetic; //using NPOI.SS.Formula.Eval; using System.Runtime.Serialization; using Newtonsoft.Json; using System.Collections.Concurrent; using Dapper; using NPOI.SS.Formula.Functions; //using NPOI.Util.Collections; namespace Hydro.CommonBase { [Serializable] public class GeneticParams { static int Count = 0; public GeneticParams(int Level) { this.Level = Level; this.ID = Count; Count++; } public void Init(string ConfigPath) { if (Db == null) Db = new Db(); if (!string.IsNullOrEmpty(ConfigPath)) Db.Init(ConfigPath); if (Quene!=null) Quene.Dispose(); Quene = new Quene(); this.Quene= Quene; //»ñȡȫ¾ÖĬÈÏÉèÖà var globalConfig = Db.Connection.QueryFirstOrDefault("SELECT FValue FROM MyConfig WHERE FKey='GlobalConfig'"); GlobalConfig = JsonConvert.DeserializeObject(globalConfig) ?? new GlobalConfig(); this.GlobalConfig = GlobalConfig; isInited = true; //return gParam; } public void Dispose() { onReportProgress = null; Db.Close(); Db = null; } public List list_BestEnerge; public List list_AvgHz; public List ranges; public List DLengths; public List accuracys; public List Dependencies; public double[] list_AtemtpArr; public string SolutionSaveName; public int populationSize; public int iterations; public int populationSize_full; public int iterations_full; public List Upopulations = null; public int selectionMethod; public int optimizationMode; public bool Ç¿ÖÆÖØ¼ÆËã; public int iterations_min; public double accuracyNum; //public int MultiTimes=0; public int MaxRobot; public int RuningRobot; public int num; public double BestOptValue; public DRange tolerance; public FinishEvent onFinished; public FinishEvent onError; public FinishEvent onReportProgress; public SetEvent setVars; public Db Db; public dynamic SolutionDBHelper = null; public GlobalConfig GlobalConfig; public bool isInited=false; public Quene Quene; public int Level; public int ID; public bool isNeedOutput = true; public double CurrentTotalDemand = -1; public GeneticParams DeepCopy() { var copy = new GeneticParams(this.Level); copy.list_BestEnerge = this.list_BestEnerge?.ToList(); copy.list_AvgHz = this.list_AvgHz?.ToList(); copy.ranges = this.ranges?.Select(range => new DRange(range.Min, range.Max))?.ToList(); copy.DLengths = this.DLengths?.ToList(); copy.accuracys = this.accuracys?.ToList(); copy.Dependencies = this.Dependencies?.ToList(); copy.list_AtemtpArr = this.list_AtemtpArr?.ToArray(); copy.SolutionSaveName = this.SolutionSaveName; copy.populationSize = this.populationSize; copy.iterations = this.iterations; copy.populationSize_full = this.populationSize_full; copy.iterations_full = this.iterations_full; copy.Upopulations = this.Upopulations?.ToList(); copy.selectionMethod = this.selectionMethod; copy.optimizationMode = this.optimizationMode; copy.Ç¿ÖÆÖØ¼ÆËã = this.Ç¿ÖÆÖØ¼ÆËã; copy.iterations_min = this.iterations_min; copy.accuracyNum = this.accuracyNum; copy.MaxRobot = this.MaxRobot; copy.RuningRobot = this.RuningRobot; copy.num = this.num; copy.BestOptValue = this.BestOptValue; copy.tolerance = tolerance==null?null: new DRange(this.tolerance.Min, this.tolerance.Max); copy.onFinished = this.onFinished; copy.onError = this.onError; copy.onReportProgress = this.onReportProgress; copy.setVars = this.setVars; copy.Db = this.Db; // Assuming Db is a reference type copy.SolutionDBHelper = this.SolutionDBHelper; // Assuming SolutionDBHelper is a reference type copy.GlobalConfig = this.GlobalConfig.DeepCopyByBin(); // Assuming GlobalConfig has a copy constructor copy.isInited = this.isInited; copy.Quene = this.Quene; // Assuming Quene has a copy constructor copy.ID = this.ID; copy.isNeedOutput = this.isNeedOutput; copy.CurrentTotalDemand = this.CurrentTotalDemand; return copy; } } public class Result { public double[] arrayTryValue = null; public float Demand; public double ObjFunctionValue; public int it_Times = 0; public dict unitNum = null; } public class uvalue { public uvalue(int UID, double value) { this.UID = UID; this.value = value; } public int UID; public double value; } public class Quene { public System.Collections.Generic.Queue RequestQueues; public HashSet RequestFinished; public Dictionary ResultHash; public int Level; public Dictionary ResultDictionary; public Dictionary ResultChrome; public int MissionQueneCount; public List MissionQuene; public DateTime ScadaTime; //public List TimePoints; public double BestResult=double.MaxValue; public void Dispose() { if (RequestQueues != null) { RequestQueues.Clear(); RequestQueues = null; } if (RequestFinished != null) { RequestFinished.Clear(); RequestFinished = null; } if (ResultHash != null) { ResultHash.Clear(); ResultHash = null; } if (ResultDictionary != null) { ResultDictionary.Clear(); ResultDictionary = null; } if (ResultChrome != null) { ResultChrome.Clear(); ResultChrome = null; } if (MissionQuene != null) { MissionQuene.Clear(); MissionQuene = null; } } } [Serializable] public class UvalueSetting { public UvalueSetting(long uID, double min, double max) { this.ID = uID; Min = min; Max = max; } public double Min; public double Max; public long ID; } public class USetting { public string Name; public int ID; public List VSet; public List UList; public float TotalDemand; } public class vSet { public string Name; public string Tag; public bool isNode=true; public List IDs; public int ID; public string defaultExpress; public string IndicatorType; public string ObjectType; } public class WdnmoParam { public List results; public double DistriDemand; public List VarSets_Import = new List(); public List Vars_Import = new List(); public Guid ID; public List ScadaPoints { get; set; } = new List(); public List ConfigPoints { get; set; } = new List(); public List ResultPoints { get; set; } = new List(); [JsonIgnore] public Dictionary dict_ScadaPoints = null; [JsonIgnore] public Dictionary dict_ConfigPoints = null; [JsonIgnore] public Dictionary dict_ResultPoints = null; [JsonIgnore] public Dictionary dict_ScadaPointsPattern = null; public Dictionary dict_ConfigPointsPattern = null; public Dictionary dict_ResultPointsPattern = null; public bool isBuildDict = false; public void buildDict() { dict_ScadaPoints=new Dictionary(); dict_ScadaPointsPattern = new Dictionary(); ScadaPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ScadaPoints.ContainsKey(vv.Key)) { dict_ScadaPoints.Add(vv.Key, vv.Value); if (vv.Pattern!=null) { dict_ScadaPointsPattern.Add(vv.Key, vv.Pattern); } } }); dict_ConfigPoints = new Dictionary(); dict_ConfigPointsPattern = new Dictionary(); ConfigPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ConfigPoints.ContainsKey(vv.Key)) { dict_ConfigPoints.Add(vv.Key, vv.Value); if (vv.Pattern != null) { dict_ConfigPointsPattern.Add(vv.Key, vv.Pattern); } } }); dict_ResultPoints = new Dictionary(); dict_ResultPointsPattern = new Dictionary(); ResultPoints.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Key) && !dict_ResultPoints.ContainsKey(vv.Key)) { dict_ResultPoints.Add(vv.Key, vv.Value); if (vv.Pattern != null) { dict_ResultPointsPattern.Add(vv.Key, vv.Pattern); } } }); isBuildDict = true; } public double Fitness = -1; public DateTime time { get; set; } = default(DateTime); //public int RunTimes = 0; public int Period { get; set; } = 0; public string ErrorMessage { get; set; } = null; public bool fullSearchMode = false; public FinishEvent onFinish; public bool isNeedOutPut = false; public Dictionary ToSearchDict() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, new double[] { point.Value - point.SearchRange / 2, point.Value + point.SearchRange / 2 }); else dict[point.Key] = new double[] { point.Value - point.SearchRange / 2, point.Value + point.SearchRange / 2 }; } if (!dict.ContainsKey("period")) dict.Add("period", new double[] { Period - 8, Period + 8 }); else dict["period"] = new double[] { Period - 8, Period + 8 }; return dict; } //public ulong Toulong(string childSaveName) //{ //} public string ToSearchSring() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, point.Value); else dict[point.Key] = point.Value; } if (!dict.ContainsKey("period")) dict.Add("period", Period); StringBuilder sb = new StringBuilder(); foreach (var point in dict) { sb.AppendLine(point.Key + "\t" + point.Value); } return sb.ToString(); } public Dictionary ToResultDict() { Dictionary dict = new Dictionary(); foreach (var point in ScadaPoints) { if (!dict.ContainsKey(point.Key)) dict.Add(point.Key, point.Value); else dict[point.Key] = point.Value; } if (!dict.ContainsKey("period")) dict.Add("period", Period); else dict["period"] = Period; foreach (var point in ResultPoints) { if (!point.isNeedtoSave) continue; if (!CheckExpandoVariableName(point.SaveKey)) continue; if (!dict.ContainsKey(point.SaveKey)) { dict.Add(point.SaveKey, point.Value); } else dict[point.SaveKey] = point.Value; } return dict; // ÖØÔØ == ÔËËã·û } private bool CheckExpandoVariableName(string name) { if (name == null) return false; // ÕýÔò±í´ïʽ£ºÒÔ×Öĸ»òÏ»®Ïß¿ªÍ·£¬ºóÃæ¸ú×ÅÈÎÒâ¸ö×Öĸ¡¢Êý×Ö»òÏ»®Ïß string pattern = @"^[a-zA-Z_]\w*$"; return Regex.IsMatch(name, pattern); } public void Dispose() { results?.Clear(); ScadaPoints?.Clear(); ConfigPoints?.Clear(); ResultPoints?.Clear(); onFinish = null; } public WdnmoParam Copy() { //»ñȡһ¸öеÄʵÀý£¬½«Õâ¸öÀàµÄÊôÐÔÖµ¸³Öµ¸øÐÂʵÀý WdnmoParam v = new WdnmoParam(); v.ID = this.ID; v.Fitness = this.Fitness; v.time = this.time; //v.RunTimes = this.RunTimes; v.Period = this.Period; v.ErrorMessage = this.ErrorMessage; v.fullSearchMode = this.fullSearchMode; v.onFinish = this.onFinish; v.isNeedOutPut = this.isNeedOutPut; v.results = this.results; v.ScadaPoints = new List(); foreach (var point in this.ScadaPoints) { v.ScadaPoints.Add(new TimePoint( point)); } v.ConfigPoints = this.ConfigPoints; v.ResultPoints = new List(); foreach (var point in this.ResultPoints) { v.ResultPoints.Add(new TimePoint(point)); } v.buildDict(); return v; } } public class calcParam { public double[] vars; public Guid ID; public IChromosome chromosome; public List setVars = new List(); } public class SetVar { public string ID; public bool isNode = true; public int type; public float value; public SetVar(string ID,bool isNode,int type,float value) { this.ID= ID; this.isNode = isNode; this.type = type; this.value = value; } } [Serializable] public class TimePoint { public TimePoint() { } public TimePoint(string key, double value) { Key = key; Value = value; } public TimePoint(TimePoint point) { this.Key= point.Key; this.Value = point.Value; this.Name = point.Name; this.ValueTime = point.ValueTime; this.SearchRange = point.SearchRange; this.isNeedtoSave = point.isNeedtoSave; this.SaveKey = point.SaveKey; if (point.Pattern!=null) this.Pattern= point.Pattern.ToArray(); } public string Name; public DateTime ValueTime { get; set; } public string Key { get; set; } public double Value { get; set; } public double[] Pattern { get; set; } = null; public double SearchRange = 0; public bool isNeedtoSave = false; public string SaveKey = null; public override string ToString() { return $"{Name}\t[{Key}]\t{Value}"; } } [Serializable] public delegate void FinishEvent(dynamic txt); public delegate void SetEvent(string name, WdnmoParam param); //public event FinishEvent ss; [Serializable] public enum SettingCalcType { Add = 0, Const = 1 } [Serializable] public class LogicModelParams { public Guid ID = new Guid(); public List ¼¯ºÏ = new List(); public List ³õʼÌõ¼þ = new List(); public List Ͻ׶ÎÌõ¼þ = new List(); public List Ô¼Êø±äÁ¿ = new List(); public List ÊÔËã±äÁ¿ = new List(); public List Ë®Á¿·ÖÅä±äÁ¿ = new List(); //public List Ë®Á¿·ÖÅ伯ºÏ = new List(); public List ±äÁ¿ = new List(); public List ±í´ïʽ = new List(); public List Ô¤´¦Àí²å¼þ = new List(); public List Êä³ö±äÁ¿ { get { List all = new List(); all.AddRange(±äÁ¿); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); all.AddRange(±í´ïʽ); all.AddRange(Ë®Á¿·ÖÅä±äÁ¿); all.AddRange(¼¯ºÏ); return all; } } public List ½Ó¿Ú±äÁ¿ { get { List all = new List(); all.AddRange(±äÁ¿); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); all.AddRange(±í´ïʽ); all.AddRange(Ë®Á¿·ÖÅä±äÁ¿); return all; } } public List É趨±äÁ¿ { get { List all = new List(); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); return all; } } public List ±äÁ¿È«¼¯ { get { List all = new List(); all.AddRange(³õʼÌõ¼þ); all.AddRange(Ͻ׶ÎÌõ¼þ); all.AddRange(±äÁ¿); all.AddRange(ÊÔËã±äÁ¿); all.AddRange(¼¯ºÏ); all.AddRange(±í´ïʽ); all.AddRange(Ô¼Êø±äÁ¿); all.AddRange(Ë®Á¿·ÖÅä±äÁ¿); //all.AddRange(Ë®Á¿·ÖÅ伯ºÏ); all.AddRange(Ô¤´¦Àí²å¼þ); if (OFunction?.variable!=null) all.Add(OFunction.variable); return all; } } //[NonSerialized] [JsonIgnore] public Dictionary dict_Name { get; set; } //[NonSerialized] [JsonIgnore] public Dictionary dict_ID { get; set; } public Dictionary dict_Tag { get; private set; } //[NonSerialized] /// /// ´æ´¢Êä³ö±äÁ¿µÄË÷Òý£¬Èç¹ûValueµÄ³¤¶È>1£¬ÔòValue[0]Ϊ¸¸½Úµã±äÁ¿£¬Value[1]Ϊ×Ó½Úµã±äÁ¿ /// [JsonIgnore] public Dictionary dict_OutPut { get; set; } //public string inputFileString; [JsonIgnore] public dict map_node { get;set;} [JsonIgnore] public dict map_link { get; set; } /// /// µ±Ç°¼ÆËãʱ¿Ì£¬Ä¬ÈÏֵΪ0£»Í϶¯½ø¶ÈÌõ¿Ø¼þʱ£¬»áÐ޸ĵ±Ç°¼ÆËãʱ¿Ì£» /// public int Period { get; set; } = 0; public void buildDict() { //BookMark £º½¨Á¢±äÁ¿×Öµä dict_Name = new Dictionary(); dict_ID=new Dictionary(); dict_Tag=new Dictionary(); dict_OutPut = new Dictionary(); ±äÁ¿È«¼¯.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Name) && !dict_Name.ContainsKey(vv.Name)) dict_Name.Add(vv.Name, vv); }); ±äÁ¿È«¼¯.ForEach(vv => { if (!dict_ID.ContainsKey(vv.ID)) dict_ID.Add(vv.ID, vv); }); ±äÁ¿È«¼¯.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Tag) && !dict_Tag.ContainsKey(vv.Tag)) dict_Tag.Add(vv.Tag, vv); }); Êä³ö±äÁ¿.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Tag) && !dict_OutPut.ContainsKey(vv.Tag)) dict_OutPut.Add(vv.Tag, new Ivariable[] { vv }); if (!string.IsNullOrEmpty(vv.expressString) &&!dict_OutPut.ContainsKey(vv.expressString)) dict_OutPut.Add(vv.expressString,new Ivariable[] { vv }); }); } [NonSerialized] [JsonIgnore] public Dictionary ChildParam = new Dictionary(); public OBJFunction OFunction; public EN_Times ʱ¼ä¿Ì¶È; //public List results = new List(); public List results; //public int times; public LogicModelParams CloneResult() { var param_new = new LogicModelParams(); ±äÁ¿È«¼¯.ForEach(v => param_new.±äÁ¿È«¼¯.Add(new variable(v.PeriodCount) { ID = v.ID, Values_Set = v.Values, LogicValues = v.LogicValues, objListString = v.objListString })); //³õʼÌõ¼þ.ForEach(v => param_new.³õʼÌõ¼þ.Add(new variable(v.PeriodCount) {ID=v.ID,Values_Set=v.Values,LogicValues=v.LogicValues,objListString=v.objListString })) ; //Ͻ׶ÎÌõ¼þ.ForEach(v => param_new.Ͻ׶ÎÌõ¼þ.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //Ô¼Êø±äÁ¿.ForEach(v => param_new.Ô¼Êø±äÁ¿.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //ÊÔËã±äÁ¿.ForEach(v => param_new.ÊÔËã±äÁ¿.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //Ë®Á¿·ÖÅä±äÁ¿.ForEach(v => param_new.Ë®Á¿·ÖÅä±äÁ¿.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //Ë®Á¿·ÖÅ伯ºÏ.ForEach(v => param_new.Ë®Á¿·ÖÅ伯ºÏ.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //±äÁ¿.ForEach(v => param_new.±äÁ¿.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //¼¯ºÏ.ForEach(v => param_new.¼¯ºÏ.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); //±í´ïʽ.ForEach(v => param_new.±í´ïʽ.Add(new variable(v.PeriodCount) { ID = v.ID, Value_Set = v.Value0, LogicValue = v.LogicValue, objListString = v.objListString })); param_new.OFunction = new OBJFunction(); param_new.OFunction.value = OFunction.value; param_new.buildDict(); return param_new; } } /// /// ×Ó·½°¸²ÎÊý¼¯ /// public class childSolutionParam { /// ///¼ÆËã²ÎÊý /// public WdnmoParam wParam; public List childVars_In; public List childVars_Out; public string childSaveName; public variable childFitness_Out; //public SaveSettings saveSettings; //public string savePath; } public class EN_Times { public int duration; public int step; public int Ntimes; } public interface Ivariable { //bool isNode { get; set; } //string modelObjectID { get; set; } int modelIndex { get; set; } //string expressType { get; set; } } public class VarSimple: Ivariable { //public bool isNode { get; set; } //public string modelObjectID { get;set; } public int modelIndex { get; set; } //public string expressType { get; set; } } public class VarDistri : Ivariable { public string modelObjectID { get; set; } public int modelIndex { get; set; } //public bool isNode { get; set; } public List uvalues { get; set; } = null; } [Serializable] public class variable: Ivariable { public static List list_indicatorTypeName { get { if (_list_indicatorTypeName == null) { _list_indicatorTypeName = new List() { "ÒÑ֪ѹÁ¦", "½ÚµãÓÃË®Á¿", "½ÚµãÓÃˮģʽ", "Ë®³ØË®Î»", "Ë®±ÃתËÙ±È", "¹ÜÏß×èÁ¦ÏµÊý", "·§ÃÅ¿ª¶È", "Ë®±Ã¿ª¹Ø", "·§ÃÅ¿ª¹Ø", "¹ÜÏß¿ª¹Ø", "¹ÜÏßÖ±¾¶", "¹ÜÏß³¤¶È", "×ÜË®Á¿", "½ÚµãѹÁ¦", "½Úµã×ÔÓÉѹÁ¦", "½ÚµãÐèË®Á¿", "½Úµã±ê¸ß", "½ÚµãË®Áä", "½ÚµãË®ÖÊ", "¹ÜÏßÁ÷Á¿", "¹ÜÏßÁ÷ËÙ", "ˮͷËðʧ", "µ±Ç°×´Ì¬", "Ë®±ÃÄܺÄ", "Ë®±Ã¿ª¹Ø", "Ë®±ÃתËÙ±È", "³õʼ¼°ÔËÐд«²Î", "³õʼ´«²Î", "ÔËÐд«²Î", "ÖÖȺÉú³ÉÆ÷", "·½°¸É¸Ñ¡Æ÷", "¼ÆËãǰ´¦Àí", "½á¹û´¦Àí", "µ±Á¿·ÖÅä", "Ëæ»ú·ÖÅä" }; } return _list_indicatorTypeName; } } private static List _list_indicatorTypeName = null; public static List listUsedInitValue = new List() { "³õʼ¼ÆËãÖµ", "±ä»¯Öµ", "¾ø¶Ô±ä»¯Öµ" }; //public static List list_ÊäÈëÖµ = new List() { "»ù×¼Öµ(½çÃæ)", "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½çÃæ)", "ģʽϵÊý(½Ó¿Ú)" }; public static HashSet list_ÊäÈëÖµ = new HashSet() { "»ù×¼Öµ(½çÃæ)", "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½çÃæ)", "ģʽϵÊý(½Ó¿Ú)" }; public static List listUsedScadaValue = new List { "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)" }; public static List list_½Ó¿ÚÊä³öÖµ = new List() { "±í´ïʽ¼ÆËã", "¼ÆËãÖµ", "±ä»¯Öµ", "³õʼ¼ÆËãÖµ", "×Ó·½°¸Öµ" }; public static List list_½Ó¿ÚÊäÈëÖµ = new List() { "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½Ó¿Ú)" }; public static List list_NoNeedModelIndex = new List() { "»ù×¼Öµ(½çÃæ)", "¶¨ÒåÖµ", "»ù×¼Öµ(½Ó¿Ú)", "ģʽϵÊý(½çÃæ)", "ģʽϵÊý(½Ó¿Ú)" }; public int ID; public string modelObjectID { get; set; } public string Name; public int modelIndex { get; set; } public int PeriodCount { get { return _Values.Length; } set { LogicValues=new double[value]; //³õʼֵÉèÖÃΪdouble.NaN for (int i = 0; i < value; i++) { LogicValues[i] = double.NaN; } _Values = new double[value]; //³õʼֵÉèÖÃΪdouble.NaN for (int i = 0; i < value; i++) { _Values[i] = double.NaN; } } } public variable(int maxTimes=1) { this.PeriodCount = maxTimes; } //CFÐÞ¶© 2023Äê7ÔÂ10ÈÕ ´¦ÀíÐòÁл¯Ê§°ÜµÄÎÊÌâ [NonSerialized] public List Vars = new List(); /// /// ÓÃÀ´×÷Ϊ±äÁ¿µÄÆ«ÒÆË÷ÒýµÄ¾²Ì¬Öµ£¬ÀýÈçfixNum+1,fixNum+2,fixNum+3·Ö±ð´ú±íºóһλ¡¢ºóÁ½Î»¡¢ºóÈý룬fixNum-1´ú±íǰһλ /// public static int fixNum { get; set; } = -1000000; /// /// ×÷ΪPatternVarsµÄË÷Òý /// [NonSerialized] public Dictionary VarIndexs = new Dictionary(); /// /// ¼Ç¼ÐèÒªµ÷ÓõÄPatternVars /// [NonSerialized] public List PatternVars = new List(); // public int ParentID; public bool isInput { get; private set; } = false; public bool isNode { get; set; } //public bool? isOutput; public dynamic Type { get; set; } public dynamic resultType; public DRange doubleRange; public double? accuracy = null; public string expressString; public string expressType { get; set; } public int arrgFuncType; public string defaultExpress; private int _indicatorType; public string IndicatorType { get { if (_indicatorType<0) { return list_indicatorTypeName[0]; } else return list_indicatorTypeName[_indicatorType]; } set { if (list_indicatorTypeName == null) return; _indicatorType = list_indicatorTypeName.IndexOf(value); } } /// /// ÖµµÄÀàÐÍ£¬Êǵ¥Öµ»¹ÊÇÊý×飬½öÕë¶Ô³õʼÌõ¼þ /// public bool isArrInput { get; set; } = false; public int ObjType; public string logicType; #region ºËÐijÐÔØ±äÁ¿ /// /// ÊýѧģÐÍÄ¿±êÖµ¶àʱ¿Ì /// private double[] _Values = null; public double[] Values { get { return _Values; } private set { _Values = value; } } /// /// ³õʼ״̬¼ÆËãÖµ /// public double CalcValue_Init { get; set; } #endregion #region ¸¨Öú±äÁ¿ÊôÐÔ /// /// É趨ֵ£¨²»Ð޸ĵľ²Ì¬Öµ£© /// public double? LogicValue { get { return LogicValues[0]; } set { isInput = true; if (value==null) LogicValues[0]=double.NaN; else LogicValues[0] = (double)value; } } /// /// É趨ģʽ /// public double[] LogicValues { get;set; } /// /// ÐèÒªÌí¼Óº¯Êý /// public string Value_Set(int period,double value) { _Values[period] = value; return null; string result = null; double formatValue = value; //if (value!=double.NaN) formatValue = Math.Round(value, СÊýλÊý); /*[CloudflightÐÞ¸Ä]2024-6-3 ½âËø */ //lock (this) { _Values[period] = formatValue; } return result; } /// /// ÐèÒªÌí¼Óº¯Êý /// public double[] Values_Set { set { //lock (this) //{ // _Values = value; //} _Values = value; } } /// /// ÊýѧģÐÍÄ¿±êÖµ /// public double? Value0 { get { return _Values[0]; } private set { if (value == null) _Values[0] = double.NaN; else _Values[0] = (double)value; } } #endregion #region ÉèÖñäÁ¿ /// /// ÏÔʾµÄСÊýλÊý /// public int СÊýλÊý = 3; /// /// ±ê¸ß /// public double elevation = -9099; public int sort = 0; #endregion public string childSolution = ""; public string childTag = ""; public string childType = "´«Èë"; public double SearchRange = -1; public bool isNeedToSave = false; public string SaveKey = null; /// /// ÊÇ·ñÊÇÐéÄâ±äÁ¿£¨Óɼ¯ºÏ²úÉú£© /// public bool virturl = false; [NonSerialized] public dynamic Eval = null; /// /// ¶ÔÏóÇåµ¥ /// public string objListString; /// /// ¶ÔÏó±àºÅ£¨×îÓÅ£© /// public string obj_Best; public static double ErrNum = -9999999; private int _level = 0; [JsonIgnore] public int Level { get { if (_level!=0) return _level; int tempLevel = 1; if (Vars!=null) foreach (var v in Vars) { if (v!=this && v is variable vv && tempLevel < vv.Level + 1) tempLevel = vv.Level + 1; } _level= tempLevel; return _level; } } public string Tag { get; set; } public override string ToString() { string value = Value0 == null ? LogicValue.ToString() : Value0.ToString(); return $"[{Name}]{value}"; } //public double GetValue(Func GetModelValue = null, int? period = 0, bool forceReCalc = false) //{ // double Value; // var v = this; // // is double dd // if (v.expressType == "×Ó·½°¸Öµ"|| v.logicType=="Ä¿±êº¯Êý" ) // { // if (!v.Value0.HasValue) // Value = ErrNum; //throw (new Exception("Òì³£")); // else // Value = (double)v.Value0;//v.GetCalcValue(GetCalcValue, period, false); // } // else if(v.logicType=="ÊÔËã²ÎÊý")//²»Çå³ý»º´æ // { // if (!v.Value0.HasValue) // Value = variable.ErrNum; // else // Value = (double)v.Value0;//v.GetCalcValue(GetCalcValue, period, false); // } // else if (variable.list_ÊäÈëÖµ.IndexOf(v.expressType) < 0) // { // Value = v.GetCalcValue(GetModelValue, forceReCalc); // } // else // { // double? d; // if ((d = v.GetLogicValue(period)) == null) // { // //result = $"±äÁ¿[{v.Name}]ÅäÖôíÎó,±àºÅ[{v.modelObjectID}]ȡֵʧ°Ü"; // Value = variable.ErrNum; // } // else // { // Value = (double)(v.GetLogicValue(period) ?? (variable.ErrNum)); // } // } // return Value; //} //public double GetCalcValue(Func GetModelValue = null, bool forceReCalc = false) //{ // if (forceReCalc) // { // Value0 = null; // } // else // { // if (Value0!=null) return (double)Value0; // } // double CalcValue_Calc; // double result; // if (expressType == listUsedInitValue[0])//³õʼ¼ÆËãÖµ // { // result = CalcValue_Init; // } // else if (expressType == listUsedInitValue[1])//±ä»¯Öµ // { // CalcValue_Calc = GetModelValue(this); // result = CalcValue_Calc - CalcValue_Init; // } // else if (expressType == listUsedInitValue[2])//¾ø¶Ô±ä»¯Öµ // { // CalcValue_Calc = GetModelValue(this); // result = CalcValue_Calc - CalcValue_Init; // if (result < 0) result *= -1; // } // else // { // CalcValue_Calc = GetModelValue(this); // result = CalcValue_Calc; // }//¼ÆËãÖµ // Value0 = result; // return result; //} public double GetLogicValue(int period=0) { if ( period >= 0 && period paramVariables; //public List paramValues; [NonSerialized] public dynamic eval; public bool isUseOriginValue = false; /// /// true£ºÊ¹Óñí´ïʽģʽ£¬false£ºÊ¹ÓñàºÅģʽ /// public bool? isUseExpression = true; //public bool isUseScadaValue = false; } }