danielutils 1.1.28__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- danielutils/__init__.py +50 -0
- danielutils/abstractions/__init__.py +3 -0
- danielutils/abstractions/db/__init__.py +10 -0
- danielutils/abstractions/db/database.py +206 -0
- danielutils/abstractions/db/database_definitions.py +219 -0
- danielutils/abstractions/db/database_exceptions.py +34 -0
- danielutils/abstractions/db/database_factory.py +70 -0
- danielutils/abstractions/db/database_initializer.py +261 -0
- danielutils/abstractions/db/database_models.py +213 -0
- danielutils/abstractions/db/dependencies.py +6 -0
- danielutils/abstractions/db/implementations/__init__.py +4 -0
- danielutils/abstractions/db/implementations/in_memory_database.py +365 -0
- danielutils/abstractions/db/implementations/persistent_in_memory_database.py +174 -0
- danielutils/abstractions/db/implementations/redis_database.py +403 -0
- danielutils/abstractions/db/implementations/sqlite_database.py +491 -0
- danielutils/abstractions/multiprogramming/__init__.py +3 -0
- danielutils/abstractions/multiprogramming/multi_id.py +26 -0
- danielutils/abstractions/multiprogramming/worker.py +104 -0
- danielutils/abstractions/multiprogramming/worker_pool.py +98 -0
- danielutils/abstractions/repl.py +125 -0
- danielutils/aliases.py +174 -0
- danielutils/async_/__init__.py +7 -0
- danielutils/async_/async_cmd.py +28 -0
- danielutils/async_/async_command.py +879 -0
- danielutils/async_/async_layered_command.py +125 -0
- danielutils/async_/async_retry_executor.py +86 -0
- danielutils/async_/async_worker_pool.py +110 -0
- danielutils/async_/time_strategy.py +73 -0
- danielutils/async_/utils.py +57 -0
- danielutils/better_builtins/__init__.py +3 -0
- danielutils/better_builtins/counter.py +48 -0
- danielutils/better_builtins/frange.py +266 -0
- danielutils/better_builtins/typed_builtins/__init__.py +4 -0
- danielutils/better_builtins/typed_builtins/factory.py +126 -0
- danielutils/better_builtins/typed_builtins/tdict.py +36 -0
- danielutils/better_builtins/typed_builtins/tlist.py +223 -0
- danielutils/better_builtins/typed_builtins/tset.py +67 -0
- danielutils/better_builtins/typed_builtins/ttuple.py +15 -0
- danielutils/colors.py +203 -0
- danielutils/context_managers/__init__.py +5 -0
- danielutils/context_managers/attr_context.py +40 -0
- danielutils/context_managers/multi_context.py +34 -0
- danielutils/context_managers/optional_context.py +33 -0
- danielutils/context_managers/state_context.py +25 -0
- danielutils/context_managers/temporary_file.py +108 -0
- danielutils/convenience.py +12 -0
- danielutils/conversions/__init__.py +2 -0
- danielutils/conversions/main_conversions.py +131 -0
- danielutils/conversions/specialized_conversions/__init__.py +2 -0
- danielutils/conversions/specialized_conversions/to_hex.py +25 -0
- danielutils/conversions/specialized_conversions/to_int.py +19 -0
- danielutils/custom_types.py +18 -0
- danielutils/data_structures/__init__.py +8 -0
- danielutils/data_structures/algorithms.py +52 -0
- danielutils/data_structures/comparer.py +47 -0
- danielutils/data_structures/default_dict.py +23 -0
- danielutils/data_structures/functions.py +35 -0
- danielutils/data_structures/graph/__init__.py +4 -0
- danielutils/data_structures/graph/binary_node.py +71 -0
- danielutils/data_structures/graph/graph.py +208 -0
- danielutils/data_structures/graph/multinode.py +101 -0
- danielutils/data_structures/graph/node.py +60 -0
- danielutils/data_structures/heap/__init__.py +3 -0
- danielutils/data_structures/heap/heap.py +119 -0
- danielutils/data_structures/heap/max_heap.py +18 -0
- danielutils/data_structures/heap/min_heap.py +18 -0
- danielutils/data_structures/queue/__init__.py +3 -0
- danielutils/data_structures/queue/atomic_queue.py +15 -0
- danielutils/data_structures/queue/priority_queue.py +110 -0
- danielutils/data_structures/queue/queue.py +92 -0
- danielutils/data_structures/stack.py +102 -0
- danielutils/data_structures/trees/__init__.py +2 -0
- danielutils/data_structures/trees/binary_syntax_tree.py +84 -0
- danielutils/data_structures/trees/binary_tree.py +63 -0
- danielutils/date.py +43 -0
- danielutils/date_time.py +23 -0
- danielutils/decorators/__init__.py +18 -0
- danielutils/decorators/atomic.py +45 -0
- danielutils/decorators/attach.py +61 -0
- danielutils/decorators/chain_decorators.py +39 -0
- danielutils/decorators/decorate_conditionally.py +32 -0
- danielutils/decorators/delay_call.py +47 -0
- danielutils/decorators/deprecate.py +46 -0
- danielutils/decorators/final.py +39 -0
- danielutils/decorators/limit_recursion.py +63 -0
- danielutils/decorators/memo.py +68 -0
- danielutils/decorators/normalize_decorator.py +55 -0
- danielutils/decorators/overload.py +204 -0
- danielutils/decorators/partially_implemented.py +32 -0
- danielutils/decorators/processify.py +74 -0
- danielutils/decorators/property.py +42 -0
- danielutils/decorators/singleton.py +59 -0
- danielutils/decorators/threadify.py +40 -0
- danielutils/decorators/timeout.py +82 -0
- danielutils/decorators/total_ordering.py +82 -0
- danielutils/decorators/validate.py +227 -0
- danielutils/exceptions.py +90 -0
- danielutils/functions/__init__.py +13 -0
- danielutils/functions/areoneof.py +47 -0
- danielutils/functions/check_foreach.py +39 -0
- danielutils/functions/factorial.py +24 -0
- danielutils/functions/flatten.py +33 -0
- danielutils/functions/foreach.py +20 -0
- danielutils/functions/isoftype.py +475 -0
- danielutils/functions/isoneof.py +71 -0
- danielutils/functions/multiloop.py +51 -0
- danielutils/functions/parallel_for.py +47 -0
- danielutils/functions/partition.py +45 -0
- danielutils/functions/powerset.py +31 -0
- danielutils/functions/subseteq.py +25 -0
- danielutils/functions/types_subseteq.py +51 -0
- danielutils/generators/__init__.py +3 -0
- danielutils/generators/conditional_generator.py +59 -0
- danielutils/generators/generator_from_stream.py +31 -0
- danielutils/generators/join_generators.py +109 -0
- danielutils/internet.py +92 -0
- danielutils/io_.py +451 -0
- danielutils/java/__init__.py +18 -0
- danielutils/java/interfaces/__init__.py +1 -0
- danielutils/java/interfaces/comparable.py +31 -0
- danielutils/java/java_interface.py +59 -0
- danielutils/logging_/__init__.py +2 -0
- danielutils/logging_/_impl/__init__.py +4 -0
- danielutils/logging_/_impl/builtin_impls/__init__.py +2 -0
- danielutils/logging_/_impl/builtin_impls/file_logger.py +35 -0
- danielutils/logging_/_impl/builtin_impls/print_logger.py +21 -0
- danielutils/logging_/_impl/log_level.py +13 -0
- danielutils/logging_/_impl/logger.py +109 -0
- danielutils/logging_/_impl/logger_strategy_impl_base.py +37 -0
- danielutils/logging_/utils.py +199 -0
- danielutils/lombok/__init__.py +1 -0
- danielutils/lombok/builder.py +68 -0
- danielutils/math_/__init__.py +2 -0
- danielutils/math_/constants.py +103 -0
- danielutils/math_/functions.py +34 -0
- danielutils/math_/math_print.py +52 -0
- danielutils/math_/math_symbols.py +125 -0
- danielutils/metaclasses/__init__.py +5 -0
- danielutils/metaclasses/atomic_class_meta.py +36 -0
- danielutils/metaclasses/implicit_data_deleter_meta.py +87 -0
- danielutils/metaclasses/instance_cache_meta.py +66 -0
- danielutils/metaclasses/interface.py +328 -0
- danielutils/metaclasses/overload_meta.py +48 -0
- danielutils/mock_/__init__.py +1 -0
- danielutils/mock_/mock_module.py +27 -0
- danielutils/path.py +55 -0
- danielutils/print_.py +123 -0
- danielutils/progress_bar/__init__.py +3 -0
- danielutils/progress_bar/ascii_progress_bar.py +161 -0
- danielutils/progress_bar/progress_bar.py +75 -0
- danielutils/progress_bar/progress_bar_pool.py +72 -0
- danielutils/protocols/__init__.py +3 -0
- danielutils/protocols/dictable.py +38 -0
- danielutils/protocols/evaluable.py +26 -0
- danielutils/protocols/serializable.py +51 -0
- danielutils/py.typed +0 -0
- danielutils/random_.py +47 -0
- danielutils/reflection/__init__.py +6 -0
- danielutils/reflection/declarations.py +288 -0
- danielutils/reflection/file/__init__.py +1 -0
- danielutils/reflection/file/file_reflection.py +85 -0
- danielutils/reflection/function/__init__.py +1 -0
- danielutils/reflection/function/function_reflections.py +152 -0
- danielutils/reflection/info_classes/__init__.py +6 -0
- danielutils/reflection/info_classes/argument_info.py +278 -0
- danielutils/reflection/info_classes/class_info.py +204 -0
- danielutils/reflection/info_classes/decorator_info.py +54 -0
- danielutils/reflection/info_classes/file_info.py +1180 -0
- danielutils/reflection/info_classes/folder_info.py +592 -0
- danielutils/reflection/info_classes/function_info.py +551 -0
- danielutils/reflection/info_classes/import_info.py +207 -0
- danielutils/reflection/interpreter/__init__.py +9 -0
- danielutils/reflection/interpreter/callstack.py +57 -0
- danielutils/reflection/interpreter/get_traceback.py +27 -0
- danielutils/reflection/interpreter/interpreter.py +41 -0
- danielutils/reflection/interpreter/is_debugging.py +13 -0
- danielutils/reflection/interpreter/os_.py +33 -0
- danielutils/reflection/interpreter/packages.py +33 -0
- danielutils/reflection/interpreter/python_version.py +33 -0
- danielutils/reflection/interpreter/signals.py +18 -0
- danielutils/reflection/interpreter/tracer.py +175 -0
- danielutils/reflection/module/__init__.py +3 -0
- danielutils/reflection/module/lazy_module.py +104 -0
- danielutils/reflection/module/module_reflections.py +34 -0
- danielutils/reflection/module/package_reflection.py +161 -0
- danielutils/retry_executor/__init__.py +3 -0
- danielutils/retry_executor/backoff_strategies/__init__.py +6 -0
- danielutils/retry_executor/backoff_strategies/constant_backoff.py +25 -0
- danielutils/retry_executor/backoff_strategies/exponential_backoff.py +26 -0
- danielutils/retry_executor/backoff_strategies/functional_backoff.py +29 -0
- danielutils/retry_executor/backoff_strategies/linear_backoff.py +23 -0
- danielutils/retry_executor/backoff_strategies/multiplicative_backoff.py +23 -0
- danielutils/retry_executor/backoff_strategies/no_backoff.py +17 -0
- danielutils/retry_executor/backoff_strategy.py +28 -0
- danielutils/retry_executor/retry_executor.py +55 -0
- danielutils/snippets/__init__.py +1 -0
- danielutils/snippets/try_get.py +28 -0
- danielutils/system/__init__.py +3 -0
- danielutils/system/independent.py +197 -0
- danielutils/system/layered_command.py +130 -0
- danielutils/system/windows/__init__.py +2 -0
- danielutils/system/windows/utils/__init__.py +1 -0
- danielutils/system/windows/utils/filetime.py +19 -0
- danielutils/system/windows/win32_ctime.py +183 -0
- danielutils/system/windows/windows.py +78 -0
- danielutils/testing/__init__.py +1 -0
- danielutils/testing/unittest_/__init__.py +2 -0
- danielutils/testing/unittest_/always_teardown_testcase.py +75 -0
- danielutils/testing/unittest_/auto_cwd_testcase.py +114 -0
- danielutils/text.py +169 -0
- danielutils/time.py +64 -0
- danielutils/tools/__init__.py +1 -0
- danielutils/tools/unittest_test_runner/__init__.py +9 -0
- danielutils/tools/unittest_test_runner/cli.py +70 -0
- danielutils/tools/unittest_test_runner/core/__init__.py +17 -0
- danielutils/tools/unittest_test_runner/core/discovery.py +322 -0
- danielutils/tools/unittest_test_runner/core/execution.py +244 -0
- danielutils/tools/unittest_test_runner/core/parser.py +163 -0
- danielutils/tools/unittest_test_runner/core/runner.py +561 -0
- danielutils/tools/unittest_test_runner/models.py +82 -0
- danielutils/university/__init__.py +7 -0
- danielutils/university/computability_and_complexity/__init__.py +2 -0
- danielutils/university/computability_and_complexity/discreate_finite_automaton.py +89 -0
- danielutils/university/computability_and_complexity/languages/__init__.py +0 -0
- danielutils/university/computability_and_complexity/languages/language.py +17 -0
- danielutils/university/computability_and_complexity/languages/sat.py +71 -0
- danielutils/university/computability_and_complexity/turing_machine.py +47 -0
- danielutils/university/databases/__init__.py +1 -0
- danielutils/university/databases/all.py +756 -0
- danielutils/university/image_proccesing/__init__.py +1 -0
- danielutils/university/image_proccesing/encoding/__init__.py +3 -0
- danielutils/university/image_proccesing/encoding/encoding.py +35 -0
- danielutils/university/image_proccesing/encoding/lossless/__init__.py +4 -0
- danielutils/university/image_proccesing/encoding/lossless/huffman.py +0 -0
- danielutils/university/image_proccesing/encoding/lossless/lossless_encoding.py +10 -0
- danielutils/university/image_proccesing/encoding/lossless/lzw.py +0 -0
- danielutils/university/image_proccesing/encoding/lossless/run_length.py +22 -0
- danielutils/university/image_proccesing/encoding/lossy/__init__.py +1 -0
- danielutils/university/image_proccesing/encoding/lossy/lossy_encoding.py +10 -0
- danielutils/university/image_proccesing/tansformations/__init__.py +0 -0
- danielutils/university/image_proccesing/tansformations/gaussian.py +0 -0
- danielutils/university/image_proccesing/tansformations/gradient.py +0 -0
- danielutils/university/image_proccesing/tansformations/hough.py +0 -0
- danielutils/university/image_proccesing/tansformations/laplacian.py +0 -0
- danielutils/university/image_proccesing/tansformations/transformation.py +11 -0
- danielutils/university/linear_algebra/__init__.py +1 -0
- danielutils/university/linear_algebra/matrix.py +404 -0
- danielutils/university/machine_learning/__init__.py +0 -0
- danielutils/university/machine_learning/activation_functions/__init__.py +2 -0
- danielutils/university/machine_learning/activation_functions/activation_function.py +11 -0
- danielutils/university/machine_learning/activation_functions/relu.py +11 -0
- danielutils/university/machine_learning/neuron.py +15 -0
- danielutils/university/oop/__init__.py +1 -0
- danielutils/university/oop/observer.py +31 -0
- danielutils/university/oop/strategy.py +9 -0
- danielutils/university/probability/__init__.py +7 -0
- danielutils/university/probability/conditional_variable/__init__.py +3 -0
- danielutils/university/probability/conditional_variable/conditional_variable.py +138 -0
- danielutils/university/probability/conditional_variable/continuous/__init__.py +0 -0
- danielutils/university/probability/conditional_variable/discrete/__init__.py +8 -0
- danielutils/university/probability/conditional_variable/discrete/bernoulli.py +38 -0
- danielutils/university/probability/conditional_variable/discrete/bernoulli_sum.py +31 -0
- danielutils/university/probability/conditional_variable/discrete/binomial.py +40 -0
- danielutils/university/probability/conditional_variable/discrete/conditional_from_discrete_probability_func.py +36 -0
- danielutils/university/probability/conditional_variable/discrete/discrete.py +42 -0
- danielutils/university/probability/conditional_variable/discrete/geometric.py +43 -0
- danielutils/university/probability/conditional_variable/discrete/poisson.py +32 -0
- danielutils/university/probability/conditional_variable/discrete/uniform.py +33 -0
- danielutils/university/probability/distributions.py +35 -0
- danielutils/university/probability/expressions/__init__.py +2 -0
- danielutils/university/probability/expressions/accumulation_expression.py +291 -0
- danielutils/university/probability/expressions/probability_expression.py +110 -0
- danielutils/university/probability/funcs/__init__.py +4 -0
- danielutils/university/probability/funcs/covariance.py +12 -0
- danielutils/university/probability/funcs/expected_value.py +41 -0
- danielutils/university/probability/funcs/probability_function.py +14 -0
- danielutils/university/probability/funcs/variance.py +17 -0
- danielutils/university/probability/operator.py +79 -0
- danielutils/university/probability/protocols.py +32 -0
- danielutils/university/probability/supp.py +101 -0
- danielutils/university/probability/transformation.py +44 -0
- danielutils/versioned_imports.py +31 -0
- danielutils-1.1.28.dist-info/METADATA +390 -0
- danielutils-1.1.28.dist-info/RECORD +287 -0
- danielutils-1.1.28.dist-info/WHEEL +5 -0
- danielutils-1.1.28.dist-info/licenses/LICENSE +21 -0
- danielutils-1.1.28.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import random
|
|
2
|
+
from typing import Set, Callable, Sequence, Collection, Tuple, Dict, TypeVar, Generic
|
|
3
|
+
|
|
4
|
+
State = TypeVar('State')
|
|
5
|
+
Symbol = TypeVar('Symbol')
|
|
6
|
+
Alphabet = Collection[Symbol]
|
|
7
|
+
TransitionFunction = Callable[[State, Symbol], State]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DiscreteFiniteAutomaton(Generic[State, Symbol]):
|
|
11
|
+
def __init__(self, Q: Collection[State], sigma: Alphabet, delta: TransitionFunction, q0: State,
|
|
12
|
+
F: Collection[State]):
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
Q: set of possible states
|
|
17
|
+
sigma: the alphabet
|
|
18
|
+
delta: the transition function
|
|
19
|
+
q0: the initial state
|
|
20
|
+
F: the accept states
|
|
21
|
+
"""
|
|
22
|
+
self.Q: Set[State] = set(Q)
|
|
23
|
+
self.sigma: Sequence[Symbol] = list(sigma)
|
|
24
|
+
self.delta: TransitionFunction = delta
|
|
25
|
+
self.q0: State = q0
|
|
26
|
+
self.F: Set[State] = set(F)
|
|
27
|
+
self._verify()
|
|
28
|
+
|
|
29
|
+
def process(self, word: Sequence[Symbol]) -> State:
|
|
30
|
+
cur = self.q0
|
|
31
|
+
for letter in word:
|
|
32
|
+
cur = self.delta(cur, letter)
|
|
33
|
+
return cur
|
|
34
|
+
|
|
35
|
+
def run(self, word: Sequence[Symbol]) -> bool:
|
|
36
|
+
return self.process(word) in self.F
|
|
37
|
+
|
|
38
|
+
def __call__(self, word: Sequence[Symbol]) -> bool:
|
|
39
|
+
return self.run(word)
|
|
40
|
+
|
|
41
|
+
def _verify(self) -> None:
|
|
42
|
+
for letter in self.sigma:
|
|
43
|
+
for state in self.Q:
|
|
44
|
+
try:
|
|
45
|
+
res = self.delta(state, letter)
|
|
46
|
+
except Exception as e:
|
|
47
|
+
raise ValueError(f'delta({state}, {letter}) raised an exception') from e
|
|
48
|
+
if not res in self.Q:
|
|
49
|
+
raise ValueError(f'delta({state}, {letter}) = {state} which is not in F = {self.Q}')
|
|
50
|
+
|
|
51
|
+
def random_word(self, k: int) -> Sequence[Symbol]:
|
|
52
|
+
return tuple(random.choices(self.sigma, k=k))
|
|
53
|
+
|
|
54
|
+
def is_described_by(self, language_indicator: Callable[[Sequence[Symbol]], bool], max_word_length: int = 100,
|
|
55
|
+
num_repeats_for_length: int = 1000) -> bool:
|
|
56
|
+
"""
|
|
57
|
+
This function will randomly generate work of all lengths up to k and will check whether this DFA acceptance
|
|
58
|
+
of the word is the same as the result of a function that describes the behaviour of the language
|
|
59
|
+
Args:
|
|
60
|
+
language_indicator: An indicator function to check if a word is a member of a language
|
|
61
|
+
max_word_length: the maximum length of a word to check
|
|
62
|
+
num_repeats_for_length: how many times to repeat the check of any one length (as the words are randomly generated)
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
A boolean result
|
|
66
|
+
"""
|
|
67
|
+
for k in range(max_word_length):
|
|
68
|
+
for _ in range(num_repeats_for_length):
|
|
69
|
+
word = self.random_word(k)
|
|
70
|
+
if not (self.run(word) == language_indicator(word)):
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
return True
|
|
74
|
+
|
|
75
|
+
@staticmethod
|
|
76
|
+
def delta_from_dict(dct: Dict[Tuple[State, Symbol], State]) -> TransitionFunction:
|
|
77
|
+
return lambda state, letter: dct[(state, letter)]
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
DFA = DiscreteFiniteAutomaton
|
|
81
|
+
|
|
82
|
+
__all__ = [
|
|
83
|
+
"State",
|
|
84
|
+
"Symbol",
|
|
85
|
+
"Alphabet",
|
|
86
|
+
"TransitionFunction",
|
|
87
|
+
"DiscreteFiniteAutomaton",
|
|
88
|
+
"DFA"
|
|
89
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Protocol
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class LanguageItem(Protocol): ...
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Language(ABC):
|
|
9
|
+
|
|
10
|
+
@abstractmethod
|
|
11
|
+
def __contains__(self, item: LanguageItem) -> bool: ...
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"Language",
|
|
16
|
+
"LanguageItem"
|
|
17
|
+
]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from typing import List, TypeVar, Optional
|
|
2
|
+
|
|
3
|
+
from .language import Language
|
|
4
|
+
|
|
5
|
+
CNFVariable_id_type = TypeVar('CNFVariable_id_type', bound=int)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CNFVariable:
|
|
9
|
+
__ID: int = 0
|
|
10
|
+
|
|
11
|
+
def __init__(self, value: bool):
|
|
12
|
+
self.value = value
|
|
13
|
+
self.id = CNFVariable.__ID
|
|
14
|
+
CNFVariable.__ID += 1
|
|
15
|
+
|
|
16
|
+
def __bool__(self):
|
|
17
|
+
return self.value
|
|
18
|
+
|
|
19
|
+
def get_id(self) -> CNFVariable_id_type: # type:ignore
|
|
20
|
+
# TODO
|
|
21
|
+
assert False
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CNFLiteral:
|
|
25
|
+
def __init__(self, negation: bool):
|
|
26
|
+
self.negation = negation
|
|
27
|
+
|
|
28
|
+
def __call__(self, var: CNFVariable) -> bool:
|
|
29
|
+
return not bool(var) if self.negation else bool(var)
|
|
30
|
+
|
|
31
|
+
def get_corresponding_variable_id(self) -> CNFVariable_id_type: # type:ignore
|
|
32
|
+
# TODO
|
|
33
|
+
assert False
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CNFClause:
|
|
37
|
+
def __bool__(self, literals: Optional[List[CNFLiteral]] = None) -> None:
|
|
38
|
+
self.literals = literals or []
|
|
39
|
+
|
|
40
|
+
def add_literal(self, literal: CNFLiteral):
|
|
41
|
+
self.literals.append(literal)
|
|
42
|
+
|
|
43
|
+
def evaluate(self, variables: List[CNFVariable]) -> bool:
|
|
44
|
+
dct: dict = {v.get_id(): v for v in variables}
|
|
45
|
+
|
|
46
|
+
for literal in self.literals:
|
|
47
|
+
if not literal.get_corresponding_variable_id() in dct.keys():
|
|
48
|
+
return False
|
|
49
|
+
if not literal(dct[literal.get_corresponding_variable_id()]):
|
|
50
|
+
return False
|
|
51
|
+
return True
|
|
52
|
+
|
|
53
|
+
def __len__(self) -> int:
|
|
54
|
+
return len(self.literals)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class CNFFormula:
|
|
58
|
+
def __init__(self, clauses: Optional[List[CNFClause]] = None) -> None:
|
|
59
|
+
self.clauses = clauses or []
|
|
60
|
+
|
|
61
|
+
def add_clause(self, clause: CNFClause) -> None:
|
|
62
|
+
self.clauses.append(clause)
|
|
63
|
+
|
|
64
|
+
def evaluate(self, variables: List[CNFVariable]) -> bool:
|
|
65
|
+
for clause in self.clauses:
|
|
66
|
+
if not clause.evaluate(variables):
|
|
67
|
+
return False
|
|
68
|
+
return True
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class SAT(Language): ...
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from typing import TypeVar, Collection, Callable, Set, List, Sequence, Tuple, Union, Literal, Generic
|
|
2
|
+
|
|
3
|
+
State = TypeVar('State')
|
|
4
|
+
Symbol = TypeVar('Symbol')
|
|
5
|
+
Alphabet = Collection[Symbol]
|
|
6
|
+
Direction = Union[Literal["L"], Literal["R"]]
|
|
7
|
+
TransitionFunction = Callable[[State, Symbol], Tuple[State, Symbol, Direction]]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TuringMachine(Generic[State, Symbol]):
|
|
11
|
+
def __init__(self, Q: Collection[State], Gamma: Alphabet, Sigma: Alphabet, delta: TransitionFunction, q0: State,
|
|
12
|
+
F_acc: Collection[State], F_rej: Collection[State]) -> None:
|
|
13
|
+
self.Q: Set[State] = set(Q)
|
|
14
|
+
self.Gamma: List[State] = list(Gamma)
|
|
15
|
+
self.Sigma: List[State] = list(Sigma)
|
|
16
|
+
self.delta: TransitionFunction = delta
|
|
17
|
+
self.q0: State = q0
|
|
18
|
+
self.F_acc: Set[State] = set(F_acc)
|
|
19
|
+
self.F_rej: Set[State] = set(F_rej)
|
|
20
|
+
self.tape: List[Symbol] = []
|
|
21
|
+
self.head: int = 0
|
|
22
|
+
|
|
23
|
+
def _should_stop(self, cur_state: State) -> bool:
|
|
24
|
+
return cur_state in self.F_acc or cur_state in self.F_rej
|
|
25
|
+
|
|
26
|
+
def process(self, word: Sequence[Symbol]) -> State:
|
|
27
|
+
for letter in word:
|
|
28
|
+
self.tape.append(letter)
|
|
29
|
+
cur = self.q0
|
|
30
|
+
while not self._should_stop(cur):
|
|
31
|
+
state, symbol, direction = self.delta(cur, self.tape[self.head])
|
|
32
|
+
cur = state
|
|
33
|
+
self.tape[self.head] = symbol
|
|
34
|
+
self.head += 1 if direction == "R" else -1
|
|
35
|
+
|
|
36
|
+
return cur
|
|
37
|
+
|
|
38
|
+
def run(self, word: Sequence[Symbol]) -> bool:
|
|
39
|
+
return self.process(word) in self.F_acc
|
|
40
|
+
|
|
41
|
+
def __call__(self, word: Sequence[Symbol]) -> bool:
|
|
42
|
+
return self.run(word)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
'TuringMachine'
|
|
47
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .all import *
|