# Copyright 2013 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""A variation of the hill climbing algorithm.

Part of the Chrome build flags optimization.

This algorithm explores all the neighbors of the current task. If at least one
neighbor gives better performance than the current task, it explores the best
neighbor.
"""

__author__ = "yuhenglong@google.com (Yuheng Long)"

from flags import FlagSet
import flags_util
from generation import Generation
from task import Task


class HillClimbingBestBranch(Generation):
    """A variation of the hill climbing algorithm.

    Given a task, it explores all its neighbors. Pick the best neighbor for the
    next iteration.
    """

    def __init__(self, exe_set, parents, specs):
        """Set up the tasks set of this generation.

        Args:
          exe_set: A set of tasks to be run.
          parents: A set of tasks to be used to check whether their neighbors have
            improved upon them.
          specs: A list of specs to explore. The spec specifies the flags that can
            be changed to find neighbors of a task.
        """

        Generation.__init__(self, exe_set, parents)
        self._specs = specs

        # This variable will be used, by the Next method, to generate the tasks for
        # the next iteration. This self._next_task contains the best task in the
        # current iteration and it will be set by the IsImproved method. The tasks
        # of the next iteration are the neighbor of self._next_task.
        self._next_task = None

    def IsImproved(self):
        """True if this generation has improvement over its parent generation.

        If this generation improves upon the previous generation, this method finds
        out the best task in this generation and sets it to _next_task for the
        method Next to use.

        Returns:
          True if the best neighbor improves upon the parent task.
        """

        # Find the best neighbor.
        best_task = None
        for task in self._exe_set:
            if not best_task or task.IsImproved(best_task):
                best_task = task

        if not best_task:
            return False

        # The first generation may not have parent generation.
        parents = list(self._candidate_pool)
        if parents:
            assert len(parents) == 1
            self._next_task = best_task
            # If the best neighbor improves upon the parent task.
            return best_task.IsImproved(parents[0])

        self._next_task = best_task
        return True

    def Next(self, cache):
        """Calculate the next generation.

        The best neighbor b of the current task is the parent of the next
        generation. The neighbors of b will be the set of tasks to be evaluated
        next.

        Args:
          cache: A set of tasks that have been generated before.

        Returns:
          A set of new generations.
        """

        # The best neighbor.
        current_task = self._next_task
        flag_set = current_task.GetFlags()

        # The neighbors of the best neighbor.
        children_tasks = set([])
        for spec in self._specs:
            for next_flag in flags_util.ClimbNext(flag_set.GetFlags(), spec):
                new_task = Task(FlagSet(next_flag.values()))

                if new_task not in cache:
                    children_tasks.add(new_task)

        return [
            HillClimbingBestBranch(
                children_tasks, set([current_task]), self._specs
            )
        ]
