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