def make_default_organism_creator(composition_space, constraints): """ Returns a list containing a RandomOrganismCreator, or quits. Args: composition_space: the CompositionSpace of the search constraints: the Constraints of the search """ if composition_space.objective_function == 'pd': print('For phase diagram searches, reference structures at each ' 'endpoint of the composition space must be provided in the ' 'initial population.') print('Please use the "from_files" keyword in the ' 'InitialPopulation block to provide the reference ' 'structures.') print('Quitting...') quit() else: random_organism_creator = organism_creators.RandomOrganismCreator( 'default', composition_space, constraints) return [random_organism_creator]
def make_organism_creators(parameters, composition_space, constraints): """ Returns a list containing organism creator objects. Args: parameters: the dictionary produced by calling yaml.load() on the input file composition_space: the CompositionSpace of the search constraints: the Constraints of the search """ if 'InitialPopulation' not in parameters: return make_default_organism_creator(composition_space, constraints) elif parameters['InitialPopulation'] in (None, 'default'): return make_default_organism_creator(composition_space, constraints) # make the specified creators else: # check that at least one valid option is used # TODO: if other organism creators are used, check them here as well if 'random' not in parameters['InitialPopulation'] and 'from_files' \ not in parameters['InitialPopulation']: print('At least one valid option for making structures for the ' 'initial population must be provided.') print('Please use the "random" and/or "from_files" keywords in ' 'the InitialPopulation block.') print('Quitting...') quit() initial_organism_creators = [] # the random organism creator if 'random' in parameters['InitialPopulation']: random_organism_creator = organism_creators.RandomOrganismCreator( parameters['InitialPopulation']['random'], composition_space, constraints) initial_organism_creators.append(random_organism_creator) # the from files organism creator if 'from_files' not in parameters['InitialPopulation']: if composition_space.objective_function == 'pd': print('For phase diagram searches, reference structures at ' 'each endpoint of the composition space must be ' 'provided.') print('Please use the "from_files" keyword in the ' 'InitialPopulation block to provide the reference ' 'structures.') print('Quitting...') quit() # if nothing is given after the from_files keyword elif parameters['InitialPopulation']['from_files'] is None: print('The path to the folder containing the files must be ' 'provided. Please use the "path_to_folder" keyword.') print('Quitting...') quit() # if path_to_folder keyword is not given elif 'path_to_folder' not in parameters['InitialPopulation'][ 'from_files']: print('Incorrect keyword given after "from_files" in the ' 'InitialPopulation block. Please use the "path_to_folder" ' 'keyword.') print('Quitting...') quit() else: given_path = parameters['InitialPopulation']['from_files'][ 'path_to_folder'] # if no path was given after path_to_folder keyword if given_path is None: print('The path to the folder containing the files for the ' 'initial population must be provided. Please give the ' 'path after the "path_to_folder" keyword.') print('Quitting...') quit() # if the given path does not exist elif not os.path.exists(given_path): print('The given folder containing structures for the initial ' 'population does not exist.') print('Quitting...') quit() # if the folder exists, check that it contains files elif len([ f for f in os.listdir(given_path) if os.path.isfile(os.path.join(given_path, f)) ]) == 0: print('The given folder containing structures for the initial ' 'population does not contain any files.') print('Quitting...') quit() else: files_organism_creator = organism_creators.FileOrganismCreator( given_path) # check that the files cover all composition space endpoints if composition_space.objective_function == 'pd': cells = files_organism_creator.get_cells() provided_endpoints = [] for endpoint in composition_space.endpoints: for cell in cells: if cell.composition.reduced_composition.almost_equals( endpoint.reduced_composition) and \ endpoint not in provided_endpoints: provided_endpoints.append(endpoint) # check if we got them all for endpoint in composition_space.endpoints: if endpoint not in provided_endpoints: print('Error: valid structure files not provided ' 'to the initial population for all ' 'endpoints of the composition space.') print('Quitting...') quit() initial_organism_creators.append(files_organism_creator) # TODO: if other organism creators are used, they should be # instantiated here return initial_organism_creators