private void reset() { atomicMode = -1; cmin = 0; cmax = int.MaxValue; dmin = int.MaxValue; dmax = -dmin; //dminAlready = false; //dmaxAlready = false; minMem = null; maxMem = null; sameConfiguration = 0; _empreinte = ""; delta0 = 0; state = builderstate.none; }
private bool check() { sb = new StringBuilder(); sb.AppendLine(); makeDelta(mem0, "virtuel", DAT + "vhisto." + conf.name + ".txt"); mustUpdate = false; canGo = false; var newEmpreinte = source.getEmpreinte(); if (state == builderstate.none) { reset(); } else if (state == builderstate.stable) { if (newEmpreinte != _empreinte) { reset(); } else { mustUpdate = false; canGo = true; org = newv; return(true); } } total = source.getTotalSize(); double target = conf.target; delta = target - total; log("delta {0}", delta); if (state == builderstate.none) { delta0 = delta; } state = builderstate.enCours; lastd = d; d = 0; xml = null; lookup(xmlRoot); if (xml == null) { return(true); } string attTarget = conf.type; var att = xml.Attributes[attTarget]; if (att == null) { return(true); } org = Convert.ToDouble(att.Value); newv = org; try { if (delta * delta0 < 0) { if (atomicMode < 0) { atomicMode = 0; //if (minMem == null) // minMem = new Memory(mem0); //if (maxMem == null) // maxMem = new Memory(mem0); //if (minMem.suppressions.Count == 0) // minMem.suppressions = new List<TrackItemdesc>(maxMem.ajouts); //if (maxMem.ajouts.Count == 0) // maxMem.ajouts = new List<TrackItemdesc>(minMem.suppressions); } } bool cancelSameConf = false; bool cancelNb = false; if (atomicMode >= 0) { atomicMode++; if (Math.Abs(dmin - delta) < EPSILON) { sameConfiguration++; } else if (Math.Abs(dmax - delta) < EPSILON) { sameConfiguration++; } else { sameConfiguration = 0; } if (sameConfiguration > conf.idem) { cancelSameConf = true; } if (atomicMode > conf.cloop) { cancelNb = true; } } if (delta >= 0) { if (mem0.suppressions.Count > 0) { minMem = new Memory(mem0); } if (delta < conf.write) { canGo = true; } // lastGoodLevel = org; //if (maxMem != null && minMem != null) //{ if (atomicMode > 0) { if (cancelSameConf) //|| (mem0.suppressions.Count == 1 && mem0.ajouts.Count ==0)) { log("abandon recherche cartésienne cause idem"); state = builderstate.stable; return(true); } else if (cancelNb) { log("abandon recherche cartésienne cause cloop"); state = builderstate.stable; return(true); } //if (Math.Abs(dmin - delta) < 0.01) // dminAlready = true; //else // dminAlready = false; if (maxMem != null && minMem != null) { if (minMem.suppressions.Count == maxMem.ajouts.Count) { bool identique = true; for (int i = 0; i < minMem.suppressions.Count; i++) { if (!minMem.suppressions[i].Equals(maxMem.ajouts[i])) { identique = false; break; } } if (identique) { if (minMem.suppressions.Count == 1 || atomicMode > conf.verif) { mustUpdate = false; log("abandon recherche cartésienne cause cycle"); state = builderstate.stable; _empreinte = newEmpreinte; return(true); } } } } } cmin = org; dmin = delta; // lastGoodDelta = (int)delta; lastTotal = (int)total; if (delta < conf.delta) { state = builderstate.stable; _empreinte = newEmpreinte; return(true); } mustUpdate = true; d = 0; if (atomicMode > 0) { //if (atomicMode > conf.cloop) //{ // mustUpdate = false; // log("abandon recherche cartésienne cause cloop"); // state = builderstate.stable; // _empreinte = newEmpreinte; // return true; //} //if (dminAlready && dmaxAlready) //{ // mustUpdate = false; // Program.log.log("abandon recherche cartésienne cause cycle"); // return true; //} d = 0.5 * (cmax - cmin); } else { double _d = int.MaxValue; if (cmax >= 0 && cmin >= 0) { _d = cmax - cmin; } foreach (Level level in conf.levels) { var aux = (delta - level.d) * level.inf; if (aux > d) { d = aux; } } if (d > _d) { d = _d; } } } else if (delta < 0) { if (mem0.ajouts.Count > 0) { maxMem = new Memory(mem0); } mustUpdate = true; canGo = false; //if (maxMem != null && minMem != null) //{ // if (atomicMode < 0) // atomicMode = 0; // atomicMode++; //} cmax = org; dmax = delta; d = 0; if (atomicMode > 0) { bool identique = false; if (minMem != null && maxMem != null && maxMem.ajouts.Count == minMem.suppressions.Count) { identique = true; for (int i = 0; i < minMem.suppressions.Count; i++) { if (!minMem.suppressions[i].Equals(maxMem.ajouts[i])) { identique = false; break; } } } if (cancelSameConf)// || (mem0.ajouts.Count == 1 && mem0.suppressions.Count == 0)) { log("retour derniere bonne valeur cause idem"); d = cmin - cmax; } else if (cancelNb) { log("abandon recherche cartésienne cause cloop"); d = cmin - cmax; } else if (identique && (minMem.suppressions.Count == 1 || atomicMode > conf.verif)) { log("retour derniere bonne valeur cause cycle"); d = cmin - cmax; } //else if (atomicMode > conf.cloop) //{ // log("abandon recherche cartésienne cause cloop"); // d = cmin - cmax; //} else { d = 0.5 * (cmin - cmax); } } else { double _d = -int.MaxValue; if (cmax >= 0 && cmin >= 0) { _d = cmin - cmax; } foreach (Level level in conf.levels) { var aux = (delta - conf.delta + level.d) * level.sup; if (aux < d) { d = aux; } } if (d < _d) { d = _d; } } //d = (delta - conf.delta) * conf.sup; //if (org <= lastGoodLevel) //{ // lastGoodLevel = -1; // lastGoodDelta = -1; // lastTotal = -1; //} } if (Math.Abs(d) < 0.00000001) { mustUpdate = false; // unCart(); state = builderstate.stable; _empreinte = newEmpreinte; return(true); } //if (dejaVu) // Program.log.log("déjà vu lastGoodLevel:{0} lastGoodDelta:{1}", lastGoodLevel, lastGoodDelta); log("correction {0}", d); newv = org + d; if (newv <= 0) { newv = 0; } newv = Math.Round(newv, 8); log(" valeur {0} --> {1}", org, newv); att.Value = newv.ToString(); } finally { if (state == builderstate.stable) { mustUpdate = false; _empreinte = newEmpreinte; canGo = true; } string strDate = ""; var attD = xml.Attributes["date"]; if (attD != null) { strDate = attD.Value; } bool exist = File.Exists(file); using (TextWriter tw = new StreamWriter(file, true, Encoding.UTF8)) { // "quand\tdiff\tcorr\torg\tnew\tcmin\tcmax\tdmin\tdmax\tatomic\tAdd\tiAdd\ttSupp\tiSup\tstate\t\r\n"); if (!exist) { tw.WriteLine("quand\ttarget\tdelta\tinf\tsup\ttotal\tdiff\tcorr\torg\tnew\tcmin\tcmax\tdmin\tdmax\tatomic\tstate"); } tw.Write(DateTime.Now); tw.Write(SEP); tw.Write(target.ToString("0.###")); tw.Write(SEP); tw.Write(conf.delta.ToString("0.###")); tw.Write(SEP); tw.Write(conf.levels[0].inf.ToString("0.###")); tw.Write(SEP); tw.Write(conf.levels[0].sup.ToString("0.###")); tw.Write(SEP); tw.Write(total.ToString("0.###")); tw.Write(SEP); tw.Write((-delta).ToString("0.###")); tw.Write(SEP); tw.Write(d.ToString("0.###")); tw.Write(SEP); tw.Write(org.ToString("0.###")); tw.Write(SEP); tw.Write(newv.ToString("0.###")); tw.Write(SEP); tw.Write(cmin.ToString("0.###")); tw.Write(SEP); tw.Write(cmax.ToString("0.###")); tw.Write(SEP); tw.Write(dmin.ToString("0.###")); tw.Write(SEP); tw.Write(dmax.ToString("0.###")); tw.Write(SEP); tw.Write(atomicMode); tw.Write(SEP); tw.Write(state); tw.Write(SEP); tw.WriteLine(); } if (canGo) { // makeDelta(mem1, "reel", @"..\rhisto.txt"); makeDelta(mem1, "reel", DAT + "rhisto." + conf.name + ".txt"); } } return(canGo); }
private bool checkWithoutModify() { mustUpdate = false; canGo = false; var newEmpreinte = source.getEmpreinte(); try { if (state == builderstate.stable) { if (newEmpreinte != _empreinte) { reset(); } else { mustUpdate = false; canGo = true; org = newv; return(true); } } else { if (newEmpreinte != _empreinte) { reset(); } } total = source.getTotalSize(); double target = conf.target; delta = target - total; if (delta >= 0) { if (delta < conf.write) { canGo = true; } if (delta < conf.delta) { state = builderstate.stable; _empreinte = newEmpreinte; return(true); } mustUpdate = true; } else if (delta < 0) { mustUpdate = true; canGo = false; } } finally { if (state == builderstate.stable) { mustUpdate = false; _empreinte = newEmpreinte; canGo = true; } } return(canGo); }