Пример #1
0
        public Stat(int maxDay)
        {
            _elements = new StatElement[maxDay];
            _dayAccumulated = new int[maxDay];

            for(int i=0;i<maxDay;++i)
            {
                _elements[i] = new StatElement(i);
                _dayAccumulated[i]=0;
            }

            _poolElements = new Dictionary<string, StatPoolElement>();
        }
Пример #2
0
        public void AddStat(StatElement e)
        {
            var day = e.Day;

            if (day >= _elements.Length || day < 0)
            {
                return;
            }

            var prior = _elements[day];
            _elements[day].PropEff = (prior.PropEff * _dayAccumulated[day] + e.PropEff) / (_dayAccumulated[day] + 1);
            _elements[day].PropEarn = (prior.PropEarn * _dayAccumulated[day] + e.PropEarn) / (_dayAccumulated[day] + 1);
            _elements[day].ScoreEff = (prior.ScoreEff * _dayAccumulated[day] + e.ScoreEff) / (_dayAccumulated[day] + 1);
            _elements[day].ScoreEarn = (prior.ScoreEarn * _dayAccumulated[day] + e.ScoreEarn) / (_dayAccumulated[day] + 1);
            _elements[day].PPLNSEff = (prior.PPLNSEff * _dayAccumulated[day] + e.PPLNSEff) / (_dayAccumulated[day] + 1);
            _elements[day].PPLNSEarn = (prior.PPLNSEarn * _dayAccumulated[day] + e.PPLNSEarn) / (_dayAccumulated[day] + 1);
            _elements[day].SMPPSEarn = (prior.SMPPSEarn * _dayAccumulated[day] + e.SMPPSEarn) / (_dayAccumulated[day] + 1);
            _elements[day].TotalEff = (prior.TotalEff * _dayAccumulated[day] + e.TotalEff) / (_dayAccumulated[day] + 1);
            _elements[day].TotalEarn = (prior.TotalEarn * _dayAccumulated[day] + e.TotalEarn) / (_dayAccumulated[day] + 1);
            _elements[day].TotalHop = (prior.TotalHop * _dayAccumulated[day] + e.TotalHop) / (_dayAccumulated[day] + 1);

            _dayAccumulated[day] = _dayAccumulated[day] + 1;
        }
Пример #3
0
        private void timer_Tick(object sender, EventArgs e)
        {
            if (_currentServer == "")
                return;

            for (int i = 0; i < _advPerTick; ++i)
            {
                InternalAdvance();
            }

            var days = (int)(_elapsedTime / 86400);
            var hours = (int)((_elapsedTime - (days * 86400)) / 3600);
            var minutes = (int)(((_elapsedTime - (days * 86400)) - (hours * 3600)) / 60);

            labelElapsedTime.Text = string.Format("{0}d {1}h {2}m", days, hours, minutes);
            labelCurrentPool.Text = string.Format("Current : {0}", _currentServer);

            // print current info
            double pps = 50.0f / _simConfig.Difficulty;
            var pool = _simConfig.Servers[_currentServer];
            if (pool.Type == PoolType.Prop || pool.Type == PoolType.PropEarlyHop)
            {
                var dd = (int)(pool.RoundTime / 86400);
                var hh = (int)((pool.RoundTime - (dd * 86400)) / 3600);
                var mm = (int)(((pool.RoundTime - (dd * 86400)) - (hh * 3600)) / 60);

                labelPoolInfo.Text = string.Format("Share - {3}({4}stale)/{5} RoundTime - {0}d {1}h {2}m : est earn {6:0.00000000}",
                    dd, hh, mm, (int)pool.MyValidShare, (int)pool.MyLostShare, (int)pool.CurrentShare, (int)pool.MyValidShare * 50.0f / pool.CurrentShare);
            }
            else if (pool.Type == PoolType.Pplns)
            {
                var dd = (int)(pool.RoundTime / 86400);
                var hh = (int)((pool.RoundTime - (dd * 86400)) / 3600);
                var mm = (int)(((pool.RoundTime - (dd * 86400)) - (hh * 3600)) / 60);

                labelPoolInfo.Text = string.Format("Share - {3}/{4} RoundTime - {0}d {1}h {2}m : est earn {5:0.00000000}",
                    dd, hh, mm, (int)pool.MyValidShare, (int)pool.CurrentShare, (int)pool.MyValidShare * 50.0f / pool.CurrentShare);
            }
            else if (pool.Type == PoolType.Score)
            {
                labelPoolInfo.Text = string.Format("Score : {0:0.00}/{1:0.00} Share : {2}/{3}", pool.MyScore,
                                                   pool.TotalScore, (int)pool.MyValidShare, pool.CurrentShare);
            }
            else if (pool.Type == PoolType.Smpps)
            {
                labelPoolInfo.Text = string.Format("SMPPS my share : {0} / {1}rejected", (int)pool.MyValidShare, (int)pool.MyLostShare);
            }

            // print earn / eff
            double propEarn = 0.0;
            int propTotalShare = 0;
            double pplnsEarn = 0.0;
            int pplnsTotalShare = 0;

            double scoreEarn = 0.0;
            int scoreTotalShare = 0;

            long totalShare = 0;
            foreach (var roundResult in _results)
            {
                switch (roundResult.Type)
                {
                    case PoolType.Prop:
                    case PoolType.PropEarlyHop:
                        propEarn += roundResult.Profit;
                        propTotalShare += roundResult.ValidShare + roundResult.LostShare;
                        break;

                    case PoolType.Pplns:
                        pplnsEarn += roundResult.Profit;
                        pplnsTotalShare += roundResult.ValidShare + roundResult.LostShare;
                        break;
                    case PoolType.Score:
                        scoreEarn += roundResult.Profit;
                        scoreTotalShare += roundResult.ValidShare + roundResult.LostShare;
                        break;
                }
            }

            double propEff=0;
            double pplnsEff=0;
            double scoreEff=0;
            double hopPerDay = 0;

            if (propTotalShare>0)
            {
                propEff = 100.0 * propEarn / (pps * propTotalShare);
            }
            labelPropEarn.Text = string.Format("Prop. earn : {0:0.00000000} BTC", propEarn);
            labelPropEff.Text = string.Format("Prop. Eff : {1} share - {0:0.00}%", propEff, propTotalShare);

            if(pplnsTotalShare>0)
            {
                pplnsEff = 100.0*pplnsEarn/(pps*pplnsTotalShare);
            }
            labelPplnsEarn.Text = string.Format("PPLNS earn : {0:0.00000000} BTC", pplnsEarn);
            labelPplnsEff.Text = string.Format("PPLNS Eff : {1} share - {0:0.00}%", pplnsEff, pplnsTotalShare);

            if (scoreTotalShare>0)
            {
                scoreEff = 100.0 * scoreEarn / (pps * scoreTotalShare);
            }
            labelScoreEarn.Text = string.Format("Score earn : {0:0.00000000} BTC", scoreEarn);
            labelScoreEff.Text = string.Format("Score Eff : {1} share - {0:0.00}%", scoreEff, scoreTotalShare);

            var smppsEarn = pps * _simConfig.Servers["smpps"].MyValidShare;

            labelPPSEarn.Text = string.Format("SMPPS earn : {0:0.00000000} BTC", smppsEarn);

            labelTotalEarn.Text = string.Format("Total earn : {0:0.00000000} BTC", propEarn + pplnsEarn + smppsEarn);

            totalShare = propTotalShare + pplnsTotalShare + scoreTotalShare + (int)_simConfig.Servers["smpps"].MyValidShare;

            double totalEff = 0;
            if (totalShare>0)
                totalEff = 100.0 * (propEarn + pplnsEarn + scoreEarn + smppsEarn) / (pps * totalShare);

            labelTotalEff.Text = string.Format("Total Eff : {1} share - {0:0.00}%", totalEff, totalShare);

            if (days > 0)
            {
                hopPerDay = (double)_totalHop/days;
            }
            labelHop.Text = string.Format("{0:0.00} Hops per day", hopPerDay);

            var totalEarn = propEarn + pplnsEarn + scoreEarn + smppsEarn;

            var stat = new StatElement(days, propEff, propEarn, scoreEff, scoreEarn, pplnsEff, pplnsEarn, smppsEarn,
                                       totalEff, totalEarn, _totalHop);
            _stat.AddStat(stat);

            // datagrid pools
            dataGridPools.Rows.Clear();
            foreach (var server in _simConfig.Servers)
            {
                if(server.Key=="smpps")
                {
                    dataGridPools.Rows.Add(server.Key, (int)server.Value.MyValidShare,
                        "N/A","N/A","N/A","100%",smppsEarn);
                }
                else
                {
                    double eff = 0;
                    if (server.Value.MyTotalShare > 0)
                    {
                        eff = 100 * (server.Value.MyTotalProfit / server.Value.MyTotalShare) / pps;
                    }
                    var progressDelayed = string.Format("{0}% {1}", (int)(server.Value.CurrentShare / _simConfig.Difficulty * 100),
                                                 server.Value.CurrentShare);
                    var progressReal = string.Format("{0}% {1}", (int)(server.Value.CurrentRealShare / _simConfig.Difficulty * 100),
                                                 server.Value.CurrentRealShare);

                    dataGridPools.Rows.Add(server.Key, (int)server.Value.MyValidShare, progressDelayed, progressReal,
                                           server.Value.RealRoundTime,
                                           string.Format("{0:0.00}", eff),
                                           server.Value.MyTotalProfit);
                }
            }

            if (days > _simConfig.MaxSimulationDay)
            {
                if (_toLog)
                {
                    var log = string.Format("{0:0.0} / {1:0.0} / {2:0.0} : / {3:0.0} | {4:0.000} BTC/day\n", propEff, pplnsEff, scoreEff, totalEff, totalEarn / (_elapsedTime / 86400.0));
                    PrintLog(log);
                    foreach (var p in _simConfig.Servers)
                    {
                        if(p.Key=="smpps")
                        {
                            _stat.AddPoolStat("smpps", p.Value.MyValidShare, 0, 1, pps * p.Value.MyValidShare);
                        }
                        else
                        {
                            _stat.AddPoolStat(p.Key, p.Value.MyTotalShare, p.Value.Round, (p.Value.MyTotalProfit / p.Value.MyTotalShare) / pps, p.Value.MyTotalProfit);
                        }
                    }

                    _stat.Dump(_currentGenerationTitle, false);
                    _toLog = false;
                }

                _advPerTick = 0;

                if (checkBoxAuto.Checked)
                {
                    if (_currentSimRound < _simConfig.MaxSimulationRound)
                    {
                        SetupRound();
                    }
                    else
                    {
                        foreach (var p in _simConfig.Servers)
                        {
                            if (p.Key == "smpps")
                            {
                                _stat.AddPoolStat("smpps", p.Value.MyValidShare, 0, 1, pps * p.Value.MyValidShare);
                            }
                            else
                            {
                                _stat.AddPoolStat(p.Key, p.Value.MyTotalShare, p.Value.Round, (p.Value.MyTotalProfit / p.Value.MyTotalShare) / pps, p.Value.MyTotalProfit);
                            }
                        }
                        _stat.Dump(_currentGenerationTitle, true);
                        FinishSimGeneration();
                    }
                }
            }
        }