base = exec  # option to add different commands based on computational resources, setup etc.

#General functions
a1 = $(word 1,$(subst _, , $(1)))
a2 = $(word 2,$(subst _, , $(1)))
a3 = $(word 3,$(subst _, , $(1)))
a4 = $(word 4,$(subst _, , $(1)))
a5 = $(word 5,$(subst _, , $(1)))
a6 = $(word 6,$(subst _, , $(1)))
a7 = $(word 7,$(subst _, , $(1)))
a8 = $(word 8,$(subst _, , $(1)))


#### Linear ####
method_list = gi_gi_ fac_gi_ fac_fac_ li_li_ rand_gi_
depth_list = 1_ 2_ 3_ 4_ 5_ 6_
width_list = 10 50 250
method_depth = $(foreach pre,$(method_list),$(addprefix $(pre),$(depth_list))) 
method_depth_width = $(foreach pre,$(method_depth),$(addprefix $(pre),$(width_list))) 

linear/results/%: linear.py bnn/factorised.py bnn/inducing.py bnn/general.py
	$(base) python $< $@ --ap_lower $(call a1,$*) --ap_top $(call a2,$*) --depth $(call a3,$*) --width $(call a4,$*)
linear: $(addprefix linear/results/,$(method_depth_width))

#### CIFAR-10 ####

#small models
sm = resnet8_
#small approximate posteriors
sap = gi_gi_ fac_gi_ fac_fac_ li_li_
prior = SpatialIWPrior_ ScalePrior_
seed = 0

sm_sap                  = $(foreach pre,$(sm),$(addprefix $(pre),$(sap)))
sm_sap_prior            = $(foreach pre,$(sm_sap),$(addprefix $(pre),$(prior))) 
sm_sap_prior_seed       = $(foreach pre,$(sm_sap_prior),$(addprefix $(pre),$(seed))) 

cifar10/results/%: conv.py bnn/factorised.py bnn/inducing.py bnn/general.py models/lenet.py models/resnet8.py
	$(base) python $< $@ --dataset cifar10 --model $(call a1,$*) --ap_lower $(call a2,$*) --ap_top $(call a3,$*) --lr 1E-2 --temperL --prior $(call a4,$*) --aug noaug --seed $(call a5,$*) --periods 1000 --train_samples 1 --print --test_samples 10 --print
cifar10: $(addprefix cifar10/results/,$(sm_sap_prior_seed))


#### MNIST 500 ####

#small models
sm = lenet_
#small approximate posteriors
sap = gi_gi_ fac_gi_ fac_fac_ li_li_
#learning rates
lr = 1E-3_
prior = ScalePrior_ SpatialIWPrior_ InsanePrior_ NealPrior_
seed = 0

sm_sap                  = $(foreach pre,$(sm),$(addprefix $(pre),$(sap)))
sm_sap_lr               = $(foreach pre,$(sm_sap),$(addprefix $(pre),$(lr)))
sm_sap_lr_prior         = $(foreach pre,$(sm_sap_lr),$(addprefix $(pre),$(prior)))
sm_sap_lr_prior_seed    = $(foreach pre,$(sm_sap_lr_prior),$(addprefix $(pre),$(seed)))

mnist_500/results/%: conv.py bnn/factorised.py bnn/inducing.py bnn/general.py models/lenet.py models/resnet8.py
	$(base) python -u $< $@ --dataset mnist --model $(call a1,$*) --ap_lower $(call a2,$*) --ap_top $(call a3,$*) --lr $(call a4,$*) --subset 500 --prior $(call a5,$*) --aug noaug --seed $(call a6,$*) --periods 400 --train_samples 3 --print --test_samples 10 | python filter.py
mnist_500: $(addprefix mnist_500/results/,$(sm_sap_lr_prior_seed))


#### UCI for DGPs ####

#make results_uci/protein_fac_gi_0_0
gps = gigp_gigp_ ligp_ligp_
depths = 2_ 3_ 4_ 5_
models = uciresgp_

path_d = results_ucigp/boston_ results_ucigp/concrete_ results_ucigp/energy_ results_ucigp/kin8nm_ results_ucigp/naval_ results_ucigp/power_ results_ucigp/wine_ results_ucigp/protein_ results_ucigp/yacht_
path_d_gps = $(foreach pre,$(path_d),$(addprefix $(pre),$(gps))) 
path_d_gps_model = $(foreach pre,$(path_d_gps),$(addprefix $(pre),$(models))) 
path_d_gps_model_depth = $(foreach pre,$(path_d_gps_model),$(addprefix $(pre),$(depths))) 
path_d_gps_model_depth_seed = $(foreach pre,$(path_d_gps_model_depth),$(addprefix $(pre),$(seed))) 

results_ucigp/%: ucigp.py models/uci_resgp.py
	$(base) python $< $@ --dataset $(call a1,$*) --ap_lower $(call a2,$*) --ap_top $(call a3,$*)  --model $(call a4,$*) --depth $(call a5,$*) --seed $(call a6,$*) --device cpu --dtype float64 --lr 1E-2 --step --print
ucigp: $(path_d_gps_model_depth_seed)



### UCI for BNNs ###

sap = facLR_facLR_ gi_gi_ fac_gi_ li_li_
priorUCI = NealPrior_ InsanePrior_ ScalePrior_
split20 = 0_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ 10_ 11_ 12_ 13_ 14_ 15_ 16_ 17_ 18_ 19_
split5 = 0_ 1_ 2_ 3_ 4_

bnn_path_d = results_uci/boston_ results_uci/concrete_ results_uci/energy_ results_uci/kin8nm_ results_uci/naval_ results_uci/power_ results_uci/wine_ results_uci/yacht_
bnn_path_d_sap = $(foreach pre,$(bnn_path_d),$(addprefix $(pre),$(sap)))
bnn_path_d_sap_split20 = $(foreach pre,$(bnn_path_d_sap),$(addprefix $(pre),$(split20)))
bnn_path_d_sap_split20_prior = $(foreach pre,$(bnn_path_d_sap_split20),$(addprefix $(pre),$(priorUCI)))
bnn_path_d_sap_split20_prior_seed = $(foreach pre,$(bnn_path_d_sap_split20_prior),$(addprefix $(pre),$(seed)))

bnn_path_protein = results_uci/protein_
bnn_path_protein_sap = $(addprefix $(bnn_path_protein),$(sap))
bnn_path_protein_sap_split5 = $(foreach pre,$(bnn_path_protein_sap),$(addprefix $(pre),$(split5)))
bnn_path_protein_sap_split5_prior = $(foreach pre,$(bnn_path_protein_sap_split5),$(addprefix $(pre),$(priorUCI)))
bnn_path_protein_sap_split5_prior_seed = $(foreach pre,$(bnn_path_protein_sap_split5_prior),$(addprefix $(pre),$(seed)))

results_uci/%: uci.py bnn/* models/fc_uci.py
	$(base) python $< $@ --model fc --depth 2 --dataset $(call a1,$*) --ap_lower $(call a2,$*) --ap_top $(call a3,$*) --split $(call a4,$*) --prior $(call a5,$*) --seed $(call a6,$*) --print
uci: $(bnn_path_d_sap_split20_prior_seed)
#uci: $(bnn_path_protein_sap_split5_prior_seed) # Uncomment this line and comment the above for protein


### Toy Experiment (excl. HMC) ###

sap = gi_gi li_li fac_fac


toy_path = results_toy/toy_
toy_path_sap = $(foreach pre,$(toy_path),$(addprefix $(pre),$(sap)))

results_toy/%: toy.py bnn/* models/fc_uci.py
	$(base) python $< $@ --model fc --depth 2 --prior NealPrior --ap_lower $(call a2,$*) --ap_top $(call a3,$*)
toy: $(toy_path_sap)

