33# Usage:
44# make all - Generate all diagrams
55# make tokens - Generate token strip diagrams
6+ # make tikz - Generate TikZ diagrams
7+ # make figures - Generate standalone figure scripts
68# make clean - Remove generated files
79
810GENERATED_DIR := generated
911
10- .PHONY : all tokens grpo tikz clean help
12+ .PHONY : all tokens tikz figures clean help
1113
1214# LaTeX engine path (adjust if different on your system)
1315PDFLATEX := $(shell which pdflatex || echo "/usr/local/texlive/2023basic/bin/universal-darwin/pdflatex")
1416
15- all : tokens grpo tikz
17+ all : tokens tikz figures
1618 @echo " All diagrams generated in $( GENERATED_DIR) /"
1719
1820# Token strip diagrams - requires matplotlib
@@ -28,38 +30,44 @@ tokens: | $(GENERATED_DIR)
2830 uv run python scripts/generate_multilane_strips.py --output-dir $(GENERATED_DIR ) /svg --format svg
2931 @echo " Token strip diagrams generated (PNG in png/, SVG in svg/)"
3032
31- # PPO vs GRPO architecture comparison diagram (matplotlib version)
32- # Based on DeepSeek-Math/GRPO paper Figure 1
33- grpo : | $(GENERATED_DIR )
33+ # Standalone figure scripts (cartpole, tool_use)
34+ figures : | $(GENERATED_DIR )
3435 @mkdir -p $(GENERATED_DIR ) /png $(GENERATED_DIR ) /svg
35- uv run python scripts/generate_ppo_grpo.py --output-dir $(GENERATED_DIR ) /png --format png
36- uv run python scripts/generate_ppo_grpo.py --output-dir $(GENERATED_DIR ) /svg --format svg
37- @echo " PPO vs GRPO diagram generated (matplotlib)"
36+ uv run python scripts/generate_cartpole.py --output-dir $(GENERATED_DIR ) /png --format png
37+ uv run python scripts/generate_cartpole.py --output-dir $(GENERATED_DIR ) /svg --format svg
38+ uv run python scripts/generate_tool_use.py --output-dir $(GENERATED_DIR ) /png --format png
39+ uv run python scripts/generate_tool_use.py --output-dir $(GENERATED_DIR ) /svg --format svg
40+ @echo " Standalone figures generated (PNG in png/, SVG in svg/)"
3841
3942# TikZ diagrams - requires pdflatex and convert (ImageMagick) or sips (macOS)
4043# Compiles .tex files in tikz/ to PDF, then converts to 400dpi PNG
4144# SVG conversion requires pdf2svg (brew install pdf2svg)
4245tikz : | $(GENERATED_DIR )
4346 @mkdir -p $(GENERATED_DIR ) /png $(GENERATED_DIR ) /svg $(GENERATED_DIR ) /pdf
44- @for texfile in tikz/* _tikz_test .tex; do \
47+ @for texfile in tikz/* _tikz .tex; do \
4548 if [ -f " $$ texfile" ]; then \
46- base=$$(basename "$$texfile" _tikz_test .tex) ; \
47- echo " Compiling $$ {base}_tikz ..." ; \
49+ base=$$(basename "$$texfile" .tex) ; \
50+ echo " Compiling $$ {base}..." ; \
4851 cd tikz && $(PDFLATEX ) -interaction=nonstopmode $$(basename $$texfile) > /dev/null 2>&1 ; cd ..; \
49- cp tikz/$$ {base}_tikz_test.pdf $(GENERATED_DIR ) /pdf/$$ {base}_tikz.pdf; \
50- if command -v magick > /dev/null; then \
51- magick -density 400 tikz/$$ {base}_tikz_test.pdf -trim -quality 100 $(GENERATED_DIR ) /png/$$ {base}_tikz.png; \
52- echo " -> $( GENERATED_DIR) /png/$$ {base}_tikz.png (400dpi, trimmed)" ; \
53- elif command -v convert > /dev/null; then \
54- convert -density 400 tikz/$$ {base}_tikz_test.pdf -trim -quality 100 $(GENERATED_DIR ) /png/$$ {base}_tikz.png; \
55- echo " -> $( GENERATED_DIR) /png/$$ {base}_tikz.png (400dpi, trimmed)" ; \
56- elif command -v sips > /dev/null; then \
57- sips -s format png tikz/$$ {base}_tikz_test.pdf --out $(GENERATED_DIR ) /png/$$ {base}_tikz.png > /dev/null 2>&1 ; \
58- fi ; \
59- if command -v pdf2svg > /dev/null; then \
60- pdf2svg tikz/$$ {base}_tikz_test.pdf $(GENERATED_DIR ) /svg/$$ {base}_tikz.svg; \
52+ if [ -f " tikz/$$ {base}.pdf" ]; then \
53+ cp tikz/$$ {base}.pdf $(GENERATED_DIR ) /pdf/$$ {base}.pdf; \
54+ if command -v magick > /dev/null; then \
55+ magick -density 400 tikz/$$ {base}.pdf -trim -quality 100 $(GENERATED_DIR ) /png/$$ {base}.png; \
56+ echo " -> $( GENERATED_DIR) /png/$$ {base}.png (400dpi, trimmed)" ; \
57+ elif command -v convert > /dev/null; then \
58+ convert -density 400 tikz/$$ {base}.pdf -trim -quality 100 $(GENERATED_DIR ) /png/$$ {base}.png; \
59+ echo " -> $( GENERATED_DIR) /png/$$ {base}.png (400dpi, trimmed)" ; \
60+ elif command -v sips > /dev/null; then \
61+ sips -s format png tikz/$$ {base}.pdf --out $(GENERATED_DIR ) /png/$$ {base}.png > /dev/null 2>&1 ; \
62+ fi ; \
63+ if command -v pdf2svg > /dev/null; then \
64+ pdf2svg tikz/$$ {base}.pdf $(GENERATED_DIR ) /svg/$$ {base}.svg; \
65+ echo " -> $( GENERATED_DIR) /svg/$$ {base}.svg" ; \
66+ else \
67+ echo " (skipping SVG - install pdf2svg: brew install pdf2svg)" ; \
68+ fi ; \
6169 else \
62- echo " (skipping SVG - install pdf2svg: brew install pdf2svg) " ; \
70+ echo " ERROR: PDF not generated for $$ {base} " ; \
6371 fi ; \
6472 rm -f tikz/* .aux tikz/* .log; \
6573 fi \
@@ -73,17 +81,18 @@ $(GENERATED_DIR):
7381# Clean generated files
7482clean :
7583 rm -rf $(GENERATED_DIR ) /*
76- @echo " Cleaned $( GENERATED_DIR) /"
84+ rm -f tikz/* .pdf tikz/* .aux tikz/* .log
85+ @echo " Cleaned $( GENERATED_DIR) / and tikz/*.pdf"
7786
7887# Help
7988help :
8089 @echo " RLHF Book Diagram Generator"
8190 @echo " "
8291 @echo " Targets:"
8392 @echo " all - Generate all diagrams"
84- @echo " tokens - Generate token strip diagrams"
85- @echo " grpo - Generate PPO vs GRPO diagram (matplotlib )"
86- @echo " tikz - Generate TikZ diagrams (ppo_grpo_tikz, etc. )"
93+ @echo " tokens - Generate token strip diagrams (reward models) "
94+ @echo " tikz - Generate TikZ diagrams (policy gradients, distillation )"
95+ @echo " figures - Generate standalone figures (cartpole, tool_use )"
8796 @echo " clean - Remove generated files"
8897 @echo " "
8998 @echo " Requirements:"
0 commit comments