1"""Configuration utilities for polynomial manipulation algorithms. """
2
3
4from contextlib import contextmanager
5
6_default_config = {
7    'USE_COLLINS_RESULTANT':      False,
8    'USE_SIMPLIFY_GCD':           True,
9    'USE_HEU_GCD':                True,
10
11    'USE_IRREDUCIBLE_IN_FACTOR':  False,
12    'USE_CYCLOTOMIC_FACTOR':      True,
13
14    'EEZ_RESTART_IF_NEEDED':      True,
15    'EEZ_NUMBER_OF_CONFIGS':      3,
16    'EEZ_NUMBER_OF_TRIES':        5,
17    'EEZ_MODULUS_STEP':           2,
18
19    'GF_IRRED_METHOD':            'rabin',
20    'GF_FACTOR_METHOD':           'zassenhaus',
21
22    'GROEBNER':                   'buchberger',
23}
24
25_current_config = {}
26
27@contextmanager
28def using(**kwargs):
29    for k, v in kwargs.items():
30        setup(k, v)
31
32    yield
33
34    for k in kwargs.keys():
35        setup(k)
36
37def setup(key, value=None):
38    """Assign a value to (or reset) a configuration item. """
39    key = key.upper()
40
41    if value is not None:
42        _current_config[key] = value
43    else:
44        _current_config[key] = _default_config[key]
45
46
47def query(key):
48    """Ask for a value of the given configuration item. """
49    return _current_config.get(key.upper(), None)
50
51
52def configure():
53    """Initialized configuration of polys module. """
54    from os import getenv
55
56    for key, default in _default_config.items():
57        value = getenv('SYMPY_' + key)
58
59        if value is not None:
60            try:
61                _current_config[key] = eval(value)
62            except NameError:
63                _current_config[key] = value
64        else:
65            _current_config[key] = default
66
67configure()
68