Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,42 @@ class TaskConfig(GenerationConfig):
difficulty: str = Field(default="medium", description="easy/medium/hard")
```

**Single entry point:** `python examples/generate.py --num-samples 50`
**Single entry point:** `python examples/generate.py --num-samples 50`

---

## 🎯 Available Tasks

### Color Sorting Task (颜色分类分拣)

A visual reasoning task where colored blocks must be sorted into matching containers.

**Task Description:**
- **Input:** Canvas with colored containers (empty frames) and scattered colored blocks
- **Output:** All blocks moved into their matching color containers, arranged in a grid layout

**Example Prompt:**
> "The image shows scattered colored blocks and empty containers. Move each block into the container that matches its color. Arrange the blocks neatly inside the containers."

**Usage:**
```bash
python examples/generate_color_sorting.py --num-samples 10
```

**Configuration Options (`src/color_sorting_task.py`):**
| Parameter | Default | Description |
|-----------|---------|-------------|
| `num_colors` | 2-4 | Number of different colors/containers |
| `blocks_per_color` | 2-5 | Number of blocks for each color |
| `container_size` | 150 | Size of each container (pixels) |
| `block_size` | 30 | Size of each block (pixels) |
| `image_size` | (800, 600) | Canvas dimensions |

**Output Structure:**
```
data/questions/color_sorting_task/{task_id}/
├── first_frame.png # Scattered blocks + empty containers
├── final_frame.png # Sorted blocks in matching containers
├── prompt.txt # Task instructions
└── ground_truth.mp4 # Animation of sorting process
```
108 changes: 108 additions & 0 deletions examples/generate_color_sorting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/env python3
"""
╔══════════════════════════════════════════════════════════════════════════════╗
║ COLOR SORTING TASK GENERATION ║
║ ║
║ Generate color-based bin sorting task dataset. ║
║ Task: Move colored blocks into matching color containers. ║
╚══════════════════════════════════════════════════════════════════════════════╝

Usage:
python examples/generate_color_sorting.py --num-samples 10
python examples/generate_color_sorting.py --num-samples 100 --output data/color_sorting --seed 42
python examples/generate_color_sorting.py --num-samples 50 --num-colors 3 --items-per-color 6
"""

import argparse
from pathlib import Path
import sys

# Add project root to path
sys.path.insert(0, str(Path(__file__).parent.parent))

from core import OutputWriter
from src import ColorSortingGenerator, ColorSortingConfig


def main():
parser = argparse.ArgumentParser(
description="Generate color sorting task dataset",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
python examples/generate_color_sorting.py --num-samples 10
python examples/generate_color_sorting.py --num-samples 100 --output data/color_sorting --seed 42
python examples/generate_color_sorting.py --num-samples 50 --num-colors 3 --items-per-color 6
"""
)
parser.add_argument(
"--num-samples",
type=int,
required=True,
help="Number of task samples to generate"
)
parser.add_argument(
"--output",
type=str,
default="data/questions",
help="Output directory (default: data/questions)"
)
parser.add_argument(
"--seed",
type=int,
default=None,
help="Random seed for reproducibility"
)
parser.add_argument(
"--no-videos",
action="store_true",
help="Disable video generation"
)
parser.add_argument(
"--num-colors",
type=int,
default=2,
help="Number of color categories (default: 2)"
)
parser.add_argument(
"--items-per-color",
type=int,
default=4,
help="Number of blocks per color (default: 4)"
)
parser.add_argument(
"--block-size",
type=int,
default=25,
help="Size of each block in pixels (default: 25)"
)

args = parser.parse_args()

print(f"🎲 Generating {args.num_samples} color sorting tasks...")
print(f" Colors: {args.num_colors}, Items per color: {args.items_per_color}")

# Configure task
config = ColorSortingConfig(
num_samples=args.num_samples,
random_seed=args.seed,
output_dir=Path(args.output),
generate_videos=not args.no_videos,
num_colors=args.num_colors,
items_per_color=args.items_per_color,
block_size=args.block_size,
)

# Generate tasks
generator = ColorSortingGenerator(config)
tasks = generator.generate_dataset()

# Write to disk
writer = OutputWriter(Path(args.output))
writer.write_dataset(tasks)

print(f"✅ Done! Generated {len(tasks)} tasks in {args.output}/{config.domain}_task/")


if __name__ == "__main__":
main()
18 changes: 17 additions & 1 deletion src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,26 @@
- config.py : Task-specific configuration (TaskConfig)
- generator.py: Task generation logic (TaskGenerator)
- prompts.py : Task prompts/instructions (get_prompt)
- color_sorting_task.py: Color sorting task (ColorSortingGenerator)
"""

from .config import TaskConfig
from .generator import TaskGenerator
from .prompts import get_prompt
from .color_sorting_task import (
ColorSortingConfig,
ColorSortingTask,
ColorSortingGenerator,
get_color_sorting_prompt
)

__all__ = ["TaskConfig", "TaskGenerator", "get_prompt"]
__all__ = [
"TaskConfig",
"TaskGenerator",
"get_prompt",
# Color sorting task
"ColorSortingConfig",
"ColorSortingTask",
"ColorSortingGenerator",
"get_color_sorting_prompt",
]
Loading