diff --git a/poetry.lock b/poetry.lock index b4bd5c4..092f8c6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -447,6 +447,51 @@ files = [ {file = "nh3-0.2.18.tar.gz", hash = "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4"}, ] +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + [[package]] name = "pkginfo" version = "1.10.0" @@ -686,4 +731,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "5de27c10572a33d58799fe89159950e3a21aa8a6b5c9537573369106e95d9bd3" +content-hash = "34836d3c2416524df8c85b3e2be43ef1246e709b36c08a57d395dad7dd89df4f" diff --git a/pyproject.toml b/pyproject.toml index 91ee006..9fcdad7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ repository = "https://github.com/pyclashbot/clash-net-lib" [tool.poetry.dependencies] python = "^3.12" +numpy = "^1" [tool.poetry.group.dev] diff --git a/src/__init__.py b/src/__init__.py index 0255472..55c1f30 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,5 +1,6 @@ """Entry point for the package.""" +from . import implements from .decision_maker import Decision, DecisionInput, DecisionInputValue, DecisionMaker, DecisionName, DecisionValue __all__ = [ @@ -9,4 +10,5 @@ "DecisionInputValue", "DecisionValue", "DecisionMaker", + "implements", ] diff --git a/src/decision_maker.py b/src/decision_maker.py index 50243e6..54d35f2 100644 --- a/src/decision_maker.py +++ b/src/decision_maker.py @@ -3,6 +3,8 @@ This module provides high-level classes for handling a decision-making process. """ +from __future__ import annotations + from typing import TypeVar DecisionName = str @@ -40,7 +42,7 @@ def __str__(self) -> str: str: The name and value of the decision input. """ - return self.name + " : " + str(self.value) + return f"{self.name} : {self.value!s}" def __repr__(self) -> str: """Return the official string representation of the DecisionInput. @@ -83,7 +85,7 @@ def __str__(self) -> str: str: The name and value of the decision. """ - return self.name + " : " + str(self.value) + return f"{self.name} : {self.value!s}" def __repr__(self) -> str: """Return the official string representation of the Decision. @@ -96,32 +98,32 @@ def __repr__(self) -> str: return self.__str__() -class DecisionMaker[DecisionInputValue, DecisionValue]: +class DecisionMaker[DecisionInput, Decision]: """Manages decision inputs and generates decisions. Attributes ---------- - inputs (list[DecisionInput[DecisionInputValue]]): The list of inputs to the decision-making process. - decisions (list[Decision[DecisionValue]]): The list of decisions made. + inputs (list[DecisionInput]): The list of inputs to the decision-making process. + decisions (list[Decision]): The list of decisions made. """ def __init__(self) -> None: """Initialize a DecisionMaker instance.""" - self.inputs: list[DecisionInput[DecisionInputValue]] = [] - self.decisions: list[Decision[DecisionValue]] = [] + self.inputs: list[DecisionInput] = [] + self.decisions: list[Decision] = [] - def add_input(self, decision_input: DecisionInput[DecisionInputValue]) -> None: + def add_input(self, decision_input: DecisionInput) -> None: """Add an input to the decision-making process. Args: ---- - decision_input (DecisionInput[DecisionInputValue]): The decision input to be added. + decision_input (DecisionInput): The decision input to be added. """ self.inputs.append(decision_input) - def make_decision(self) -> Decision[DecisionValue]: + def make_decision(self) -> Decision | None: """Generate a decision based on the inputs. Raises @@ -130,7 +132,7 @@ def make_decision(self) -> Decision[DecisionValue]: Returns ------- - Decision[DecisionValue]: The decision based on the inputs (when implemented). + Decision | None: The decision based on the inputs (when implemented). """ msg = "make_decision method is not implemented" diff --git a/src/implements/__init__.py b/src/implements/__init__.py new file mode 100644 index 0000000..516131b --- /dev/null +++ b/src/implements/__init__.py @@ -0,0 +1,5 @@ +"""Implementations of the decision makers.""" + +import fight_decision_maker + +__all__ = ["fight_decision_maker"] diff --git a/src/implements/fight_decision_maker.py b/src/implements/fight_decision_maker.py new file mode 100644 index 0000000..3e57585 --- /dev/null +++ b/src/implements/fight_decision_maker.py @@ -0,0 +1,56 @@ +"""An implementation of the DecisionMaker class for making decisions during a fight.""" + +from __future__ import annotations + +from typing import TypedDict + +import numpy as np + +from src.decision_maker import Decision, DecisionInput, DecisionMaker + +FightDecisionInputValue = np.ndarray + +name = "Fight Decision" + + +class FightDecisionValue(TypedDict): + """Represents the value of a fight decision.""" + + cardIndex: int | None + location: tuple[int, int] | None + + +class FightDecisionInput(DecisionInput[FightDecisionInputValue]): + """Represents an input to a fight decision-making process.""" + + def __init__(self, value: FightDecisionInputValue) -> None: + """Initialize a FightDecisionInput instance. + + Args: + ---- + value (FightDecisionInputValue): The value of the fight decision input. + + """ + super().__init__(name, value) + + +class FightDecision(Decision[FightDecisionValue]): + """Represents a decision made during a fight.""" + + def __init__(self, value: FightDecisionValue) -> None: + """Initialize a FightDecision instance. + + Args: + ---- + value (FightDecisionValue): The value of the fight decision. + + """ + super().__init__(name, value) + + +class FightDecisionMaker(DecisionMaker[FightDecisionInputValue, FightDecisionValue]): + """An implementation of the DecisionMaker class for making decisions during a fight.""" + + def __init__(self) -> None: + """Initialize a FightDecisionMaker instance.""" + super().__init__()