public void SetScale(int bins, double min, double max) { if (scaledWidth == bins && scaledMin == min && scaledMax == max) { return; } scaledWidth = bins; scaledMin = min; scaledMax = max; scaleRange = max - min; scaleFactor = bins / scaleRange; scaledPointList.Clear(); scaledPointList.Capacity = bins * 4; // store 4 points for each bin (entry, min, max, exit) scaledMaxIndexList.Clear(); scaledMaxIndexList.Capacity = bins; // store just the index of the max point for each bin int lastBin = -1; int curBinEntryIndex = -1; int curBinMinIndex = -1; int curBinMaxIndex = -1; int curBinExitIndex = -1; for (int i = 0; i < fullPointList.Count; ++i) { ZedGraph.PointPair point = fullPointList[i]; if (point.X < min) { continue; } if (point.X > max) { break; } int curBin = (int)Math.Round(scaleFactor * (point.X - min)); if (curBin > lastBin) // new bin, insert points of last bin { if (lastBin > -1) { scaledMinIndex = curBinMinIndex; scaledPointList.Add(fullPointList[curBinEntryIndex]); if (curBinEntryIndex != curBinMinIndex) { scaledPointList.Add(fullPointList[curBinMinIndex]); } if (curBinEntryIndex != curBinMaxIndex && curBinMinIndex != curBinMaxIndex) { scaledPointList.Add(fullPointList[curBinMaxIndex]); } if (curBinEntryIndex != curBinMaxIndex && curBinMinIndex != curBinMaxIndex && curBinMaxIndex != curBinExitIndex) { scaledPointList.Add(fullPointList[curBinExitIndex]); } if (fullPointList[curBinMaxIndex].Y != 0) { scaledMaxIndexList.Add(curBinMaxIndex); } } lastBin = curBin; curBinEntryIndex = i; curBinMinIndex = i; curBinMaxIndex = i; } else // same bin, set exit point { curBinExitIndex = i; if (point.Y > fullPointList[curBinMaxIndex].Y) { scaledMaxIndex = curBinMaxIndex = i; } else if (point.Y < fullPointList[curBinMaxIndex].Y) { curBinMinIndex = i; } } } if (lastBin > -1) { scaledMinIndex = curBinMinIndex; scaledPointList.Add(fullPointList[curBinEntryIndex]); if (curBinEntryIndex != curBinMinIndex) { scaledPointList.Add(fullPointList[curBinMinIndex]); } if (curBinEntryIndex != curBinMaxIndex && curBinMinIndex != curBinMaxIndex) { scaledPointList.Add(fullPointList[curBinMaxIndex]); } if (curBinEntryIndex != curBinMaxIndex && curBinMinIndex != curBinMaxIndex && curBinMaxIndex != curBinExitIndex) { scaledPointList.Add(fullPointList[curBinExitIndex]); } if (fullPointList[curBinMaxIndex].Y != 0) { scaledMaxIndexList.Add(curBinMaxIndex); } } }
private void ProcessList() { if (currentUser == null) { currentUser = new UserInfo(); currentUser.uid = currentUser.uname = currentUser.name = "[-]"; currentUser.subs = new List <List <long> >(); currentUser.Process(); } userRank = RegistryAccess.GetUserRank(currentUser.uname); if (userRank == null) { userRank = new UserRanklist(); userRank.username = currentUser.uname; userRank.rank = 0; userRank.activity = new List <long>(); for (int i = 0; i < 5; ++i) { userRank.activity.Add(0); } } _acOverTime.Clear(); _subOverTime.Clear(); _RankCount.Clear(); _firstSub = long.MaxValue; _solvedCount = _unsolvedCount = _tryCount = _totalSubmission = 0; _subInAnsiC = _subInCPP = _subInCPP11 = _subInJava = _subInPascal = 0; _acCount = _waCount = _tleCount = _reCount = _peCount = 0; _ceCount = _oleCount = _subeCount = _mleCount = 0; List <long> solved = new List <long>(); foreach (UserSubmission usub in currentUser.submissions) { //total submission count _totalSubmission++; //age meter if (_firstSub > usub.sbt) { _firstSub = usub.sbt; } //add rank count if (usub.IsAccepted()) { _RankCount.Add(usub.rank, usub.pid); //solve count if (!solved.Contains(usub.pnum)) { _solvedCount++; solved.Add(usub.pnum); } } //language switch ((Language)usub.lan) { case Language.C: _subInAnsiC++; break; case Language.Java: _subInJava++; break; case Language.Pascal: _subInPascal++; break; case Language.CPP: _subInCPP++; break; case Language.CPP11: _subInCPP11++; break; } //submissionPerTime double xval = new ZedGraph.XDate(UnixTimestamp.FromUnixTime(usub.sbt)); if (_totalSubmission == 1) { _subOverTime.Add(xval, 0); } _subOverTime.Add(xval, _totalSubmission); _acOverTime.Add(xval, _solvedCount); //verdict switch ((Verdict)usub.ver) { case Structures.Verdict.CompileError: _ceCount++; break; case Structures.Verdict.RuntimeError: _reCount++; break; case Structures.Verdict.OutputLimit: _oleCount++; break; case Structures.Verdict.TimLimit: _tleCount++; break; case Structures.Verdict.MemoryLimit: _mleCount++; break; case Structures.Verdict.WrongAnswer: _waCount++; break; case Structures.Verdict.PresentationError: _peCount++; break; case Structures.Verdict.Accepted: _acCount++; break; } } //finalize _tryCount = currentUser.TryList.Count; _unsolvedCount = _tryCount - _solvedCount; _subOverTime.Add(new ZedGraph.XDate(DateTime.Now), _totalSubmission); _acOverTime.Add(new ZedGraph.XDate(DateTime.Now), _solvedCount); }
public static void FilterData(ZedGraph.PointPairList data, ref ZedGraph.PointPairList filter, double speed_max, double alfa_max, double alfa_null, int periodInMin) { if (data != null) { if (filter == null || filter.Count < 2) { filter = new ZedGraph.PointPairList(); filter.Add(data[0]); filter.Add(data[1]); } ZedGraph.PointPairList filterPoints = new ZedGraph.PointPairList(); for (int i = filter.Count; i < data.Count; i++) { filterPoints.Clear(); ZedGraph.PointPair notFilteredMeasure = data[i]; for (int j = filter.Count-1; j > 0 ; j--) { if (DateTime.FromOADate(notFilteredMeasure.X).Subtract(new TimeSpan(0, periodInMin, 0)) < DateTime.FromOADate(filter[j].X)) { filterPoints.Add(filter[j]); } else break; } double midX = filterPoints.Average(value => value.X); double midY = filterPoints.Average(value => value.Y); double alfa = 0.0; double nominalSpeed = speed_max / 2.0; //raschet skorosti TimeSpan interval = DateTime.FromOADate(notFilteredMeasure.X) - DateTime.FromOADate(midX); double speed = Math.Abs(notFilteredMeasure.Y - midY) / (0.5 * interval.TotalSeconds); //alfa ot v if (speed < nominalSpeed) { alfa = (alfa_max - alfa_null) * speed / nominalSpeed + alfa_null; } else if (speed >= nominalSpeed && speed < speed_max) { alfa = alfa_max; } else if (speed >= speed_max && speed < 2 * speed_max) { alfa = 2 - speed / speed_max; } else if (speed > 2 * speed_max) { alfa = 0; } //vichislenie skorrekt urovnia double skor_uroven = notFilteredMeasure.Y * alfa + (1 - alfa) * midY; //skor_uroven = Math.Round(skor_uroven, 2); //vichislenie skorrekt urovnia filter.Add(new ZedGraph.PointPair(notFilteredMeasure.X, skor_uroven)); } if (filter.Count > 3) { filter[0].Y = filter[2].Y; filter[1].Y = filter[2].Y; } } }