aboutsummaryrefslogtreecommitdiffstats
path: root/.agents/skills/architecture-design/SKILL.md
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.agents/skills/architecture-design/SKILL.md274
1 files changed, 274 insertions, 0 deletions
diff --git a/.agents/skills/architecture-design/SKILL.md b/.agents/skills/architecture-design/SKILL.md
new file mode 100644
index 0000000..5bbbf87
--- /dev/null
+++ b/.agents/skills/architecture-design/SKILL.md
@@ -0,0 +1,274 @@
+---
+name: architecture-design
+description: Use only when creating new registrable ML components that require Factory or Registry patterns.
+version: 1.2.0
+---
+
+# Architecture Design - ML Project Template
+
+This skill defines the standard code architecture for machine learning projects based on the template structure. When modifying or extending code, follow these patterns to maintain consistency.
+
+## Overview
+
+The project follows a modular, extensible architecture with clear separation of concerns. Each module (data, model, trainer, analysis) is independently organized using factory and registry patterns for maximum flexibility.
+
+## When to Use
+
+Use this skill when:
+- Creating a new Dataset class that needs `@register_dataset`
+- Creating a new Model class that needs `@register_model`
+- Creating a new module directory with `__init__.py` factory wiring
+- Initializing a new ML project structure from scratch
+- Adding new component types such as Augmentation, CollateFunction, or Metrics
+
+## When Not to Use
+
+Do not use this skill when:
+- Modifying existing functions or methods
+- Fixing bugs in existing code
+- Adding helper functions or utilities
+- Refactoring without adding new registrable components
+- Making simple code changes to a single file
+- Modifying configuration files
+- Reading or understanding existing code
+
+Key indicator: if the task does not require a `@register_*` decorator or a Factory pattern, skip this skill.
+
+## Core Design Patterns
+
+### Factory Pattern
+
+Each module uses a factory to create instances dynamically:
+
+```python
+# Example from data_module/dataset/__init__.py
+DATASET_FACTORY: Dict = {}
+
+def DatasetFactory(data_name: str):
+ dataset = DATASET_FACTORY.get(data_name, None)
+ if dataset is None:
+ print(f"{data_name} dataset is not implementation, use simple dataset")
+ dataset = DATASET_FACTORY.get('simple')
+ return dataset
+```
+
+For detailed guidance, refer to `references/factory_pattern.md`.
+
+### Registry Pattern
+
+Components register themselves via decorators:
+
+```python
+# Example from data_module/dataset/simple_dataset.py
+@register_dataset("simple")
+class SimpleDataset(Dataset):
+ def __init__(self, data):
+ self.data = data
+```
+
+For detailed guidance, refer to `references/registry_pattern.md`.
+
+### Auto-Import Pattern
+
+Modules automatically discover and import submodules:
+
+```python
+# Example from data_module/dataset/__init__.py
+models_dir = os.path.dirname(__file__)
+import_modules(models_dir, "src.data_module.dataset")
+```
+
+For detailed guidance, refer to `references/auto_import.md`.
+
+## Directory Structure
+
+```
+project/
+├── run/
+│ ├── pipeline/ # Main workflow scripts
+│ │ ├── training/ # Training pipelines
+│ │ ├── prepare_data/ # Data preparation pipelines
+│ │ └── analysis/ # Analysis pipelines
+│ └── conf/ # Hydra configuration files
+│ ├── training/ # Training configs
+│ ├── dataset/ # Dataset configs
+│ ├── model/ # Model configs
+│ ├── prepare_data/ # Data prep configs
+│ └── analysis/ # Analysis configs
+│
+├── src/
+│ ├── data_module/ # Data processing module
+│ │ ├── dataset/ # Dataset implementations
+│ │ ├── augmentation/ # Data augmentation
+│ │ ├── collate_fn/ # Collate functions
+│ │ ├── compute_metrics/ # Metrics computation
+│ │ ├── prepare_data/ # Data preparation logic
+│ │ ├── data_func/ # Data utility functions
+│ │ └── utils.py # Module-specific utilities
+│ │
+│ ├── model_module/ # Model implementations
+│ │ ├── brain_decoder/ # Brain decoder models
+│ │ └── model/ # Alternative model location
+│ │
+│ ├── trainer_module/ # Training logic
+│ ├── analysis_module/ # Analysis and evaluation
+│ ├── llm/ # LLM-related code
+│ └── utils/ # Shared utilities
+│
+├── data/
+│ ├── raw/ # Original, immutable data
+│ ├── processed/ # Cleaned, transformed data
+│ └── external/ # Third-party data
+│
+├── outputs/
+│ ├── logs/ # Training and evaluation logs
+│ ├── checkpoints/ # Model checkpoints
+│ ├── tables/ # Result tables
+│ └── figures/ # Plots and visualizations
+│
+├── pyproject.toml # Project configuration
+├── uv.lock # Dependency lock file
+├── TODO.md # Task tracking
+├── README.md # Project documentation
+└── .gitignore # Git ignore rules
+```
+
+For detailed directory structure with file descriptions, refer to `references/structure.md`.
+
+## Module Organization
+
+### Creating a New Dataset
+
+When adding a new dataset:
+
+1. Create file in `src/data_module/dataset/`
+2. Use `@register_dataset("name")` decorator
+3. Inherit from `torch.utils.data.Dataset`
+4. Implement `__init__`, `__len__`, `__getitem__`
+
+```python
+from torch.utils.data import Dataset
+from typing import Dict
+import torch
+from src.data_module.dataset import register_dataset
+
+@register_dataset("custom")
+class CustomDataset(Dataset):
+ def __init__(self, data):
+ self.data = data
+
+ def __len__(self):
+ return len(self.data)
+
+ def __getitem__(self, i: int) -> Dict[str, torch.Tensor]:
+ return self.data[i]
+```
+
+### Creating a New Model
+
+**CRITICAL: Models use config-driven pattern**
+
+When adding a new model:
+
+1. Create file in `src/model_module/model/` or appropriate module subdirectory
+2. Use `@register_model('ModelName')` decorator
+3. `__init__` accepts **ONLY** `cfg` parameter - all hyperparameters come from config
+4. `forward()` returns dict: `{"loss": loss, "labels": labels, "logits": logits}`
+5. Handle training vs inference modes using `self.training`
+
+```python
+from src.model_module.brain_decoder import register_model
+
+@register_model('MyModel')
+class MyModel(nn.Module):
+ def __init__(self, cfg):
+ super().__init__()
+ self.cfg = cfg
+ self.task = cfg.dataset.task
+
+ # ALL parameters from cfg
+ self.hidden_dim = cfg.model.hidden_dim
+ self.output_dim = cfg.dataset.target_size[cfg.dataset.task]
+
+ def forward(self, x, labels=None, **kwargs):
+ if self.training:
+ # Training logic
+ pass
+ else:
+ # Inference logic
+ pass
+
+ return {"loss": loss, "labels": labels, "logits": logits}
+```
+
+### Adding Data Augmentation
+
+When adding augmentation:
+
+1. Create file in `src/data_module/augmentation/`
+2. Implement transformation function
+3. Register with factory if needed
+
+## Code Style Guidelines
+
+For comprehensive style guidelines, refer to `references/code_style.md`.
+
+**Key principles:**
+- Always use type hints for function signatures
+- Follow import order: standard library → third-party → local
+- Module `__init__.py` files contain factory/registry logic
+- Model classes must be config-driven
+
+## Configuration Management
+
+The project uses Hydra for configuration management:
+
+- Config files in `run/conf/` organize by module
+- Each stage (training, analysis) has its own config structure
+- Use YAML files for all configuration
+
+## When Working on This Project
+
+### Before Modifying Code
+
+1. Read the relevant module's factory/registry pattern
+2. Check existing implementations for consistency
+3. Follow the established directory structure
+4. Use registration decorators for new components
+
+### Adding New Features
+
+1. Determine which module the feature belongs to
+2. Check if similar functionality exists
+3. Follow factory/registry pattern if creating new component types
+4. Add configuration files if needed
+5. Update documentation
+
+### Code Review Checklist
+
+- [ ] Uses factory/registry pattern appropriately
+- [ ] Follows module directory structure
+- [ ] Has proper type annotations
+- [ ] Imports are correctly ordered
+- [ ] Registration decorator is used
+- [ ] Configuration files are added if needed
+
+## Additional Resources
+
+### Reference Files
+
+For detailed information, consult:
+- **`references/structure.md`** - Detailed directory structure with file descriptions
+- **`references/factory_pattern.md`** - Factory pattern in-depth explanation
+- **`references/registry_pattern.md`** - Registry pattern in-depth explanation
+- **`references/auto_import.md`** - Auto-import pattern in-depth explanation
+- **`references/code_style.md`** - Comprehensive code style guidelines
+
+### Example Files
+
+Working examples in `examples/`:
+- **`examples/custom_dataset.py`** - Custom dataset implementation
+- **`examples/custom_model.py`** - Custom model implementation
+- **`examples/augmentation_example.py`** - Data augmentation example
+- **`examples/config_example.yaml`** - Configuration file example
+- **`examples/pipeline_example.sh`** - Pipeline script example