Module clingo.configuration
Functions and classes related to configuration.
Examples
The following example shows how to modify the configuration to enumerate all models:
>>> from clingo.control import Control
>>>
>>> ctl = Control()
>>> ctl.configuration.keys
['tester', 'solve', 'asp', 'solver', 'configuration', 'share',
'learn_explicit', 'sat_prepro', 'stats', 'parse_ext', 'parse_maxsat']
>>> ctl.configuration.solve.keys
['solve_limit', 'parallel_mode', 'global_restarts', 'distribute',
'integrate', 'enum_mode', 'project', 'models', 'opt_mode']
>>> ctl.configuration.solve.description("models")
'Compute at most %A models (0 for all)\n'
>>> ctl.configuration.solve.models = 0
>>> ctl.add("base", [], "1 {a; b}.")
>>> ctl.ground([("base", [])])
>>> print(ctl.solve(on_model=print))
b
a
a b
SAT
Expand source code
"""
Functions and classes related to configuration.
Examples
--------
The following example shows how to modify the configuration to enumerate all
models:
```python
>>> from clingo.control import Control
>>>
>>> ctl = Control()
>>> ctl.configuration.keys
['tester', 'solve', 'asp', 'solver', 'configuration', 'share',
'learn_explicit', 'sat_prepro', 'stats', 'parse_ext', 'parse_maxsat']
>>> ctl.configuration.solve.keys
['solve_limit', 'parallel_mode', 'global_restarts', 'distribute',
'integrate', 'enum_mode', 'project', 'models', 'opt_mode']
>>> ctl.configuration.solve.description("models")
'Compute at most %A models (0 for all)\\n'
>>> ctl.configuration.solve.models = 0
>>> ctl.add("base", [], "1 {a; b}.")
>>> ctl.ground([("base", [])])
>>> print(ctl.solve(on_model=print))
b
a
a b
SAT
```
"""
from typing import List, Optional, Union
from ._internal import _c_call, _ffi, _handle_error, _lib, _to_str
__all__ = ["Configuration"]
class Configuration:
"""
Allows for changing the configuration of the underlying solver.
Options are organized hierarchically. To change and inspect an option use:
config.group.subgroup.option = "value"
value = config.group.subgroup.option
There are also arrays of option groups that can be accessed using integer
indices:
config.group.subgroup[0].option = "value1"
config.group.subgroup[1].option = "value2"
To list the subgroups of an option group, use the `Configuration.keys`
member. Array option groups, like solver, can be iterated. Furthermore,
there are meta options having key `configuration`. Assigning a meta option
sets a number of related options. To get further information about an
option or option group, use `Configuration.description`.
Notes
-----
The value of an option is always a string and any value assigned to an
option is automatically converted into a string.
See Also
--------
clingo.control.Control.configuration
"""
def __init__(self, rep, key):
# Note: we have to bypass __setattr__ to avoid infinite recursion
super().__setattr__("_rep", rep)
super().__setattr__("_key", key)
@property
def _type(self) -> int:
return _c_call(
"clingo_configuration_type_bitset_t",
_lib.clingo_configuration_type,
self._rep,
self._key,
)
@property
def is_array(self) -> bool:
"""
This property is true if the configuration option is an array.
"""
return bool(self._type & _lib.clingo_configuration_type_array)
def _get_subkey(self, name: str) -> Optional[int]:
if self._type & _lib.clingo_configuration_type_map:
if _c_call(
"bool",
_lib.clingo_configuration_map_has_subkey,
self._rep,
self._key,
name.encode(),
):
return _c_call(
"clingo_id_t",
_lib.clingo_configuration_map_at,
self._rep,
self._key,
name.encode(),
)
return None
def __len__(self):
if self._type & _lib.clingo_configuration_type_array:
return _c_call(
"size_t", _lib.clingo_configuration_array_size, self._rep, self._key
)
return 0
def __getitem__(self, idx: int) -> "Configuration":
if idx < 0 or idx >= len(self):
raise IndexError("invalid index")
key = _c_call(
"clingo_id_t", _lib.clingo_configuration_array_at, self._rep, self._key, idx
)
return Configuration(self._rep, key)
def __getattr__(self, name: str) -> Union[None, str, "Configuration"]:
key = self._get_subkey(name)
if key is None:
raise AttributeError(f"no attribute: {name}")
type_ = _c_call(
"clingo_configuration_type_bitset_t",
_lib.clingo_configuration_type,
self._rep,
key,
)
if type_ & _lib.clingo_configuration_type_value:
if not _c_call(
"bool", _lib.clingo_configuration_value_is_assigned, self._rep, key
):
return None
size = _c_call(
"size_t", _lib.clingo_configuration_value_get_size, self._rep, key
)
c_val = _ffi.new("char[]", size)
_handle_error(
_lib.clingo_configuration_value_get(self._rep, key, c_val, size)
)
return _to_str(c_val)
return Configuration(self._rep, key)
def __setattr__(self, name: str, val) -> None:
key = self._get_subkey(name)
if key is None:
super().__setattr__(name, val)
else:
_handle_error(
_lib.clingo_configuration_value_set(self._rep, key, str(val).encode())
)
def description(self, name: str) -> str:
"""
Get a description for an option or option group.
Parameters
----------
name
The name of the option.
"""
key = self._get_subkey(name)
if key is None:
raise RuntimeError(f"unknown option {name}")
return _to_str(
_c_call("char*", _lib.clingo_configuration_description, self._rep, key)
)
@property
def keys(self) -> Optional[List[str]]:
"""
The list of names of sub-option groups or options.
The list is `None` if the current object is not an option group.
"""
ret = None
if self._type & _lib.clingo_configuration_type_map:
ret = []
for i in range(
_c_call(
"size_t", _lib.clingo_configuration_map_size, self._rep, self._key
)
):
name = _c_call(
"char*",
_lib.clingo_configuration_map_subkey_name,
self._rep,
self._key,
i,
)
ret.append(_to_str(name))
return ret
Classes
class Configuration (rep, key)
-
Allows for changing the configuration of the underlying solver.
Options are organized hierarchically. To change and inspect an option use:
config.group.subgroup.option = "value" value = config.group.subgroup.option
There are also arrays of option groups that can be accessed using integer indices:
config.group.subgroup[0].option = "value1" config.group.subgroup[1].option = "value2"
To list the subgroups of an option group, use the
Configuration.keys
member. Array option groups, like solver, can be iterated. Furthermore, there are meta options having keyconfiguration
. Assigning a meta option sets a number of related options. To get further information about an option or option group, useConfiguration.description()
.Notes
The value of an option is always a string and any value assigned to an option is automatically converted into a string.
See Also
Expand source code
class Configuration: """ Allows for changing the configuration of the underlying solver. Options are organized hierarchically. To change and inspect an option use: config.group.subgroup.option = "value" value = config.group.subgroup.option There are also arrays of option groups that can be accessed using integer indices: config.group.subgroup[0].option = "value1" config.group.subgroup[1].option = "value2" To list the subgroups of an option group, use the `Configuration.keys` member. Array option groups, like solver, can be iterated. Furthermore, there are meta options having key `configuration`. Assigning a meta option sets a number of related options. To get further information about an option or option group, use `Configuration.description`. Notes ----- The value of an option is always a string and any value assigned to an option is automatically converted into a string. See Also -------- clingo.control.Control.configuration """ def __init__(self, rep, key): # Note: we have to bypass __setattr__ to avoid infinite recursion super().__setattr__("_rep", rep) super().__setattr__("_key", key) @property def _type(self) -> int: return _c_call( "clingo_configuration_type_bitset_t", _lib.clingo_configuration_type, self._rep, self._key, ) @property def is_array(self) -> bool: """ This property is true if the configuration option is an array. """ return bool(self._type & _lib.clingo_configuration_type_array) def _get_subkey(self, name: str) -> Optional[int]: if self._type & _lib.clingo_configuration_type_map: if _c_call( "bool", _lib.clingo_configuration_map_has_subkey, self._rep, self._key, name.encode(), ): return _c_call( "clingo_id_t", _lib.clingo_configuration_map_at, self._rep, self._key, name.encode(), ) return None def __len__(self): if self._type & _lib.clingo_configuration_type_array: return _c_call( "size_t", _lib.clingo_configuration_array_size, self._rep, self._key ) return 0 def __getitem__(self, idx: int) -> "Configuration": if idx < 0 or idx >= len(self): raise IndexError("invalid index") key = _c_call( "clingo_id_t", _lib.clingo_configuration_array_at, self._rep, self._key, idx ) return Configuration(self._rep, key) def __getattr__(self, name: str) -> Union[None, str, "Configuration"]: key = self._get_subkey(name) if key is None: raise AttributeError(f"no attribute: {name}") type_ = _c_call( "clingo_configuration_type_bitset_t", _lib.clingo_configuration_type, self._rep, key, ) if type_ & _lib.clingo_configuration_type_value: if not _c_call( "bool", _lib.clingo_configuration_value_is_assigned, self._rep, key ): return None size = _c_call( "size_t", _lib.clingo_configuration_value_get_size, self._rep, key ) c_val = _ffi.new("char[]", size) _handle_error( _lib.clingo_configuration_value_get(self._rep, key, c_val, size) ) return _to_str(c_val) return Configuration(self._rep, key) def __setattr__(self, name: str, val) -> None: key = self._get_subkey(name) if key is None: super().__setattr__(name, val) else: _handle_error( _lib.clingo_configuration_value_set(self._rep, key, str(val).encode()) ) def description(self, name: str) -> str: """ Get a description for an option or option group. Parameters ---------- name The name of the option. """ key = self._get_subkey(name) if key is None: raise RuntimeError(f"unknown option {name}") return _to_str( _c_call("char*", _lib.clingo_configuration_description, self._rep, key) ) @property def keys(self) -> Optional[List[str]]: """ The list of names of sub-option groups or options. The list is `None` if the current object is not an option group. """ ret = None if self._type & _lib.clingo_configuration_type_map: ret = [] for i in range( _c_call( "size_t", _lib.clingo_configuration_map_size, self._rep, self._key ) ): name = _c_call( "char*", _lib.clingo_configuration_map_subkey_name, self._rep, self._key, i, ) ret.append(_to_str(name)) return ret
Instance variables
var is_array : bool
-
This property is true if the configuration option is an array.
Expand source code
@property def is_array(self) -> bool: """ This property is true if the configuration option is an array. """ return bool(self._type & _lib.clingo_configuration_type_array)
var keys : Optional[List[str]]
-
The list of names of sub-option groups or options.
The list is
None
if the current object is not an option group.Expand source code
@property def keys(self) -> Optional[List[str]]: """ The list of names of sub-option groups or options. The list is `None` if the current object is not an option group. """ ret = None if self._type & _lib.clingo_configuration_type_map: ret = [] for i in range( _c_call( "size_t", _lib.clingo_configuration_map_size, self._rep, self._key ) ): name = _c_call( "char*", _lib.clingo_configuration_map_subkey_name, self._rep, self._key, i, ) ret.append(_to_str(name)) return ret
Methods
def description(self, name: str) ‑> str
-
Get a description for an option or option group.
Parameters
name
- The name of the option.
Expand source code
def description(self, name: str) -> str: """ Get a description for an option or option group. Parameters ---------- name The name of the option. """ key = self._get_subkey(name) if key is None: raise RuntimeError(f"unknown option {name}") return _to_str( _c_call("char*", _lib.clingo_configuration_description, self._rep, key) )