CXX=g++

SHELL := bash
OSXFLAG = $(shell if [ "`uname`" = 'Darwin' ]; then echo '-mno-avx'; fi)

#CXXFLAGS=-fopenmp -static -O3
CXXFLAGS=-fopenmp -ffast-math -pipe -g -fPIC $(OSXFLAG)
CXXFLAGS=-fopenmp -march=native -ffast-math -fPIC -g $(OSXFLAG)
CXXFLAGS=-fopenmp -march=native -ffast-math -O3 $(OSXFLAG)

VERSION=1.74

#CXXFLAGS+= -D_USE_FLOAT_

BLASFLAGS=-llapack_atlas -lf77blas -lcblas -latlas -lgfortran -L/u/rofuyu/.local/lib  #GCC in UTCS
BLASFLAGS=-llapack -lptf77blas -lptcblas -latlas -L/home/01845/rofuyu/.local/lib  # GCC in TACC
BLASFLAGS=-lblas -llapack
LIBSFLAGS=$(BLASFLAGS)

all: omp-pmf-train omp-pmf-predict converter

omp-pmf-train: pmf-train.cpp pmf.o ccd-r1.o als.o sgd.o
	${CXX} ${CXXFLAGS} -o omp-pmf-train pmf-train.cpp pmf.o ccd-r1.o als.o sgd.o ${LIBSFLAGS}

omp-pmf-predict: pmf-predict.cpp pmf.o
	${CXX} ${CXXFLAGS} -o omp-pmf-predict pmf-predict.cpp pmf.o

converter: converter.cpp sparse_matrix.h
	${CXX} ${CXXFLAGS} -o converter converter.cpp

go: go.cpp imf.o bilinear.o pmf.o
	${CXX} ${CXXFLAGS} -std=c++11 -o go go.cpp imf.o bilinear.o pmf.o ${LIBSFLAGS}

imf.o: imf.cpp imf.h bilinear.o pmf.o
	${CXX} ${CXXFLAGS} -c -o imf.o imf.cpp 

bilinear.o: bilinear.cpp bilinear.h pmf.h sparse_matrix.h
	${CXX} ${CXXFLAGS} -c -o bilinear.o bilinear.cpp

ccd-r1.o: ccd-r1.cpp sparse_matrix.h
	${CXX} ${CXXFLAGS} -c -o ccd-r1.o ccd-r1.cpp

als.o: als.cpp sparse_matrix.h
	${CXX} ${CXXFLAGS} -c -o als.o als.cpp

sgd.o: sgd.cpp sparse_matrix.h block_matrix.h
	${CXX} ${CXXFLAGS} -c -o sgd.o sgd.cpp

pmf.o: pmf.h pmf.cpp sparse_matrix.h
	${CXX} ${CXXFLAGS} -c -o pmf.o pmf.cpp

tar:
	make clean; cd ../;  tar cvzf libpmf-${VERSION}.tgz libpmf-${VERSION}/
zip:
	make clean; cd ../;  zip -r --symlinks libpmf-${VERSION}.zip libpmf-${VERSION}/

clean:
	make -C python clean
	make -C R clean
	make -C matlab clean
	rm -rf  omp-pmf* converter *.o go

