# very dumb makefile
#

# conservative assumption
CFLAGS=-Wall --pedantic --ansi -O2
# some % faster
#   CFLAGS=-Wall -Wpadded -O3 -march=pentium3 -ffast-math

LFLAGS=-lm


# default target
# 
it: info cov euc2 euc2l2 euc4 euc4l1 eucblk eucgen euclidian eucsgdlmbd exp l1 lik siq xsi

info:
	@echo "Compiling. Stand by. 'not initialized' warnings are alright." && echo ""

# binary compilations
# 
euclidian:
	$(CC) -DDISTANCE="\"distance_euclidian.c\"" $(CFLAGS) -o srng srng.c $(LFLAGS) && if test -e srng.exe; then cp srng.exe srng_euclidian.exe; else cp srng srng_euclidian; fi

eucblk:
	$(CC) -DDISTANCE="\"distance_eucblk.c\"" $(CFLAGS) -o srng_eucblk srng.c $(LFLAGS)

euc2:
	$(CC) -DDISTANCE="\"distance_euc2.c\"" $(CFLAGS) -o srng_euc2 srng.c $(LFLAGS)

euc2l2:
	$(CC) -DDISTANCE="\"distance_euc2l2.c\"" $(CFLAGS) -o srng_euc2l2 srng.c $(LFLAGS)

eucsgdlmbd:
	$(CC) -DDISTANCE="\"distance_eucsgdlmbd.c\"" $(CFLAGS) -o srng_eucsgdlmbd srng.c $(LFLAGS)

euc4:
	$(CC) -DDISTANCE="\"distance_euc4.c\"" $(CFLAGS) -o srng_euc4 srng.c $(LFLAGS)
	
euc4l1:
	$(CC) -DDISTANCE="\"distance_euc4l1.c\"" $(CFLAGS) -o srng_euc4l1 srng.c $(LFLAGS)
	
eucgen:
	$(CC) -DDISTANCE="\"distance_eucgen.c\"" $(CFLAGS) -o srng_eucgen srng.c $(LFLAGS) 

exp:
	$(CC) -DDISTANCE="\"distance_exp.c\"" $(CFLAGS) -o srng_exp srng.c $(LFLAGS) 

l1:
	$(CC) -DDISTANCE="\"distance_l1.c\"" $(CFLAGS) -o srng_l1 srng.c $(LFLAGS) 

lik:
	$(CC) -DDISTANCE="\"distance_lik.c\"" $(CFLAGS) -o srng_lik srng.c $(LFLAGS)

si:
	$(CC) -DDISTANCE="\"distance_si.c\"" $(CFLAGS) -o srng_si srng.c $(LFLAGS)

xsi:
	$(CC) -DDISTANCE="\"distance_xsi.c\"" $(CFLAGS) -o srng_xsi srng.c $(LFLAGS)

cov:
	$(CC) -DDISTANCE="\"distance_cov.c\"" $(CFLAGS) -o srng_cov srng.c $(LFLAGS)

siq:
	$(CC) -DDISTANCE="\"distance_siq.c\"" $(CFLAGS) -o srng_siq srng.c $(LFLAGS)


# cleanups
#
cleanexe:
	rm -f srng*.exe srng_cov srng_euc2 srng_euc2l2 srng_euc4 srng_euc4l1 srng_eucblk srng_eucgen srng_euclidian srng_eucsgdlmbd srng_exp srng_l1 srng_lik srng_siq srng_xsi
 
cleandat:
	 rm -f mushroom_[0-9]*dat*gz* *_cb*.dat h_10cells.dat h_10data_lmb.dat tmpXxx*

clean:	cleanexe cleandat


# test suite
# 
ZCAT=gzip -d -c#

test: euc2l2
	cat chkbrd_small.dat | ./srng_euc2l2 chkbrd_small_init.dat 1750 25 | awk 'NF==3 && ($$3==1 || $$3==0); NF==2 && $$1<=1 {print | "cat >& 2"}' | tail -400 > chkbrd_small_cb.dat && sort -s -n -t' ' -k3 chkbrd_small_cb.dat | awk '{if($$NF!=old) {old = $$NF; if(NR>1) printf("\n\n")} print}' > chkbrd_small_cb_sort.dat 

test_h10: euc4
	cat h_10data.dat | ./srng_euc4 h_10data_init.dat 10000 250 

test_h10_lambda: euclidian
	cat h_10data.dat | ./srng h_10data_init.dat 10000 500 | awk 'NF==10 && $$1<1 && $$10<1 {for(i=1;i<=NF;i++)print cnt+0,$$i; print "\n"; ++cnt}' > h_10data_lmb.dat

test_h10_recfield: euclidian
	$(ZCAT) h_10cell.dat.gz h_10demo_pt.dat.gz | ./srng_euclidian - -1 0 "" | sort -n -t' ' -k11 | awk '$$11!=old{old=$$11; print "\n\n"}{print}' > h_10cells.dat

test_h2_recfield: eucgen
	$(ZCAT) h_2cell.dat.gz h_2demo_pt.dat.gz | ./srng_eucgen - -1 0 "6 1" | sort -n -t' ' -k11 | awk '$$11!=old{old=$$11; print "\n\n"}{print}' | sort -n -s -t' ' -k3 > h_2cells.dat

test_h10_eucsgdlmbd: eucsgdlmbd
	cat h_10data.dat | ./srng_eucsgdlmbd h_10data_init.dat 50000 1000 "0 1" | awk 'NF==10 && $$1<1 && $$10<1 {for(i=1;i<=NF;i++)print cnt+0,$$i; print "\n"; ++cnt}' 

test_eucsgd: eucsgdlmbd
	cat chkbrd_small.dat | ./srng_eucsgdlmbd chkbrd_small_init.dat 1000 25 "0 .95" > tst_eucsgd.dat


mushroom_test: euclidian eucgen
	awk -vTEST=1 -f trainer.awk mushroom.batch

mushroom_train: euclidian eucgen
	@echo "May take some minutes..." && awk -f trainer.awk mushroom.batch

mushroom_train_2file: euclidian eucgen
	@echo "May take some minutes..." && awk -f trainer.awk mushroom.batch 2> mushroom.stderr > mushroom.stdout
