- Delete outdated site/ directory - Rename docs/ → site/ to match original architecture intent - Update all GitHub workflows to reference site/: - publish-live.yml: Update paths and build directory - publish-dev.yml: Update paths and build directory - build-pdf.yml: Update paths and artifact locations - Update README.md: - Consolidate site/ documentation (website + PDF) - Update all docs/ links to site/ - Test successful: Local build works with all 40 pages The site/ directory now clearly represents the course website and documentation, making the repository structure more intuitive. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
19 KiB
TinyTorch Module Development Rules
Version: 2.0
Date: January 2025
Status: Complete Reference Guide
Reference Implementation: src/08_optimizers/08_optimizers.py
This document defines the complete set of rules, patterns, and conventions for developing TinyTorch modules. Instead of maintaining separate documentation, use 08_optimizers as your reference implementation - it follows all current patterns perfectly.
Development Structure
Key Paths:
- Source:
src/NN_modulename/NN_modulename.py← Developers edit here - Generated:
modules/NN_modulename/NN_modulename.ipynb← Auto-generated for students - Package:
tinytorch/← Auto-generated package code
📚 Educational Philosophy
Core Principles
- Educational First: Every module is designed for learning, not just functionality
- Progressive Complexity: Start simple, build complexity step by step
- Real-World Connection: Connect concepts to practical ML applications
- Standalone Learning: Each module should be self-contained
- Professional Standards: Use industry-standard patterns and practices
"Build → Use → [Understand/Reflect/Analyze/Optimize]" Framework
Each module follows this pedagogical pattern:
- Build: Implement the component from scratch
- Use: Apply it to real data and problems
- Third Stage: Varies by module (Understand/Reflect/Analyze/Optimize)
📁 File Structure and Organization
1. File Naming Convention
Developer Workflow (Source):
src/NN_modulename/
├── NN_modulename.py # SOURCE OF TRUTH (developers edit)
├── module.yaml # Module configuration
├── ABOUT.md # Module documentation
└── README.md # Optional additional docs
Student Workflow (Generated):
modules/NN_modulename/
└── NN_modulename.ipynb # AUTO-GENERATED notebook (students use)
2. File Format: Jupytext Percent Format
All source Python files in src/ MUST use Jupytext percent format:
# ---
# jupyter:
# jupytext:
# text_representation:
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.17.1
# ---
Build Process:
- Developer edits
src/NN_name/NN_name.py - Run
tito source export NN_name - Generates
modules/NN_name/NN_name.ipynb(notebook) - Exports to
tinytorch/(package code)
🏗️ Module Template Structure
Follow this exact structure (see 08_optimizers for reference):
A. Header Section
# %% [markdown]
"""
# Module N: Title - Brief Description
## Learning Goals
- Goal 1: Specific outcome
- Goal 2: Another objective
- Goal 3: Connection to ML concepts
## Build → Use → [Understand/Reflect/Analyze/Optimize]
1. **Build**: What students implement
2. **Use**: How they apply it
3. **[Third Stage]**: Deeper engagement
"""
B. Setup and Imports
# %% nbgrader={"grade": false, "grade_id": "modulename-imports", "locked": false, "schema_version": 3, "solution": false, "task": false}
#| default_exp core.modulename
#| export
import numpy as np
import sys
from typing import Union, List, Tuple, Optional, Any
# %% nbgrader={"grade": false, "grade_id": "modulename-setup", "locked": false, "schema_version": 3, "solution": false, "task": false}
print("🔥 TinyTorch [Module] Module")
print(f"Python version: {sys.version_info.major}.{sys.version_info.minor}")
print("Ready to [action]!")
C. Package Location
# %% [markdown]
"""
## 📦 Where This Code Lives in the Final Package
**Learning Side:** You work in `modules/NN_modulename/modulename_dev.py`
**Building Side:** Code exports to `tinytorch.core.modulename`
```python
# Final package structure:
from tinytorch.core.modulename import ComponentName # Main functionality!
from tinytorch.core.tensor import Tensor # Foundation
Why this matters:
- Learning: Focused modules for deep understanding
- Production: Proper organization like PyTorch's structure
- Consistency: All [module] operations live together
- Foundation: Connection to broader ML systems """
### D. **Educational Content Structure**
```python
# %% [markdown]
"""
## What Are [Components]?
### The Problem/Motivation
Explain why this module exists and what problem it solves.
### The Solution
Describe the approach and key insights.
### Real-World Impact
Show concrete applications and industry relevance.
### What We'll Build
1. **Component 1**: Brief description
2. **Component 2**: Brief description
3. **Integration**: How components work together
"""
E. ASCII Diagrams and Tables
ASCII diagrams are powerful educational tools that visualize concepts, architectures, and data flows. Follow these guidelines to ensure they render correctly across all environments.
Box Alignment Rules
1. Border Width Consistency: The top border (┌───┐) defines the box width. All content lines must match this width exactly.
✅ CORRECT:
┌───────────────────────────────┐
│ Content fits within borders │
│ All lines same width │
└───────────────────────────────┘
❌ WRONG:
┌─────────────────┐
│ Content extends beyond│
│ Border mismatch │
└─────────────────┘
2. Nested Boxes: Inner boxes must align with the outer box's right border. Use consistent spacing.
✅ CORRECT:
┌───────────────────────────────────────────────────────┐
│ OUTER BOX TITLE │
├───────────────────────────────────────────────────────┤
│ │
│ Section Header │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Inner content properly aligned │ │
│ │ All borders match outer box width │ │
│ └───────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────┘
❌ WRONG (misaligned nested boxes):
┌──────────────────────────────────┐
│ OUTER BOX │
│ ┌──────────────────────────────┐ │
│ │ Inner box extends beyond │ │
│ └──────────────────────────────┘ │
└──────────────────────────────────────────────────┘
3. Side-by-Side Boxes: Both boxes should have equal or proportional widths with consistent spacing.
✅ CORRECT:
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ Left Box │ │ Right Box │
│ Content here │ → │ Content here │
│ Same width as right │ │ Same width as left │
└───────────────────────────────┘ └───────────────────────────────┘
❌ WRONG (unequal widths, misaligned):
┌─────────────────┐ ┌─────────────────────────┐
│ Left Box │ │ Right Box │
│ Width mismatch │ → │ Different size │
└─────────────────┘ └─────────────────────────┘
Table Formatting Rules
1. Column Alignment: All column separators (│) must align vertically. Use consistent column widths.
✅ CORRECT:
┌─────────────────┬─────────────────┬─────────────────┐
│ Column 1 │ Column 2 │ Column 3 │
├─────────────────┼─────────────────┼─────────────────┤
│ Data aligned │ Same width │ Consistent │
│ Short │ Medium content │ Longer content │
└─────────────────┴─────────────────┴─────────────────┘
❌ WRONG (separators don't align):
┌─────────────────┬─────────────────┬─────────────────┐
│ Column 1 │ Column 2 │ Column 3 │
├─────────────────┼─────────────────┼─────────────────┤
│ Misaligned│ Content │ Wrong widths │
└─────────────────┴─────────────────┴─────────────────┘
2. Multi-Column Tables: Header separators (┬, ┼, ┴) must align with content separators.
Special Characters
Emoji Width: Emojis display as ~2 characters wide but count as 1 in string length. Add extra padding after emojis.
✅ CORRECT (emoji padding):
│ ✅ Success message here │
│ ❌ Error message here │
❌ WRONG (no padding compensation):
│ ✅ Success message here│
│ ❌ Error message here │
Box-Drawing Characters Reference:
- Corners:
┌┐└┘ - Lines:
─(horizontal),│(vertical) - Intersections:
┬┴├┤┼ - Arrows:
→←↑↓▼▲
Quality Checklist for Diagrams
Before committing, verify each diagram:
- Top border width matches bottom border width
- All content lines have consistent right-edge
│alignment - Nested boxes align with outer box boundaries
- Table columns have uniform widths
- Side-by-side boxes are visually balanced
- Emojis have appropriate padding
F. Implementation Sections
# %% [markdown]
"""
## Step N: [Component Name]
### Mathematical Foundation
Mathematical explanation with formulas and intuition.
### Implementation Strategy
Step-by-step approach to building the component.
"""
# %% nbgrader={"grade": false, "grade_id": "component-implementation", "locked": false, "schema_version": 3, "solution": true, "task": false}
#| export
class ComponentName:
"""
Brief description of the component.
TODO: Student implementation guidance
APPROACH:
1. [First step with specific guidance]
2. [Second step with specific guidance]
3. [Third step with specific guidance]
EXAMPLE:
Input: [concrete example]
Expected: [concrete expected output]
"""
def __init__(self, parameter1, parameter2):
### BEGIN SOLUTION
# Complete implementation (hidden from students)
### END SOLUTION
raise NotImplementedError("Student implementation required")
G. Test Functions
# %% [markdown]
"""
### 🧪 Unit Test: Component Name
**Description**: Brief explanation of what is tested
**This is a unit test** - it tests [specific functionality] in isolation.
"""
# %% nbgrader={"grade": true, "grade_id": "test-component", "locked": true, "points": 10, "schema_version": 3, "solution": false, "task": false}
def test_component_function():
"""Test the component functionality."""
print("🔬 Unit Test: Component Function...")
# Test implementation
try:
# Test logic
assert condition, "Error message"
print("✅ Component test works")
print("📈 Progress: Component ✓")
return True
except Exception as e:
print(f"❌ Component test failed: {e}")
return False
# Test execution
if __name__ == "__main__":
test_component_function()
H. Module Summary (CRITICAL)
# %% [markdown]
"""
## 🎯 Module Summary
Congratulations! You've successfully implemented [module description]:
### ✅ What You've Built
- **Component 1**: Description of accomplishment
- **Component 2**: Description of accomplishment
- **Integration**: How components work together
- **Complete System**: End-to-end functionality
### ✅ Key Learning Outcomes
- **Understanding**: Core concepts mastered
- **Implementation**: Technical skills developed
- **Mathematical mastery**: Formulas and algorithms implemented
- **Real-world application**: Practical applications understood
### ✅ Mathematical Foundations Mastered
- **Formula 1**: Mathematical concept with notation
- **Formula 2**: Another key mathematical insight
- **Algorithm**: Implementation of key algorithm
### ✅ Professional Skills Developed
- **Skill 1**: Technical capability gained
- **Skill 2**: Another professional competency
- **Integration**: Systems thinking and design
### ✅ Ready for Advanced Applications
Your implementations now enable:
- **Application 1**: What students can build next
- **Application 2**: Another capability unlocked
- **Real Systems**: Connection to production applications
### 🔗 Connection to Real ML Systems
Your implementations mirror production systems:
- **PyTorch**: `torch.component` provides identical functionality
- **TensorFlow**: Similar concepts in TensorFlow
- **Industry Standard**: Used in major ML frameworks
### 🎯 The Power of [Technology]
You've unlocked the key technology that [impact description]:
- **Capability 1**: What this enables
- **Capability 2**: Another important capability
- **Scale**: How this technology scales
### 🧠 Deep Learning Revolution/Impact
You now understand the technology that [revolutionary impact]:
- **Historical context**: Before/after this technology
- **Modern applications**: Current uses
- **Future implications**: What this enables
### 🚀 What's Next
Your implementations are the foundation for:
- **Next Module**: Natural progression
- **Advanced Topics**: Related advanced concepts
- **Research**: Opportunities for exploration
**Next Module**: [Description of next module and its connection]
[Motivational closing emphasizing what students have accomplished]
"""
🧪 Testing Standards
1. Test Function Naming
All test functions MUST follow this pattern:
def test_component_name():
"""Test the component functionality."""
2. Test Function Structure
def test_component_function():
"""Test description."""
print("🔬 Unit Test: Component Function...")
### 🧪 Unit Test: Component Function
**Description**: Brief explanation of what is tested
**This is a unit test** - it tests [specific functionality] in isolation.
try:
# Test logic
print("✅ [check] works")
print("📈 Progress: Component ✓")
return True
except Exception as e:
print(f"❌ Test failed: {e}")
return False
3. Test Execution
if __name__ == "__main__":
test_function_1()
test_function_2()
test_function_3()
📦 NBDev Integration
1. Export Directives
#| export
def function_to_export():
"""Function that becomes part of tinytorch package."""
pass
2. Default Export Target
#| default_exp core.modulename
3. NBGrader Integration
# %% nbgrader={"grade": false, "grade_id": "unique-id", "locked": false, "schema_version": 3, "solution": true, "task": false}
4. Solution Hiding (NBGrader)
def student_function():
"""
Student implementation function.
TODO: Implementation guidance for students.
"""
### BEGIN SOLUTION
# Complete implementation hidden from students
### END SOLUTION
raise NotImplementedError("Student implementation required")
🔧 Development Workflow
1. Python-First Development
- Work in
.pyfiles (source of truth) - Generate
.ipynbwithtito nbgrader generate - Never commit
.ipynbfiles to version control
2. Testing Integration
- Use inline tests for immediate feedback
- All tests must pass before module completion
- Use
pytestfor any external testing
📋 Module Metadata (module.yaml)
name: "modulename"
title: "Module Title"
description: "Brief description of module functionality"
version: "1.0.0"
author: "TinyTorch Team"
learning_objectives:
- "Objective 1"
- "Objective 2"
prerequisites:
- "prerequisite_module"
metadata:
difficulty: "intermediate"
time_estimate: "4-6 hours"
pedagogical_framework: "Build → Use → Understand"
concepts:
- "concept1"
- "concept2"
exports:
- "ComponentName"
- "helper_function"
files:
main: "modulename_dev.py"
readme: "README.md"
assessment:
total_points: 50
breakdown:
component1: 20
component2: 20
integration: 10
next_modules:
- "next_module"
✅ Quality Checklist
Before completing a module:
Content Requirements
- Jupytext percent format header
- Educational content with clear explanations
- Step-by-step implementation guidance
- Mathematical foundations explained
- Real-world applications discussed
- Complete module summary (following 08_optimizers pattern)
Technical Requirements
- All functions have docstrings
- NBGrader cells properly configured
- NBDev export directives in place
- Solution blocks use
### BEGIN SOLUTION/### END SOLUTION - Error handling implemented
- Type hints where appropriate
Testing Requirements
- All inline tests pass
- Test functions use standard naming (
test_*) - Test output follows emoji standards
if __name__ == "__main__":block present- Tests provide educational feedback
Documentation Requirements
- module.yaml properly configured
- README.md updated
- Learning objectives clear
- Prerequisites documented
- Export list accurate
📚 Additional Resources
- Reference Implementation:
modules/08_optimizers/optimizers_dev.py - NBGrader Documentation: NBGrader docs
- NBDev Documentation: NBDev docs
- TinyTorch CLI: Use
tito --helpfor development commands
Remember: When in doubt, reference 08_optimizers - it follows all these patterns perfectly and serves as the living example of proper module structure.