From 4358c67ecab2005eb996467c677ea0b095c2b5a0 Mon Sep 17 00:00:00 2001 From: bxdd Date: Sat, 8 Apr 2023 18:22:53 +0800 Subject: [PATCH] [MNT] update add learnware method --- examples/learnware_config/svm/learnware.yaml | 2 +- learnware/config.py | 6 +++++- learnware/learnware/__init__.py | 6 +++--- learnware/learnware/base.py | 20 ++++++++++++-------- learnware/learnware/utils.py | 2 ++ learnware/market/easy.py | 6 ++++-- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/examples/learnware_config/svm/learnware.yaml b/examples/learnware_config/svm/learnware.yaml index b4a329e..bec1ed0 100644 --- a/examples/learnware_config/svm/learnware.yaml +++ b/examples/learnware_config/svm/learnware.yaml @@ -1,8 +1,8 @@ model: - name: SVM_example class_name: SVM kwargs: {} stat_specifications: - module_name: learnware.specification class_name: RKMEStatSpecification + file_name: svm.json kwargs: {} \ No newline at end of file diff --git a/learnware/config.py b/learnware/config.py index 5a59f5e..f2c650b 100644 --- a/learnware/config.py +++ b/learnware/config.py @@ -97,9 +97,13 @@ semantic_config = { "Type": "Tag", # Choose one or more tags }, "Description": { - "Values": str, + "Values": None, "Type": "Description", }, + "Name": { + "Values": None, + "Type": "Name", + }, } _DEFAULT_CONFIG = { diff --git a/learnware/learnware/__init__.py b/learnware/learnware/__init__.py index 701d6b2..63747ab 100644 --- a/learnware/learnware/__init__.py +++ b/learnware/learnware/__init__.py @@ -27,7 +27,6 @@ def get_learnware_from_dirpath(id: int, semantic_spec: dict, learnware_dirpath: The contructed learnware object, return None if build failed """ learnware_config = { - "name": "None", "model": { "class_name": "Model", "kwargs": {}, @@ -36,6 +35,7 @@ def get_learnware_from_dirpath(id: int, semantic_spec: dict, learnware_dirpath: { "module_name": "learnware.specification", "class_name": "RKMEStatSpecification", + "file_name": "stat_spec.json", "kwargs": {}, }, ], @@ -52,7 +52,7 @@ def get_learnware_from_dirpath(id: int, semantic_spec: dict, learnware_dirpath: if "model" in yaml_config: learnware_config["model"].update(yaml_config["model"]) if "stats_specifications" in yaml_config: - learnware_config["stat_specifications"] = yaml_config["stat_specifications"] + learnware_config["stat_specifications"] = yaml_config["stat_specifications"].copy() try: learnware_spec = Specification() @@ -67,4 +67,4 @@ def get_learnware_from_dirpath(id: int, semantic_spec: dict, learnware_dirpath: logger.warning(f"Load Learnware {id} failed!") return None - return Learnware(id=id, name=learnware_config["name"], model=learnware_model, specification=learnware_spec) + return Learnware(id=id, model=learnware_model, specification=learnware_spec) diff --git a/learnware/learnware/base.py b/learnware/learnware/base.py index e5e90a6..352b5b8 100644 --- a/learnware/learnware/base.py +++ b/learnware/learnware/base.py @@ -8,9 +8,19 @@ from ..utils import get_module_by_module_path class Learnware: - def __init__(self, id: str, name: str, model: BaseModel, specification: Specification): + def __init__(self, id: str, model: BaseModel, specification: Specification): + """_summary_ + + Parameters + ---------- + id : str + The learnware id that is generated by market, and is unique + model : BaseModel + The learnware model for prediction + specification : Specification + The specification including the semantic specification and the statistic specification + """ self.id = id - self.name = name self.model = model self.specification = specification @@ -23,12 +33,6 @@ class Learnware: def get_specification(self) -> Specification: return self.specification - def get_info(self): - return self.desc - - def get_name(self): - return self.name - def update_stat_spec(self, name, new_stat_spec: BaseStatSpecification): self.specification.update_stat_spec(name, new_stat_spec) diff --git a/learnware/learnware/utils.py b/learnware/learnware/utils.py index 4dacc33..45769ca 100644 --- a/learnware/learnware/utils.py +++ b/learnware/learnware/utils.py @@ -44,8 +44,10 @@ def get_model_from_config(model: Union[BaseModel, dict]) -> BaseModel: def get_stat_spec_from_config(stat_spec: dict) -> BaseStatSpecification: stat_spec_module = get_module_by_module_path(stat_spec["module_path"]) stat_spec_inst = getattr(stat_spec_module, stat_spec["class_name"])(**stat_spec["kwargs"]) + if not isinstance(stat_spec_inst, BaseStatSpecification): raise TypeError( f"Statistic specification must be type of BaseStatSpecification, not {BaseStatSpecification.__class__.__name__}" ) + stat_spec_inst.load(stat_spec["file_path"]) return stat_spec["class_name"], stat_spec_inst diff --git a/learnware/market/easy.py b/learnware/market/easy.py index a4152a2..2d42f1a 100644 --- a/learnware/market/easy.py +++ b/learnware/market/easy.py @@ -9,7 +9,7 @@ from typing import Tuple, Any, List, Union, Dict from .base import BaseMarket, BaseUserInfo from .database_ops import load_market_from_db, add_learnware_to_db, delete_learnware_from_db -from ..learnware import Learnware, get_learnware_from_config +from ..learnware import Learnware, get_learnware_from_dirpath from ..specification import RKMEStatSpecification, Specification from ..logger import get_module_logger from ..config import C @@ -101,7 +101,9 @@ class EasyMarket(BaseMarket): z_file.extractall(target_folder_dir) config_file_dir = os.path.join(target_folder_dir, "learnware.yaml") - new_learnware = get_learnware_from_config(id=id, semantic_spec=semantic_spec, file_config=config_file_dir) + new_learnware = get_learnware_from_dirpath( + id=id, semantic_spec=semantic_spec, learnware_dirpath=config_file_dir + ) if new_learnware is None: os.rmdir(target_zip_dir) rmtree(target_folder_dir)