Source code for magni.cs.phase_transition._util
"""
..
Copyright (c) 2014-2017, Magni developers.
All rights reserved.
See LICENSE.rst for further information.
Module providing the public function of the magni.cs.phase_transition
subpackage.
"""
from __future__ import division
import os
import re
import types
from magni.cs.phase_transition import _analysis
from magni.cs.phase_transition import _simulation
from magni.utils.multiprocessing import File as _File
from magni.utils.validation import decorate_validation as _decorate_validation
from magni.utils.validation import validate_generic as _generic
from magni.utils.validation import validate_numeric as _numeric
[docs]def determine(algorithm, path, label='default', overwrite=False,
pre_simulation_hook=None):
"""
Determine the phase transition of a reconstruction algorithm.
The phase transition is determined from a number of monte carlo simulations
on a delta-rho grid for a given problem suite.
Parameters
----------
algorithm : function
A function handle to the reconstruction algorithm.
path : str
The path of the HDF5 database where the results should be stored.
label : str
The label assigned to the phase transition (the default is 'default').
overwrite : bool
A flag indicating if an existing phase transition should be overwritten
if it has the same path and label (the default is False).
pre_simulation_hook : callable
A handle to a callable which should be run *just* before the call to
the reconstruction algorithm (the default is None, which implies that
no pre hook is run).
See Also
--------
magni.cs.phase_transition._simulation.run : The actual simulation.
magni.cs.phase_transition._analysis.run : The actual phase determination.
Notes
-----
The `pre_simulation_hook` may be used to setup the simulation to match the
specfic simulation parameters, e.g. if an oracle estimator is used in the
reconstruction algorithm. The `pre_simulation_hook` takes one argument
which is the locals() dict.
Examples
--------
An example of how to use this function is provided in the `examples` folder
in the `cs-phase_transition.ipynb` ipython notebook file.
"""
@_decorate_validation
def validate_input():
_generic('algorithm', 'function')
_generic('path', 'string')
_generic('label', 'string')
# regular expression matching invalid characters
match = re.search(r'[^a-zA-Z0-9 ,.\-_/]', label)
if match is not None:
msg = 'The value of >>label<<, {!r}, may not contain {!r}.'
raise RuntimeError(msg.format(label, match.group()))
# regular expression matching labels without empty path components
match = re.search(r'^([^/]+/)*[^/]+$', label)
if match is None:
msg = "The value of >>label<<, {!r}, may not contain '' folders."
raise RuntimeError(msg.format(label))
_numeric('overwrite', 'boolean')
if (pre_simulation_hook is not None and
not callable(pre_simulation_hook)):
raise RuntimeError('The >>pre_simulation_hook<< must be callable')
validate_input()
if os.path.isfile(path):
with _File(path, 'a') as f:
if '/' + label in f:
if overwrite:
f.remove_node('/' + label, recursive=True)
else:
raise IOError("{!r} already uses the label {!r}."
.format(path, label))
_simulation.run(algorithm, path, label,
pre_simulation_hook=pre_simulation_hook)
_analysis.run(path, label)