Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add algo docs #232

Open
wants to merge 17 commits into
base: develop-main
Choose a base branch
from
Open

add algo docs #232

wants to merge 17 commits into from

Conversation

ReiHashimoto
Copy link

概要

パラメータ説明機能の実装に向け、アルゴリズムをリファクタリング

  • アルゴリズムはAlgoTemplateクラスを継承して実装する
  • パラメータはpydanticのBaseModelを継承して実装する

APIスキーマは一部変更されているが、各種yamlファイルの構成には影響がないため、下位互換性を持つ

ドキュメンテーションにアルゴリズムのドキュメントを自動生成

  • autodoc-pydanticを使用
  • サイドメニューからの導線も追加
  • 以下のコマンドで確認可能
    make docs
    

関数の実装方法詳細

# 以下のmoduleをimport
from pydantic import BaseModel
from pydantic.dataclasses import Field

from studio.app.common.core.algo import AlgoTemplate


# 関数のパラメータはpydanticのBaseModelを継承し、Fieldで実装する
class ParamX(BaseModel):
    param_xa: int = Field(  # use Field with type definition
        1, # default value
        description="param_a's doc."
    )
    param_xb: str = Field(
        "paramB",
        alias="123param"  # Pythonの文法上使用できないパラメータ名(数字で始まる)、pydanticで使われているパラメータ名("copy"など)の場合はaliasを使用する
        description="param_b's doc."
    )


class ParamY(BaseModel):
    param_ya: bool = Field(False)


# 以下のような形式でパラメータをネストさせることができる
class SomeFunctionParam(BaseModel):
    param_x: ParamX = Field(ParamX())
    param_y: ParamY = Field(ParamY())


# AlgoTemplateを継承して実装する
class SomeFunction(AlgoTemplate):
    def run(  # runの関数名でoverrideする
        self,
        params: SomeFunctionParams,  # パラメータのクラスを型として渡す
        images: ImageData, # input nodeとなるデータクラス
    ) -> dict(  # output nodeとなるデータクラス
        fluorescence=FluoData,
        iscell=IscellData
    ):
        # function_id, output_dirはselfから取得できる
        print(self.output_dir)
        print(self.function_id)
        
        # nwbパラメータも同様にselfから取得できる
        # 元々引数として明示はなかったが、一部関数ではimaging_rateを取得するためにkwargsから取り出していた
        fr = self.nwb_params.get("imaging_plane", {}).get("imaging_rate", 30)
        
        # 処理を別メソッドに切り出す場合、classmethodまたはstaticmethodとして定義して呼び出す
        related_results = self.related_function(x, y)
        
        ...
        return info

@classmethod
def related_function(cls, param_x, param_y):
    ...
    return z

ToDo

  • edit_ROIの関数を新方式での実装に対応させる

@ReiHashimoto ReiHashimoto self-assigned this Dec 11, 2023
@ReiHashimoto ReiHashimoto mentioned this pull request Dec 11, 2023
6 tasks
studio/app/optinist/wrappers/caiman/cnmfe.py Outdated Show resolved Hide resolved
studio/app/optinist/wrappers/caiman/cnmfe.py Outdated Show resolved Hide resolved
@@ -34,6 +34,7 @@ Main Features
installation/index
tutorials
gui/index
algorithms/index
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ノード関数ファイルの編集方法(以下での説明内容)のテキストは、docs の配下への格納でしょうか。

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらToDo漏れていましたね、そちらのドキュメントを更新します。

pyproject.toml Show resolved Hide resolved
"normalize_init": False,
}
params["fixed_params"] = cnmfe_fixed_params
class CaimanCnmfE(AlgoTemplate):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

caiman cnmfe の実行時、以下のエラーが発生。
※develop-main でも発生しているようなので、当件とは別件そうですが、念のため一旦内容を記載。

Traceback (most recent call last): File "/home/iam/workspaces/projects/araya/010_optinist/barebone-studio/studio/app/common/core/rules/runner.py",
line 43, in run output_info = cls.execute_function( File
"/home/iam/workspaces/projects/araya/010_optinist/barebone-studio/studio/app/common/core/rules/runner.py",
line 128, in execute_function algo() File
"/home/iam/workspaces/projects/araya/010_optinist/barebone-studio/studio/app/optinist/wrappers/caiman/cnmfe.py",
line 129, in run CaimanCnmf() File
"/home/iam/workspaces/projects/araya/010_optinist/barebone-studio/studio/app/optinist/wrappers/caiman/cnmf.py",
line 187, in run ims = np.stack(ims) File "<__array_function__ internals>",
line 180, in stack File
"/home/iam/workspaces/projects/araya/010_optinist/barebone-studio/.snakemake/conda/555e5a3f793f921de7713969efaf5f8c_/lib/python3.8/site-packages/numpy/core/shape_base.py",
line 422, in stack raise ValueError('need at least one array to stack')
ValueError: need at least one array to stack

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants