diff --git a/data/repo/test/schedule.toml b/data/repo/test/schedule.toml index 792ed3d..d62ef1f 100644 --- a/data/repo/test/schedule.toml +++ b/data/repo/test/schedule.toml @@ -1,3 +1,5 @@ +schedule = ["quick_review", "recognition", "final_review"] +[phases] quick_review = [["FillBlank", "1.0"], ["SelectMeaning", "0.5"], ["Recognition", "1.0"]] recognition = [["Recognition", "1.0"]] final_review = [["FillBlank", "0.7"], ["SelectMeaning", "0.7"], ["Recognition", "1.0"]] \ No newline at end of file diff --git a/src/heurams/kernel/particles/__init__.py b/src/heurams/kernel/particles/__init__.py index e69de29..93edc74 100644 --- a/src/heurams/kernel/particles/__init__.py +++ b/src/heurams/kernel/particles/__init__.py @@ -0,0 +1,4 @@ +from .atom import Atom +from .electron import Electron +from .nucleon import Nucleon +from .orbital import Orbital \ No newline at end of file diff --git a/src/heurams/kernel/particles/atom.py b/src/heurams/kernel/particles/atom.py index eae9f54..46cd7e2 100644 --- a/src/heurams/kernel/particles/atom.py +++ b/src/heurams/kernel/particles/atom.py @@ -40,6 +40,7 @@ class Atom: } def __init__(self, nucleon_obj = None, electron_obj = None, orbital_obj = None): + self.ident = nucleon_obj["ident"] # type: ignore self.registry: AtomRegister = { # type: ignore "ident": nucleon_obj["ident"], # type: ignore "nucleon": nucleon_obj, diff --git a/src/heurams/kernel/particles/orbital.py b/src/heurams/kernel/particles/orbital.py new file mode 100644 index 0000000..f2e51e3 --- /dev/null +++ b/src/heurams/kernel/particles/orbital.py @@ -0,0 +1,14 @@ +from heurams.utils.lict import Lict +from heurams.utils.evalizor import Evalizer + +class Orbital(): + @classmethod + def create_orbital(cls, schedule: list, phase_def: dict): + phase_def = Lict(initdict=phase_def) # type: ignore + orbital = Lict() + for i in schedule: + orbital[i] = Lict(phase_def[i]) + return orbital + @classmethod + def create_orbital_on_orbitic_data(cls, orbitic_data): + return cls.create_orbital(orbitic_data["schedule"], orbitic_data["phases"]) \ No newline at end of file diff --git a/src/heurams/kernel/repomgr/repo.py b/src/heurams/kernel/repomgr/repo.py index e7e1e67..db1d3b9 100644 --- a/src/heurams/kernel/repomgr/repo.py +++ b/src/heurams/kernel/repomgr/repo.py @@ -4,7 +4,6 @@ import heurams.kernel.particles as pt import toml import json from ...utils.lict import Lict -from .refvar import RefVar class Repo(): file_mapping = { @@ -45,6 +44,7 @@ class Repo(): def generate_particles_data(self): self.nucleonic_data_lict = Lict(initlist=list(map(self._attach(self.typedef), self.payload))) self.electronic_data_lict = self.algodata + self.orbitic_data = self.schedule @staticmethod def _attach(value): @@ -52,6 +52,12 @@ class Repo(): return (x, value) return inner + @staticmethod + def _merge(value): + def inner(x): + return map(x, value) + return inner + def __len__(self): return len(self.payload) @@ -104,7 +110,7 @@ class Repo(): else: raise ValueError(f"不支持的文件类型: {filename}") if cls.type_mapping[keyname] == "lict": - database[keyname] = Lict(loaded.items()) + database[keyname] = Lict(list(loaded.items())) elif cls.type_mapping[keyname] == "dict": database[keyname] = loaded else: diff --git a/src/heurams/utils/lict.py b/src/heurams/utils/lict.py index ad4f587..5e05282 100644 --- a/src/heurams/utils/lict.py +++ b/src/heurams/utils/lict.py @@ -1,9 +1,10 @@ from collections import UserList -from typing import Any +from typing import Any, Iterator class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) """"列典" 对象 + 同时兼容字典和列表大多数 API, 两边数据同步的容器 列表数据是 dictobj.items() 的格式 支持根据字典或列表初始化 @@ -12,25 +13,33 @@ class Lict(UserList): #TODO: 优化同步(惰性同步), 当前性能为 O(n) - 值一定是引用对象 - 不使用并发 - 不在乎列表顺序语义(严格按键名字符序排列)和列表索引查找, 因此外部的 sort, index 等功能不可用 - - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + - append 的元组中, 表示键名的元素不能重复, 否则会导致覆盖行为 + + 只有在 Python 3.7+ 中, forced_order 行为才能被取消. """ - def __init__(self, initlist = None, initdict = None): + def __init__(self, initlist: list | None = None, initdict: dict | None = None, forced_order = True): self.dicted_data = {} if initdict != None: initlist = list(initdict.items()) super().__init__(initlist=initlist) + self.forced_order = forced_order self._sync_based_on_list() - self.data.sort() + if self.forced_order: + self.data.sort() def _sync_based_on_dict(self): self.data = list(self.dicted_data.items()) - self.data.sort() + if self.forced_order: + self.data.sort() def _sync_based_on_list(self): self.dicted_data = {} for i in self.data: self.dicted_data[i[0]] = i[1] + def __iter__(self) -> Iterator: + return self.data.__iter__() + def __getitem__(self, i): if isinstance(i, str): return self.dicted_data[i] diff --git a/src/heurams/kernel/repomgr/refvar.py b/src/heurams/utils/refvar.py similarity index 100% rename from src/heurams/kernel/repomgr/refvar.py rename to src/heurams/utils/refvar.py