Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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())
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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": {}
        }
Exemplo n.º 9
0
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