# This Makefile is used under Linux

MATLABDIR ?= /usr/local/matlab
CXX = g++
CC = gcc
#CXX = g++-6 # Run on 217's machines
#CC = gcc-6  # Run on 217's machines
COMPFLAGS = -fopenmp
LDFLAGS = -fopenmp 
CFLAGS = -fopenmp -fPIC -I../ 
CXXFLAGS = -fopenmp -I../


MEX = $(MATLABDIR)/bin/mex
MEX_OPTION = CC="$(CXX)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CFLAGS)"
# comment the following line if you use MATLAB on a 32-bit computer
MEX_OPTION += -largeArrayDims -lmwblas -lmwlapack
MEX_OPTION += COMPFLAGS="$(COMPFLAGS)" LDFLAGS="$(LDFLAGS)" 

COPTIMFLAGS = -O3 -DNDEBUG -march=native -ffast-math -D _USE_FLOAT_
CXXOPTIMFLAGS = -O3 -DNDEBUG -march=native -ffast-math -D _USE_FLOAT_
LDOPTIMFLAGS = -O3
MEX_TRAIN_OPTION = COPTIMFLAGS="$(COPTIMFLAGS)" CXXOPTIMFLAGS="$(CXXOPTIMFLAGS)" LDOPTIMFLAGS="$(LDOPTIMFLAGS)"

MEX_EXT = $(shell $(MATLABDIR)/bin/mexext)

all:	matlab

matlab:	binary

octave:
	@echo "please type make under Octave"
binary: pmf_train.$(MEX_EXT) pmf_predict.$(MEX_EXT) pmf_predict_topk.$(MEX_EXT) pmf_eval.$(MEX_EXT) pmf_predict_ranking.$(MEX_EXT)

pmf_train.$(MEX_EXT): pmf_train.cpp ../pmf.cpp ../ccd-r1.cpp ../als.cpp ../sgd.cpp
	$(MEX) $(MEX_OPTION) $(MEX_TRAIN_OPTION) pmf_train.cpp ../pmf.cpp ../ccd-r1.cpp ../als.cpp ../sgd.cpp

pmf_predict.$(MEX_EXT):	pmf_predict.cpp ../pmf.cpp
	$(MEX) $(MEX_OPTION) pmf_predict.cpp ../pmf.cpp

pmf_predict_topk.$(MEX_EXT): pmf_predict_topk.cpp ../pmf.cpp
	$(MEX) $(MEX_OPTION) pmf_predict_topk.cpp ../pmf.cpp

pmf_eval.$(MEX_EXT): pmf_eval.cpp ../pmf.cpp
	$(MEX) $(MEX_OPTION) pmf_eval.cpp ../pmf.cpp

pmf_predict_ranking.$(MEX_EXT): pmf_predict_ranking.cpp ../pmf.cpp
	$(MEX) $(MEX_OPTION) pmf_predict_ranking.cpp ../pmf.cpp

clean:
	rm -f *~ *.o *.mex* *.obj
