class Nettuno:
    '''Main Nettuno class containing EnsembleCollection and Optimizer objects'''

    def __init__(self, optimizer, init_filename=".nettuno", log_level=0):
        self.init_filename = init_filename
        self.ensemble_collection = EnsembleCollection(log_level)
        # self.optimizer = Optimizer()
        if optimizer == "steepest_descent":
            self.optimizer = SteepestDescentOptimizer(log_level)
        else:
            print "Unknown optimization algorithm: %s. Aborting." % optimizer
            sys.exit(1)
        self.read_init_file()

    def read_init_file(self):
        '''Reads configuration file'''
        self.ensemble_collection.read_init_file(self.init_filename)
        self.optimizer.read_init_file(self.init_filename)
    
    def output_init_file(self, init_file_output):
        '''Writes configuration file'''
        if init_file_output == self.init_filename:
            backup_name = self.init_filename + "_"+ datetime.datetime.today().isoformat("-")
            shutil.copyfile(self.init_filename, backup_name)

        if init_file_output == "stdout":
            print "### Nettuno settings output ###\n"
            print repr(self),
            print "###############################"
        else :
            init_file = open(self.init_filename, "w")
            init_file.write(repr(self))
            init_file.close()

    def get_ensemble_collection(self):
        '''Retrieve EnsembleCollection object'''
        return self.ensemble_collection

    def get_optimizer(self):
        '''Retrieve Optimizer object'''
        return self.optimizer

    def optimize(self):
        '''Start optimization procedure'''
        if len(self.ensemble_collection) > 0:
            self.optimizer.optimize(self.ensemble_collection)

    def __repr__(self):
        return repr(self.optimizer) + "\n" + repr(self.ensemble_collection)
 def __init__(self, optimizer, init_filename=".nettuno", log_level=0):
     self.init_filename = init_filename
     self.ensemble_collection = EnsembleCollection(log_level)
     # self.optimizer = Optimizer()
     if optimizer == "steepest_descent":
         self.optimizer = SteepestDescentOptimizer(log_level)
     else:
         print "Unknown optimization algorithm: %s. Aborting." % optimizer
         sys.exit(1)
     self.read_init_file()