-include ../local.mk EXP ?= datacenter-fq SETUP ?= datacenter_fq SOLUTIONS ?= no-tso tso tso-pacing FIG_STEMS ?= throughput throughput_zoom rtt rtt_zoom sender_cpu receiver_cpu timeseries idt_cdf idt_cdf_zoom # Global figure size and font size (inches, pt). Inherited by every Rscript # via the export below; common.R reads these as Sys.getenv("FIG_*"). # Override on the command line: make FIG_WIDTH=2.5 FIG_HEIGHT=1.8 FIG_FONTSIZE=8 datacenter-fq FIG_WIDTH ?= 2.5 FIG_HEIGHT ?= 2.0 FIG_FONTSIZE ?= 9 export FIG_WIDTH FIG_HEIGHT FIG_FONTSIZE THROUGHPUT_SIZE_ARGS ?= RTT_SIZE_ARGS ?= SENDER_CPU_SIZE_ARGS ?= RECEIVER_CPU_SIZE_ARGS ?= SLOWSTART_SIZE_ARGS ?= --width 2.7 --height 1.5 THROUGHPUT_ARGS ?= RTT_ARGS ?= THROUGHPUT_ZOOM_ARGS ?= --ymin 3.5 --ymax 4.0 --ystep 0.1 RTT_ZOOM_ARGS ?= --ymin 4 --ymax 14 --ystep 2 SENDER_CPU_ARGS ?= RECEIVER_CPU_ARGS ?= TIMESERIES_ARGS ?= IDT_CDF_ARGS ?= ROOT := .. RAW_DATA_ROOT ?= $(ROOT)/../raw_data RAW := $(RAW_DATA_ROOT)/$(EXP)/aggregates DERIVED := $(ROOT)/derived/$(EXP) DERIVED_ROOT := $(ROOT)/derived OUT := ../out/$(EXP) VALUES_TEX := ../out/values.tex VALUES_PLUGINS := $(wildcard $(ROOT)/analysis/values/*.py) SKIP_PLUGINS ?= CSVS := $(addprefix $(DERIVED)/, runs.csv rtts.csv idts.csv firstflow_bins.csv) PDFS := $(addprefix $(OUT)/, $(addsuffix .pdf, $(FIG_STEMS))) TEXS := $(addprefix $(OUT)/, $(addsuffix .tex, $(FIG_STEMS))) .PHONY: all derive figures tikz sanity values pdfs tex clean datacenter-fq datacenter-fq-tikz direct-link direct-link-tikz slowstart slowstart-tikz all-experiments all-experiments-tikz .DELETE_ON_ERROR: all: all-experiments derive: $(DERIVED)/.stamp $(DERIVED)/.stamp: $(ROOT)/analysis/aggregate.py cd $(ROOT)/analysis && uv run python aggregate.py --raw $(abspath $(RAW)) --setup-prefix $(SETUP) --solutions $(SOLUTIONS) --out $(abspath $(DERIVED)) touch $@ $(CSVS): $(DERIVED)/.stamp sanity: $(DERIVED)/.stamp cd $(ROOT)/analysis && uv run python sanity_check.py --derived $(abspath $(DERIVED)) --solutions $(SOLUTIONS) figures: all-experiments tikz: all-experiments-tikz pdfs: $(PDFS) tex: $(TEXS) FMT_FLAG = $(if $(filter %.tex,$@),--tikz,--pdf) $(OUT)/throughput.pdf $(OUT)/throughput.tex: fig_throughput.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(THROUGHPUT_SIZE_ARGS) $(THROUGHPUT_ARGS) $(OUT)/throughput_zoom.pdf $(OUT)/throughput_zoom.tex: fig_throughput.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ --zoom $(THROUGHPUT_SIZE_ARGS) $(THROUGHPUT_ZOOM_ARGS) $(OUT)/rtt.pdf $(OUT)/rtt.tex: fig_rtt.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(RTT_SIZE_ARGS) $(RTT_ARGS) $(OUT)/rtt_zoom.pdf $(OUT)/rtt_zoom.tex: fig_rtt.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ --zoom $(RTT_SIZE_ARGS) $(RTT_ZOOM_ARGS) $(OUT)/sender_cpu.pdf $(OUT)/sender_cpu.tex: fig_sender_cpu.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(SENDER_CPU_SIZE_ARGS) $(SENDER_CPU_ARGS) $(OUT)/receiver_cpu.pdf $(OUT)/receiver_cpu.tex: fig_receiver_cpu.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(RECEIVER_CPU_SIZE_ARGS) $(RECEIVER_CPU_ARGS) $(OUT)/timeseries.pdf $(OUT)/timeseries.tex: fig_timeseries.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(TIMESERIES_ARGS) $(OUT)/idt_cdf.pdf $(OUT)/idt_cdf.tex: fig_idt_cdf.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ $(IDT_CDF_ARGS) $(OUT)/idt_cdf_zoom.pdf $(OUT)/idt_cdf_zoom.tex: fig_idt_cdf.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) $(FMT_FLAG) $@ --zoom $(IDT_CDF_ARGS) $(OUT)/%.pdf: fig_%.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) --pdf $@ $(OUT)/%_zoom.pdf: fig_%.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) --pdf $@ --zoom $(OUT)/%.tex: fig_%.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) --tikz $@ $(OUT)/%_zoom.tex: fig_%.R common.R $(CSVS) Makefile @mkdir -p $(OUT) Rscript $< --data $(DERIVED) --tikz $@ --zoom values: $(VALUES_TEX) # SKIP_PLUGINS is a runtime decision, not a file dependency: force rebuild # whenever the user sets it on the command line. ifneq ($(SKIP_PLUGINS),) .PHONY: $(VALUES_TEX) endif $(VALUES_TEX): $(ROOT)/analysis/gen_values.py $(VALUES_PLUGINS) $(DERIVED_ROOT)/datacenter-fq/.stamp $(DERIVED_ROOT)/direct-link/.stamp Makefile @mkdir -p $(dir $(VALUES_TEX)) cd $(ROOT)/analysis && uv run python gen_values.py --derived $(abspath $(DERIVED_ROOT)) --out $(abspath $(VALUES_TEX)) $(if $(SKIP_PLUGINS),--skip $(SKIP_PLUGINS)) clean: rm -rf $(OUT) $(DERIVED) # Per-experiment shortcut targets. Each recursively invokes the makefile # with the right EXP / SETUP / FIG_STEMS / zoom overrides. # Per-experiment knobs. Each shortcut target reuses these via $(call ...). QUARTER_SIZE := --width 1.4 --height 1.5 DATACENTER_FQ_ARGS = EXP=datacenter-fq SETUP=datacenter_fq \ SOLUTIONS="no-tso tso tso-pacing cake:datacenter_cake_no-tso" \ FIG_STEMS="throughput throughput_zoom rtt rtt_zoom sender_cpu receiver_cpu timeseries idt_cdf idt_cdf_zoom" \ THROUGHPUT_SIZE_ARGS="$(QUARTER_SIZE)" \ RTT_SIZE_ARGS="$(QUARTER_SIZE)" \ SENDER_CPU_SIZE_ARGS="$(QUARTER_SIZE)" \ RECEIVER_CPU_SIZE_ARGS="$(QUARTER_SIZE)" \ TIMESERIES_ARGS="--height 1.6" \ IDT_CDF_ARGS="--height 1.6" \ THROUGHPUT_ZOOM_ARGS="--ymin 3.5 --ymax 4.0 --ystep 0.1" \ RTT_ZOOM_ARGS="--ymin 4 --ymax 14 --ystep 2" DIRECT_LINK_ARGS = EXP=direct-link SETUP=direct-link_fq \ SOLUTIONS="no-tso tso tso-pacing cake:direct-link_cake_no-tso" \ FIG_STEMS="throughput throughput_zoom rtt rtt_zoom sender_cpu receiver_cpu" \ THROUGHPUT_SIZE_ARGS="$(QUARTER_SIZE)" \ RTT_SIZE_ARGS="$(QUARTER_SIZE)" \ SENDER_CPU_SIZE_ARGS="$(QUARTER_SIZE)" \ RECEIVER_CPU_SIZE_ARGS="$(QUARTER_SIZE)" \ THROUGHPUT_ARGS="--ymax 10 --ystep 2" \ THROUGHPUT_ZOOM_ARGS="--ymin 9.0 --ymax 10.0 --ystep 0.2" \ RTT_ZOOM_ARGS="--ymin 1.75 --ymax 4 --ystep 1" \ SENDER_CPU_ARGS="--ymax 20 --ystep 5" \ RECEIVER_CPU_ARGS="--ystep 5" datacenter-fq: $(MAKE) pdfs $(DATACENTER_FQ_ARGS) datacenter-fq-tikz: $(MAKE) tex $(DATACENTER_FQ_ARGS) direct-link: $(MAKE) pdfs $(DIRECT_LINK_ARGS) direct-link-tikz: $(MAKE) tex $(DIRECT_LINK_ARGS) all-experiments: datacenter-fq direct-link slowstart all-experiments-tikz: datacenter-fq-tikz direct-link-tikz slowstart-tikz # Slowstart: standalone, reads raw text files directly (no aggregator). SLOWSTART_OUT := ../out/slowstart SLOWSTART_RAW := $(RAW_DATA_ROOT)/slowstart slowstart: $(SLOWSTART_OUT)/slowstart.pdf slowstart-tikz: $(SLOWSTART_OUT)/slowstart.tex $(SLOWSTART_OUT)/slowstart.pdf $(SLOWSTART_OUT)/slowstart.tex: fig_slowstart.R common.R $(SLOWSTART_RAW)/tso.txt $(SLOWSTART_RAW)/tso_pacing.txt Makefile @mkdir -p $(SLOWSTART_OUT) Rscript $< --data $(SLOWSTART_RAW) $(FMT_FLAG) $@ $(SLOWSTART_SIZE_ARGS)