Source code for pylada.jobfolder

###############################
#  This file is part of PyLaDa.
#
#  Copyright (C) 2013 National Renewable Energy Lab
# 
#  PyLaDa is a high throughput computational platform for Physics. It aims to make it easier to submit
#  large numbers of jobs on supercomputers. It provides a python interface to physical input, such as
#  crystal structures, as well as to a number of DFT (VASP, CRYSTAL) and atomic potential programs. It
#  is able to organise and launch computational jobs on PBS and SLURM.
# 
#  PyLaDa is free software: you can redistribute it and/or modify it under the terms of the GNU General
#  Public License as published by the Free Software Foundation, either version 3 of the License, or (at
#  your option) any later version.
# 
#  PyLaDa is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
#  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
#  Public License for more details.
# 
#  You should have received a copy of the GNU General Public License along with PyLaDa.  If not, see
#  <http://www.gnu.org/licenses/>.
###############################

""" Classes and functions pertaining to job-management. 

    The  :py:mod:`pylada.jobfolder` provides tools for high-throughput calculations.
    It is centered around an object - the job-folder - which organizes calculations
    within a tree of folders, much as one would manually organize calculations
    within a tree of directories. Each folder can be executable, e.g.  there is
    something to compute there, or non-executable. And each folder can further hold
    any number of sub-folders. Furthermore, classes are provided which make it easy
    to manipulate the parameters for the calculations in an executable folder, as
    well as within all subfolders. Finally, a similar infrastructure is provided to
    collect the computational results across all executable sub-folders.

    .. seealso:: :ref:`jobfolder_ug`
"""
__docformat__ = "restructuredtext en"
__all__ = ['JobFolder', 'walk_through', 'save', 'load', 'MassExtract',
           'AbstractMassExtract', 'JobParams' ]

from .jobfolder import JobFolder
from .manipulator import JobParams
from .extract import AbstractMassExtract
from .massextract import MassExtract 

[docs]def save(jobfolder, path='jobfolder.dict', overwrite=False, timeout=None): """ Pickles a job-folder to file. :param jobfolder: A job-dictionary to pickle. :type jobfolder: :py:class:`~jobfolder.JobFolder` :param str path: filename of file to which to save pickle. overwritten. If None then saves to "pickled_jobfolder" :param int timeout: How long to wait when trying to acquire lock on file. Defaults to forever. :param bool overwrite: if True, then overwrites file. This method first acquire an exclusive lock on the file before writing (see :py:meth:`pylada.misc.open_exclusive`). This way not two processes can read/write to this file while using this function. """ from os.path import exists from pickle import dump from ..misc import open_exclusive, RelativePath from .. import is_interactive path = RelativePath(path).path if exists(path) and not overwrite: if is_interactive: print path, "exists. Please delete first if you want to save the job folder." return else: raise IOError('{0} already exists. By default, will not overwrite.'.format(path)) with open_exclusive(path, "wb", timeout=timeout) as file: dump(jobfolder, file) if is_interactive: print "Saved job folder to {0}.".format(path)
[docs]def load(path='jobfolder.dict', timeout=None): """ Unpickles a job-folder from file. :param str path: Filename of a pickled job-folder. :param int timeout: How long to wait when trying to acquire lock on file. Defaults to forever. :return: Returns a JobFolder object. This method first acquire an exclusive lock on the file before reading. This way not two processes can read/write to this file while using this function. """ from os.path import exists from pickle import load as load_pickle from ..misc import open_exclusive, RelativePath from .. import is_interactive path = "job.dict" if path is None else RelativePath(path).path if not exists(path): raise IOError("File " + path + " does not exist.") with open_exclusive(path, "rb", timeout=timeout) as file: result = load_pickle(file) if is_interactive: print "Loaded job list from {0}.".format(path) return result