def __init__(
      self, tasks=[], dependencies=[], cpu=float('inf'), name='Supervisor',
      delay=1, force_run=False, email=None, email_interval=30, log=None):
        ''' the __init__ for the Superviosr object has nine paramters
            described below.
            tasks -
                A list of Task or Supervisor objects that this Supervisor will
                manage. Default = []
            dependencies -
                A list of dependencies for this Supervisor. This works in the
                same way as the dependencies for a Task object. Default = []
            cpu -
                The cpu cap for this supervisor. When you run this supervisor,
                the supervisor will run the maximimun number of Tasks that it
                can in parrelel such that the sum of Task.cpu for each of those
                tasks is below this supervisor's cpu. Default = float('inf')
            name -
                A handy way to keep track of your supervisor if you are using
                multiple. name will be used during exception help messages and
                when printing the supervisor. Default = 'Supervisor'
            delay -
                While running tasks, this superrvisor will weight delay seconds
                in between each execution cycle. Default = 1
            force_run -
                A flag that determines whether the Supervisor will attempt to
                skip execution of tasks that it thinks are skippable. A task is
                skippable if Task.skippable() returns True. Default = False
            email -
                This supervisor will send emails updating you on execution of
                the pipeline if an email is given. This supervisor will send
                an email when the pipeline finishes, and will send emails at
                most once per email_interval minutes while running.
                Default = None
            email_interval -
                The delay between emails. Sent by the Supervisor. Only relevant
                if email is used.
            log -
                The path to the log file that the Supervisor will generate. The
                log file is plain text and details the execution of each task.
                Default = name+'.run_log'
        '''
        self.cpu = cpu
        self.name = name
        self.delay = delay
        self.dependencies = dependencies
        self.force_run = force_run
        self.email = email
        self.email_interval = email_interval * 60
        self.last_email = time.time()
        self.log_path = log if(log is not None) else name + '.run_log'
        self.log_str = ''
        self.task_map = {}
        self.task_status = {}
        self.errors = []
        self.targets = []
        self.tasks = set()
        for t in tasks:
            self.add_task(t)