コード例 #1
0
ファイル: AutoBuilder.cs プロジェクト: bilouforever2/swap
        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;
        }
コード例 #2
0
ファイル: AutoBuilder.cs プロジェクト: bilouforever2/swap
        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);
        }
コード例 #3
0
ファイル: AutoBuilder.cs プロジェクト: bilouforever2/swap
        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);
        }