def _update_done_stats()

in src/python/phyre/eval_task_complexity.py [0:0]


    def _update_done_stats(self, task_id, action_tier):
        """Update a set of "done" tasks after new data for task_id and action_tier."""
        key = (task_id, action_tier)
        status_counts = self._state['stats_per_task_tier'][key]['status_counts']

        valid_attempts = sum(
            status_counts.values()) - status_counts[INVALID_INPUT]
        if valid_attempts < self.min_valid_attempts:
            return

        flags = compute_flags(action_tier, status_counts)

        if not ({Flags.GOOD, Flags.BAD} & flags):
            return
        if not ({Flags.GOOD_STABLE, Flags.BAD_STABLE} & flags):
            return
        num_solved = status_counts[UNSTABLY_SOLVED] + status_counts[
            STABLY_SOLVED]
        if Flags.GOOD in flags and num_solved < MIN_SOLUTIONS:
            return
        if (Flags.GOOD_STABLE in flags and
                status_counts[STABLY_SOLVED] < MIN_SOLUTIONS):
            return

        self._state['done_task_tier'].add(key)

        logging.info('Done simulation for %s. Stats: %s. Flags: %s', key,
                     status_counts, flags)

        # If reject_ball_solvable, add task ids for ball solved task to
        # done_task_tiers_reasons.
        solved_by_ball = (action_tier == 'ball' and Flags.GOOD_STABLE in flags)
        if self.reject_ball_solvable and solved_by_ball:
            for tier in phyre.action_mappers.ACTION_MAPPERS:
                tier_key = (task_id, tier)
                if tier_key in self._state['done_task_tier']:
                    continue
                logging.info(
                    'Removing %s. Solved by ball and reject_ball_solvable is'
                    ' True', tier_key)
                self._state['done_task_tier'].add(tier_key)