diff --git a/anansyTypes/structures/embedding.py b/anansyTypes/structures/embedding.py index 8222cf8..5ea6050 100644 --- a/anansyTypes/structures/embedding.py +++ b/anansyTypes/structures/embedding.py @@ -21,4 +21,8 @@ class Embedding: # Fallback or error if not implemented for other types (e.g., torch.Tensor) raise NotImplementedError( "Comparison must be implemented for all supported data types." - ) \ No newline at end of file + ) + + @classmethod + def from_dict(cls, data: dict) -> "Embedding": + return cls(data=np.array(data["data"], dtype=np.float32)) diff --git a/anansyTypes/structures/phrase.py b/anansyTypes/structures/phrase.py index ec6f4d5..9252afe 100644 --- a/anansyTypes/structures/phrase.py +++ b/anansyTypes/structures/phrase.py @@ -18,6 +18,14 @@ class Phrase(Lexeme): @property def embedding(self) -> Embedding: return self._embedding + + @classmethod + def from_dict(cls, data: dict) -> 'Phrase': + return cls( + id=data['id'], + content=data['content'], + embedding=Embedding.from_dict(data['embedding']) + ) @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler): diff --git a/anansyTypes/structures/symbol.py b/anansyTypes/structures/symbol.py index a04fac2..6bd109c 100644 --- a/anansyTypes/structures/symbol.py +++ b/anansyTypes/structures/symbol.py @@ -12,6 +12,14 @@ class Symbol: label: str image: Tensor[np.ndarray[Any, Any], tuple, Literal["int32", "int64"]] + @classmethod + def from_dict(cls, data: dict) -> 'Symbol': + return cls( + id=data['id'], + label=data['label'], + image=np.array(data['image'], dtype=np.int32) + ) + @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler): from pydantic_core import core_schema diff --git a/anansyTypes/structures/word.py b/anansyTypes/structures/word.py index 2843a66..abea127 100644 --- a/anansyTypes/structures/word.py +++ b/anansyTypes/structures/word.py @@ -1,5 +1,5 @@ from .lexeme import Lexeme -from typing import Any +from typing import Any from .embedding import Embedding from pydantic_core import core_schema @@ -17,32 +17,44 @@ class Word(Lexeme): @property def embedding(self) -> Embedding: return self._embedding - + def __str__(self): return self.content - + def __repr__(self): return self.__str__() - + + @classmethod + def from_dict(cls, data: dict) -> "Word": + return cls( + word_id=data["id"], + content=data["content"], + embedding=Embedding.from_dict(data["embedding"]), + ) + @classmethod def __get_pydantic_core_schema__(cls, source_type: Any, handler): from pydantic_core import core_schema - + return core_schema.no_info_after_validator_function( lambda x: x if isinstance(x, cls) else cls(**x), core_schema.typed_dict_schema( { - 'id': core_schema.typed_dict_field(handler.generate_schema(int)), - 'content': core_schema.typed_dict_field(handler.generate_schema(str)), - 'embedding': core_schema.typed_dict_field(handler.generate_schema(Embedding)), + "id": core_schema.typed_dict_field(handler.generate_schema(int)), + "content": core_schema.typed_dict_field( + handler.generate_schema(str) + ), + "embedding": core_schema.typed_dict_field( + handler.generate_schema(Embedding) + ), } ), serialization=core_schema.plain_serializer_function_ser_schema( lambda x: { - 'id': x.id, - 'content': x.content, - 'embedding': x.embedding # Let Pydantic serialize Embedding + "id": x.id, + "content": x.content, + "embedding": x.embedding, # Let Pydantic serialize Embedding }, - when_used='json', + when_used="json", ), )