Source code for alogos.warnings

"""All custom warnings used in the package."""

import warnings as _warnings

from ._utilities.operating_system import NEWLINE as _NEWLINE


__all__ = [
    "turn_on",
    "turn_off",
    "GrammarWarning",
    "OptimizationWarning",
    "DatabaseWarning",
]


[docs]def turn_on(): """Turn on all warnings of this package. Notes ----- This package uses Python's `warnings <https://docs.python.org/3/library/warnings.html>`__ module. This means that functions like `warnings.filterwarnings <https://docs.python.org/3/library/warnings.html#warnings.filterwarnings>`__ will have effect on the warnings issued by this package. """ for cat in _WARNINGS: _warnings.filterwarnings("always", category=cat)
[docs]def turn_off(): """Turn off all warnings of this package. Notes ----- This package uses Python's `warnings <https://docs.python.org/3/library/warnings.html>`__ module. This means that functions like `warnings.filterwarnings <https://docs.python.org/3/library/warnings.html#warnings.filterwarnings>`__ will have effect on the warnings issued by this package. """ for cat in _WARNINGS: _warnings.filterwarnings("ignore", category=cat)
[docs]class GrammarWarning(Warning): """Issued when a grammar is ill-formed but still usable. Examples -------- - The same production rule appears more than once. """
def _warn_multiple_grammar_specs(): message = ( "More than one grammar specification was provided. " "Only the first one is used in following order of precedence: " "bnf_text > bnf_file > ebnf_text > ebnf_file." ) _warnings.warn(message, category=GrammarWarning) def _warn_repeated_productions(redundant_rules): reported_text = _NEWLINE.join(redundant_rules) message = ( "Problematic grammar specification: Some production rules are " "redundant. This package can deal with it, but in general it " "is not recommended. In particular, it introduces bias in " "random string generation. Following rules are contained more " "than one time:{}{}".format(_NEWLINE, reported_text) ) _warnings.warn(message, category=GrammarWarning) def _warn_symbol_set_overlap(intersection): text = _NEWLINE.join( " {sym} as nonterminal <{sym}> and terminal " '"{sym}"'.format(sym=sym) for sym in intersection ) message = ( "Problematic grammar specification: " "The sets of nonterminal and terminal symbols are not " "disjoint, as required by the mathematical definition of a " "grammar. This package can deal with it, but in general it is " "not recommended. Following symbols appear in both sets:" "{}{}".format(_NEWLINE, text) ) _warnings.warn(message, category=GrammarWarning) def _warn_language_gen_stopped(max_steps): message = ( "Language generation stopped due to reaching max_steps={}, " "but it did not produce all possible strings yet. To explore " "it further, the max_steps parameter can be " "increased.".format(max_steps) ) _warnings.warn(message, category=GrammarWarning)
[docs]class OptimizationWarning(Warning): """Issued when an optimization algorithm might behave unexpected. Examples -------- - No optimization step was performed due to the parameter settings. """
def _warn_no_step_in_ea_performed(generation): message = ( "Started and stopped the run at generation {}. Nothing new was " "calculated because a stop criterion was immediately True and " "led to an exit before creating a new generation. " "If your intention is to re-run the search you can use the " "reset() method, which deletes the search state but preserves " "the current parameters.".format(generation) ) _warnings.warn(message, category=OptimizationWarning)
[docs]class DatabaseWarning(Warning): """Issued when a potential problem with a database occurs. Examples -------- - Not all the data could be imported from the database. - An import argument did not fit to the data and had to be ignored. """
def _warn_database_renamed(source, target): message = "Renamed database file from {} to {}.".format(repr(source), repr(target)) _warnings.warn(message, category=DatabaseWarning) def _warn_database_import_partial(): message = ( "Loaded data of a previous run from the provided filepath. " "Note, however, that the contained mapping data can not be " "added to a cache and therefore also can not be used to " 'prevent recalculations because the parameter "database_on" is ' "currently set to False." ) _warnings.warn(message, category=DatabaseWarning) def _warn_database_import_first(first_gen_in_db, first_generation): message = ( "The provided value for first generation ({}) is invalid. The " "first generation in the database ({}) was used " "instead.".format(first_generation, first_gen_in_db) ) _warnings.warn(message, category=DatabaseWarning) def _warn_database_import_last(last_gen_in_db, last_generation): message = ( "The provided value for last generation ({}) is invalid. The " "last generation in the database ({}) was used " "instead.".format(last_generation, last_gen_in_db) ) _warnings.warn(message, category=DatabaseWarning) def _warn_import_database_empty(filepath): message = ( "The database at filepath {} contains the correct table for " "phenotype-to-fitness evaluation data, but no entries are " "stored in it and therefore no data could be " "imported.".format(repr(filepath)) ) _warnings.warn(message, category=DatabaseWarning) _WARNINGS = [ GrammarWarning, OptimizationWarning, DatabaseWarning, ]