def __init__(self, parameters=None): if parameters is None: parameters = {} self.parameters = parameters self.parameters.setdefault('zed', 1) self.psf = None self.target = None self.phantom = True if 'logging' not in gparameters: gparameters.logging = DictionaryObject({'path': '.'}) gparameters.generation = 0 gparameters.mpi = DictionaryObject({'rank': 0}) # Set default normalization to E = E/nprotons if "normalize" not in self.parameters: self.parameters.setdefault("normalize", {}) self.parameters['normalize'].setdefault('nprotons', True) self.parameters['normalize'].setdefault('SSE', False) # If running within StructOpt, create directory for saving files # and faster loading of PSF and target data path = os.path.join(gparameters.logging.path, 'fitness/STEM') path = os.path.join(path, 'rank-{}'.format(gparameters.mpi.rank)) self.path = path os.makedirs(self.path, exist_ok=True)
def __init__(self, dir): self.genealogy_file = os.path.join(dir, 'genealogy.log') self.fitnesses_file = os.path.join(dir, 'fitnesses.log') self.XYZs = os.path.join(dir, 'XYZs') # Load input parameters from output file self.output_file = os.path.join(dir, 'output.log') parameters = [] start_flag = False for line in open(self.output_file): if 'Current parameters:' in line: start_flag = True continue if start_flag: if 'INFO : {' in line: line = line.split('INFO : ')[1] parameters.append(line) if line == '}\n': start_flag = False break parameters = ''.join(parameters) self.parameters = DictionaryObject(json.loads(parameters)) sys.modules['gparameters'] = self.parameters self.generations = Generations(self.genealogy_file) for population in self.generations: for individual in population.values(): individual.filename = os.path.join( self.XYZs, 'generation{}'.format(individual.created_on), 'individual{}.xyz'.format(individual.id)) individual.parameters = DictionaryObject( self.parameters.copy())
def __init__(self, parameters): # These variables never change self.parameters = parameters if 'logging' not in gparameters: gparameters.logging = DictionaryObject({'path': '.'}) gparameters.generation = 0 gparameters.mpi = DictionaryObject({'rank': 0}) self.output_dir = gparameters.logging.path # Set default normalization to E = E/natoms if "normalize" not in self.parameters: self.parameters.setdefault("normalize", {}) self.parameters.normalize.setdefault('natoms', True)
def set_default(parameters): paramters = set_default_mpi_parameters(parameters) parameters.setdefault('logging', {}) if "path" in parameters.logging: raise ValueError( "'path' should not be defined in the parameter file currently. If you think you want to define it, talk to the developers about why." ) # If parallel and no seed, all nodes need the same seed and same path if parameters.mpi.ncores > 1: from mpi4py import MPI seed = MPI.COMM_WORLD.bcast(int(time.time()), root=0) path = MPI.COMM_WORLD.bcast(os.path.join( os.getcwd(), "logs{}".format(time.strftime("%Y%m%d%H%M%S"))), root=0) else: seed = None path = os.path.join(os.getcwd(), "logs{}".format(time.strftime("%Y%m%d%H%M%S"))) parameters.logging.path = path parameters.setdefault('seed', seed) parameters.setdefault('post_processing', DictionaryObject({})) parameters.post_processing.setdefault('XYZs', 0) parameters.setdefault('fingerprinters', DictionaryObject({'options': []})) parameters.convergence.setdefault('max_generations', 10) if 'relaxations' not in parameters or not parameters['relaxations']: raise ValueError( 'Relaxations must be specified in the parameter file.') if 'fitnesses' not in parameters or not parameters['fitnesses']: raise ValueError('Fitnesses must be specified in the parameter file.') # Make sure every operation is defined, and that every operation has a # kwargs for operation in MODULES: parameters.setdefault(operation, None) if parameters[operation] is not None: for operator in parameters[operation]: if operator not in EXCEPTION_FUNCTIONS: parameters[operation][operator].setdefault('kwargs', {}) return parameters
def read(input): """Sets StructOpt parameters from a dictionary or filename""" # Read and store the input if isinstance(input, dict): parameters = input elif isinstance(input, str) and os.path.exists(input): parameters = DictionaryObject(json.load(open(input))) else: raise IOError('Error in input or input file') parameters = set_default(parameters) return parameters
def parameters(self): parameters = [] start_flag = False for line in open(self.output_file): if 'Current parameters:' in line: start_flag = True continue if start_flag: if 'INFO : {' in line: line = line.split('INFO : ')[1] parameters.append(line) if line == '}\n': start_flag = False break parameters = ''.join(parameters) parameters = DictionaryObject(json.loads(parameters)) sys.modules['gparameters'] = parameters return parameters
import logging import sys import os import json from structopt.tools.dictionaryobject import DictionaryObject sys.modules['gparameters'] = DictionaryObject({}) from structopt.io.parameters import read as read_parameters from structopt.io.parameters import write as write_parameters from structopt.io.logger_utils import initialize_logger, initialize_logger_for_root from structopt import common def setup(parameter_file): # Read in the parameters parameters = read_parameters(parameter_file) sys.modules['gparameters'].update(parameters) # Setup all the loggers logging_level = parameters.logging.get("logging_level", "info") logging_level = getattr(logging, logging_level.upper()) rank = parameters.mpi.rank path = parameters.logging.path os.makedirs(path, exist_ok=True) os.makedirs(os.path.join(path, 'modelfiles'), exist_ok=True) if rank == 0: print("Logging directory:", path) logger = initialize_logger_for_root(rank=rank, filename=os.path.join(path, 'output.log'), name="output", level=logging_level)
from structopt.common.population import Population from structopt.tools.dictionaryobject import DictionaryObject import structopt parameters = structopt.setup( DictionaryObject({ "structure_type": "cluster", "generators": { "sphere": { "number_of_individuals": 2, "kwargs": { "atomlist": [["Au", 55]], "cell": [20, 20, 20] } } }, "fingerprinters": { "all_close_atom_positions": { "probability": 1.0 } }, })) def test_all_close_atom_postions(): parameters.fingerprinters = { "keep_best": True, "all_close_atom_positions": { "probability": 1.0, "kwargs": {} }
def set_default(parameters): paramters = set_default_mpi_parameters(parameters) parameters.setdefault('logging', {}) if "path" in parameters.logging: raise ValueError( "'path' should not be defined in the parameter file currently. If you think you want to define it, talk to the developers about why." ) # If parallel and no seed, all nodes need the same seed and same path path_extension = time.strftime("%Y%m%d%H%M%S") if len(sys.argv) > 2: path_extension += '_' + sys.argv[2] if parameters.mpi.ncores > 1: from mpi4py import MPI seed = MPI.COMM_WORLD.bcast(int(time.time()), root=0) path_extension = MPI.COMM_WORLD.bcast(path_extension, root=0) path = MPI.COMM_WORLD.bcast(os.path.join( os.getcwd(), "logs{}".format(path_extension)), root=0) else: seed = None path = os.path.join(os.getcwd(), "logs{}".format(path_extension)) parameters.logging.path = path parameters.setdefault('seed', seed) parameters.setdefault('post_processing', DictionaryObject({})) if 'post_processing' in parameters: parameters.post_processing.setdefault('XYZs', -1) parameters.setdefault('fingerprinters', DictionaryObject({})) if 'convergence' in parameters: parameters.convergence.setdefault('max_generations', 10) if 'fingerprinters' in parameters: parameters.fingerprinters.setdefault('keep_best', False) try: parameters.fitnesses.FEMSIM.skip_bad_lammps = False except: pass try: # Set default LAMMPS normalization to E = E/natoms parameters.fitnesses.LAMMPS.setdefault("normalize", {}) parameters.fitnesses.LAMMPS.normalize.setdefault('natoms', True) except: pass try: # Set default STEM normalization to E = E/nprotons parameters.fitnesses.STEM.setdefault("normalize", {}) parameters.fitnesses.STEM.normalize.setdefault('nprotons', True) parameters.fitnesses.STEM.normalize.setdefault('SSE', False) except: pass # Make sure every operation is defined, and that every operation has a # kwargs for operation in MODULES: parameters.setdefault(operation, None) if parameters[operation] is not None: for operator in parameters[operation]: if operator not in EXCEPTION_FUNCTIONS: parameters[operation][operator].setdefault('kwargs', {}) return parameters