def train_candidate_model(model: CandidateModel, process: ElectionConstructor, population: NDPopulation, max_steps: int): timings = Timings() stats = ModelStats() first = True while model.global_step < max_steps: winner, candidates, balance = run_sample_election( model, process, population, True) for i in range(len(candidates)): model.add_sample_from_candidates(candidates[i], candidates[0:i], winner) if model.ready(): if first: print("starting to train") first = False stats.update(winner, candidates, balance) for i in range(5): with timings.time_block("model.train"): model.train(128) if model.global_step % 1000 == 0: stats.print(process.name, model.global_step) if model.global_step < max_steps: stats.reset() timings.print()
def currentWeekMenu_(self, sender): today = Timings.workStartDateTime() weekNumber = int(today.strftime("%w")) if weekNumber == 0: weekNumber = 7 d = today - datetime.timedelta(days=weekNumber - 1) self.setDate(d) self.updateState()
def add(self, task, projectName=None): date = Timings.now() if self.taskType(task) != "work": projectName = None attributes = self.processTask(date, task, projectName) DataManager.writeTask(date, task, projectName, firstToday=len(self.tasks) == 1) return attributes
def check_stats(stats: ModelStats, model: CandidateAgent, process: ElectionConstructor, population: NDPopulation): results = [] timings = Timings() for i in range(1000): winner, candidates, balance = run_sample_election(model, process, population, train=False) stats.update(winner, candidates, balance)
class Tasks(object): def __init__(self): self.timings = Timings() self.tasks = [] for date, task, projectName in DataManager.getAfterDate(Timings.workStartDateTime()): self.processTask(date, task, projectName) def processTask(self, date, task, projectName): spentSeconds = self.timings.count(date, self.taskType(task)) attributes = (date, task, projectName, spentSeconds, self.taskType(task)) self.tasks.append(attributes) return attributes def dayStarted(self): """Return True if working day started else False""" return bool(len(self.tasks)) def add(self, task, projectName=None): date = Timings.now() if self.taskType(task) != "work": projectName = None attributes = self.processTask(date, task, projectName) DataManager.writeTask(date, task, projectName, firstToday=len(self.tasks) == 1) return attributes def setCurrentTask(self, task): self.timings.setCurrentTaskType(self.taskType(task)) @property def taskList(self): return self.tasks @staticmethod def taskType(taskString): return None if taskString.strip() == "" or taskString.find("***") != -1 \ else "work" if taskString.find("**") == -1 else "slack"
def __init__(self, fromDate, toDate): self.timings = Timings() self._fromDate = fromDate self._toDate = toDate
class Statistics(object): _avgWork = 0 _avgSlacking = 0 _maxValue = 0 def __init__(self, fromDate, toDate): self.timings = Timings() self._fromDate = fromDate self._toDate = toDate def _countAttrib(self, res): """Count basic attributes(average work, average slacking and maximum value)""" days = (self._toDate - self._fromDate).days self._avgWork = int(self.timings.spentSeconds / days) self._avgSlacking = int(self.timings.slackingSeconds / days) if res: self._maxValue = max(res) def _countObject(self, objType, targetAction): """Generic function for calculating projects data or slacking statistics""" self._data = DataManager.getByRange(self._fromDate, self._toDate) res = {} for date, task, projectName in self._data: if task == "__start__": self.timings.setPrevDate(None) objKey = projectName if objType == "project" else task spentSeconds = self.timings.count(date, Tasks.taskType(task)) if Tasks.taskType(task) != targetAction: self.timings.setPrevDate(date) continue if spentSeconds: if objKey not in res: res[objKey] = spentSeconds else: res[objKey] += spentSeconds self._countAttrib(res.values()) if res: return sorted(res.iteritems(), key=lambda item:item[1], reverse=True) else: return [] def countProjects(self): """Count project statistics""" return self._countObject("project", "work") def countSlacking(self): """Count slacking statistics""" return self._countObject("task", "slack") def countTasks(self): """Count tasks statistics divided by projects""" self._data = DataManager.getByRange(self._fromDate, self._toDate) res = {} for date, task, projectName in self._data: if task == "__start__": self.timings.setPrevDate(None) spentSeconds = self.timings.count(date, Tasks.taskType(task)) if Tasks.taskType(task) != "work": continue if spentSeconds: if projectName not in res: res[projectName] = {} if task not in res[projectName]: res[projectName][task] = spentSeconds else: res[projectName][task] += spentSeconds self._countAttrib([v for k in res for v in res[k].values()]) if res: ret = {} for k in res.keys(): ret[k] = sorted(res[k].iteritems(), key=lambda item:item[1], reverse=True) return ret else: return {} @property def maxValue(self): """Maximum value of calculated object (project /task / slackings)""" return self._maxValue @property def totalWork(self): """Total work done""" return self.timings.spentSeconds @property def avgWork(self): """Average work per day""" return self._avgWork @property def totalSlacking(self): """Total slacking""" return self.timings.slackingSeconds @property def avgSlacking(self): """Average slacking per day""" return self._avgSlacking
def yeaterdayMenu_(self, sender): self.startDate = Timings.workStartDateTime() - datetime.timedelta(days=1) self.endDate = Timings.workStartDateTime() self.updateState()
def todayMenu_(self, sender): self.setDate(Timings.workStartDateTime()) self.updateState()
def setDate(self, date): self.startDate = date self.endDate = Timings.workStartDateTime() + datetime.timedelta(days=1)
def showCustom_(self, sender): self.startDate = Timings.combineDateWithTime(nsDateToDatetime(self.dpkrFrom.dateValue())) self.endDate = Timings.combineDateWithTime(nsDateToDatetime(self.dpkrTo.dateValue()) + datetime.timedelta(days=1)) self.generateChart()
def days10_(self, sender): self.setDate(Timings.workStartDateTime() - datetime.timedelta(days=10)) self.updateState()
def currentMonthMenu_(self, sender): today = Timings.workStartDateTime() d = today - datetime.timedelta(days=int(today.strftime("%d")) - 1) self.setDate(d) self.updateState()
def __init__(self): self.timings = Timings() self.tasks = [] for date, task, projectName in DataManager.getAfterDate(Timings.workStartDateTime()): self.processTask(date, task, projectName)