CC= g++
BIN_DIR = ../../bin
BIN_TEST_DIR = ${BIN_DIR}/test
BIN_TEST_NWGEN_DIR = ${BIN_TEST_DIR}/nwgen
BIN_TEST_NWGEN_DOTTY_DIR = ${BIN_TEST_NWGEN_DIR}/dotty
BIN_TEST_NWGEN_CHACO_DIR = ${BIN_TEST_NWGEN_DIR}/chaco
BIN_TEST_NWGEN_IMGS_DIR = ${BIN_TEST_NWGEN_DIR}/imgs
ALLOCATE = ../../src/allocator
COMPILER = ../../src/compiler/src
OBJ_DIR = ../../src/allocator/obj
BOOST_DIR = /usr/include/boost
INCLUDE = -Iinclude/ -I../../src/allocator/include/ -I../../src/compiler/include/ 

PART_LIBS =     ${OBJ_DIR}/main/user_params.o ${OBJ_DIR}/main/interface.o  \
                ${OBJ_DIR}/submain/balance.o ${OBJ_DIR}/submain/divide.o ${OBJ_DIR}/submain/submain.o \
                ${OBJ_DIR}/input/input_assign.o \
                ${OBJ_DIR}/input/check_input.o ${OBJ_DIR}/input/input.o ${OBJ_DIR}/input/input_geom.o \
                ${OBJ_DIR}/input/input_graph.o ${OBJ_DIR}/input/read_params.o ${OBJ_DIR}/input/reflect_input.o \
                ${OBJ_DIR}/input/read_val.o \
                ${OBJ_DIR}/graph/check_graph.o ${OBJ_DIR}/graph/free_graph.o \
                ${OBJ_DIR}/graph/reformat.o ${OBJ_DIR}/graph/subgraph.o ${OBJ_DIR}/graph/graph_out.o \
                ${OBJ_DIR}/inertial/eigenvec2.o ${OBJ_DIR}/inertial/eigenvec3.o ${OBJ_DIR}/inertial/inertial.o \
                ${OBJ_DIR}/inertial/inertial1d.o ${OBJ_DIR}/inertial/inertial2d.o \
                ${OBJ_DIR}/inertial/inertial3d.o ${OBJ_DIR}/inertial/make_subgeom.o \
                ${OBJ_DIR}/klspiff/buckets.o ${OBJ_DIR}/klspiff/buckets_bi.o ${OBJ_DIR}/klspiff/buckets1.o \
                ${OBJ_DIR}/klspiff/bilistops.o ${OBJ_DIR}/klspiff/coarsen_kl.o ${OBJ_DIR}/klspiff/count_weights.o \
                ${OBJ_DIR}/klspiff/compress_ewgts.o ${OBJ_DIR}/klspiff/kl_init.o ${OBJ_DIR}/klspiff/kl_output.o \
                ${OBJ_DIR}/klspiff/klspiff.o ${OBJ_DIR}/klspiff/make_bndy_list.o \
                ${OBJ_DIR}/klspiff/make_kl_list.o ${OBJ_DIR}/klspiff/nway_kl.o \
                ${OBJ_DIR}/klvspiff/bpm_improve.o ${OBJ_DIR}/klvspiff/bucketsv.o \
                ${OBJ_DIR}/klvspiff/clear_dvals.o ${OBJ_DIR}/klvspiff/coarsen_klv.o \
                ${OBJ_DIR}/klvspiff/countup_vtx_sep.o ${OBJ_DIR}/klvspiff/find_bndy.o ${OBJ_DIR}/klvspiff/flow.o \
                ${OBJ_DIR}/klvspiff/klv_init.o ${OBJ_DIR}/klvspiff/klvspiff.o ${OBJ_DIR}/klvspiff/make_bpgraph.o \
                ${OBJ_DIR}/klvspiff/make_sep_list.o ${OBJ_DIR}/klvspiff/matching.o ${OBJ_DIR}/klvspiff/nway_klv.o \
                ${OBJ_DIR}/klvspiff/flatten.o \
                ${OBJ_DIR}/coarsen/coarsen.o ${OBJ_DIR}/coarsen/interpolate.o ${OBJ_DIR}/coarsen/makefgraph.o \
                ${OBJ_DIR}/coarsen/makeccoords.o \
                ${OBJ_DIR}/coarsen/coarsen1.o ${OBJ_DIR}/coarsen/makev2cv.o \
                ${OBJ_DIR}/coarsen/maxmatch.o ${OBJ_DIR}/coarsen/maxmatch1.o ${OBJ_DIR}/coarsen/maxmatch2.o \
                ${OBJ_DIR}/coarsen/maxmatch3.o ${OBJ_DIR}/coarsen/maxmatch4.o ${OBJ_DIR}/coarsen/maxmatch5.o \
                ${OBJ_DIR}/connect/add_edges.o ${OBJ_DIR}/connect/connected.o ${OBJ_DIR}/connect/find_edges.o \
                ${OBJ_DIR}/eigen/bidir.o ${OBJ_DIR}/eigen/bisect.o ${OBJ_DIR}/eigen/checkeig.o \
                ${OBJ_DIR}/eigen/checkeig_ext.o \
                ${OBJ_DIR}/eigen/checkorth.o ${OBJ_DIR}/eigen/cksturmcnt.o ${OBJ_DIR}/eigen/mkeigvecs.o\
                ${OBJ_DIR}/eigen/eigensolve.o ${OBJ_DIR}/eigen/get_extval.o ${OBJ_DIR}/eigen/get_ritzvals.o \
                ${OBJ_DIR}/eigen/lanczos_FO.o ${OBJ_DIR}/eigen/lanczos_SO.o ${OBJ_DIR}/eigen/lanczos_SO_float.o \
                ${OBJ_DIR}/eigen/lanczos_ext.o ${OBJ_DIR}/eigen/lanczos_ext_float.o ${OBJ_DIR}/eigen/lanc_seconds.o\
                ${OBJ_DIR}/eigen/lanpause.o ${OBJ_DIR}/eigen/makeorthlnk.o ${OBJ_DIR}/eigen/mkscanlist.o \
                ${OBJ_DIR}/eigen/orthog1.o ${OBJ_DIR}/eigen/orthogonalize.o ${OBJ_DIR}/eigen/orthogvec.o \
                ${OBJ_DIR}/eigen/ql.o ${OBJ_DIR}/eigen/rqi.o ${OBJ_DIR}/eigen/rqi_ext.o ${OBJ_DIR}/eigen/scale_diag.o \
                ${OBJ_DIR}/eigen/scanmax.o ${OBJ_DIR}/eigen/scanmin.o ${OBJ_DIR}/eigen/solistout.o \
                ${OBJ_DIR}/eigen/sorthog.o ${OBJ_DIR}/eigen/splarax.o ${OBJ_DIR}/eigen/sturmcnt.o \
                ${OBJ_DIR}/eigen/Tevec.o ${OBJ_DIR}/eigen/tri_solve.o ${OBJ_DIR}/eigen/warnings.o \
                ${OBJ_DIR}/symmlq/aprod.o ${OBJ_DIR}/symmlq/msolve.o ${OBJ_DIR}/symmlq/pow_dd.o \
                ${OBJ_DIR}/symmlq/symmlq.o ${OBJ_DIR}/symmlq/symmlqblas.o \
                ${OBJ_DIR}/tinvit/tinvit.o ${OBJ_DIR}/tinvit/pythag.o ${OBJ_DIR}/tinvit/epslon.o \
                ${OBJ_DIR}/optimize/determinant.o ${OBJ_DIR}/optimize/func2d.o \
                ${OBJ_DIR}/optimize/func3d.o ${OBJ_DIR}/optimize/opt2d.o ${OBJ_DIR}/optimize/opt3d.o \
                ${OBJ_DIR}/assign/assign.o ${OBJ_DIR}/assign/assign_out.o ${OBJ_DIR}/assign/mapper.o \
                ${OBJ_DIR}/assign/median.o ${OBJ_DIR}/assign/merge_assign.o \
                ${OBJ_DIR}/assign/rec_median.o ${OBJ_DIR}/assign/rotate.o ${OBJ_DIR}/assign/y2x.o \
                ${OBJ_DIR}/bpmatch/checkbp.o ${OBJ_DIR}/bpmatch/inits2d.o ${OBJ_DIR}/bpmatch/inits3d.o \
                ${OBJ_DIR}/bpmatch/genvals2d.o ${OBJ_DIR}/bpmatch/genvals3d.o ${OBJ_DIR}/bpmatch/map2d.o \
                ${OBJ_DIR}/bpmatch/map3d.o ${OBJ_DIR}/bpmatch/movevtxs.o \
                ${OBJ_DIR}/bpmatch/sorts2d.o ${OBJ_DIR}/bpmatch/sorts3d.o \
                ${OBJ_DIR}/refine_map/compute_cube_edata.o ${OBJ_DIR}/refine_map/compute_cube_vdata.o \
                ${OBJ_DIR}/refine_map/refine_cube.o ${OBJ_DIR}/refine_map/update_cube_edata.o \
                ${OBJ_DIR}/refine_map/update_cube_vdata.o ${OBJ_DIR}/refine_map/find_edge_cube.o \
                ${OBJ_DIR}/refine_map/init_cube_edata.o ${OBJ_DIR}/refine_map/compute_mesh_edata.o \
                ${OBJ_DIR}/refine_map/compute_mesh_vdata.o ${OBJ_DIR}/refine_map/find_edge_mesh.o \
                ${OBJ_DIR}/refine_map/init_mesh_edata.o ${OBJ_DIR}/refine_map/refine_mesh.o \
                ${OBJ_DIR}/refine_map/update_mesh_edata.o ${OBJ_DIR}/refine_map/update_mesh_vdata.o \
                ${OBJ_DIR}/refine_map/refine_map.o ${OBJ_DIR}/refine_map/make_comm_graph.o \
                ${OBJ_DIR}/refine_part/refine_part.o ${OBJ_DIR}/refine_part/kl_refine.o \
                ${OBJ_DIR}/refine_part/make_maps_ref.o ${OBJ_DIR}/refine_part/make_terms_ref.o \
                ${OBJ_DIR}/internal/force_internal.o ${OBJ_DIR}/internal/improve_internal.o \
                ${OBJ_DIR}/internal/check_internal.o \
		${OBJ_DIR}/misc/define_subcubes.o ${OBJ_DIR}/misc/define_submeshes.o \
                ${OBJ_DIR}/misc/divide_procs.o ${OBJ_DIR}/misc/merge_goals.o ${OBJ_DIR}/misc/make_term_props.o \
                ${OBJ_DIR}/misc/count.o ${OBJ_DIR}/misc/countup.o ${OBJ_DIR}/misc/countup_cube.o \
                ${OBJ_DIR}/misc/countup_mesh.o ${OBJ_DIR}/misc/make_subgoal.o \
                ${OBJ_DIR}/misc/find_maxdeg.o ${OBJ_DIR}/misc/make_maps.o ${OBJ_DIR}/misc/make_setlists.o \
                ${OBJ_DIR}/misc/sequence.o ${OBJ_DIR}/misc/perturb.o ${OBJ_DIR}/misc/simple_part.o \
                ${OBJ_DIR}/misc/time_kernels.o ${OBJ_DIR}/misc/timing.o \
                ${OBJ_DIR}/util/affirm.o ${OBJ_DIR}/util/array_alloc_2D.o ${OBJ_DIR}/util/bit_reverse.o \
                ${OBJ_DIR}/util/checkpnt.o ${OBJ_DIR}/util/cpvec.o ${OBJ_DIR}/util/dot.o \
                ${OBJ_DIR}/util/doubleout.o ${OBJ_DIR}/util/input_int.o ${OBJ_DIR}/util/gray.o \
                ${OBJ_DIR}/util/machine_params.o ${OBJ_DIR}/util/makevwsqrt.o ${OBJ_DIR}/util/mkvec.o ${OBJ_DIR}/util/norm.o \
                ${OBJ_DIR}/util/normalize.o ${OBJ_DIR}/util/mergesort.o \
                ${OBJ_DIR}/util/randomize.o ${OBJ_DIR}/util/smalloc.o ${OBJ_DIR}/util/bail.o \
                ${OBJ_DIR}/util/scadd.o ${OBJ_DIR}/util/seconds.o ${OBJ_DIR}/util/setvec.o ${OBJ_DIR}/util/shell_sort.o \
                ${OBJ_DIR}/util/strout.o ${OBJ_DIR}/util/tri_prod.o ${OBJ_DIR}/util/true_or_false.o \
                ${OBJ_DIR}/util/update.o  ${OBJ_DIR}/util/vecout.o ${OBJ_DIR}/util/vecran.o \
                ${OBJ_DIR}/util/vecscale.o

LIBS =		${ALLOCATE}/part.o  ${ALLOCATE}/Allocate.o ${ALLOCATE}/Network.o ${ALLOCATE}/Node.o \
		${ALLOCATE}/VMLoad.o \
		${COMPILER}/Host.o ${COMPILER}/VM.o ${COMPILER}/VInf.o ${COMPILER}/Hub.o \
		${COMPILER}/Interface.o ${COMPILER}/MACGenerationHelper.o ${COMPILER}/driver.o \
		${COMPILER}/Parser.tab.o ${COMPILER}/Switch.o ${COMPILER}/Lex.lex.o \

NWGEN_OBJS =	NetworkGenerator.o Schedule.o Network.o Node.o RandomGenerator.o

COMMON_LIBS =	../../src/server/common.o
all: initialize nwgen testrun

initialize:
	mkdir -p ${BIN_TEST_NWGEN_DOTTY_DIR}
	mkdir -p ${BIN_TEST_NWGEN_CHACO_DIR}
	mkdir -p ${BIN_TEST_NWGEN_IMGS_DIR}

	${CC} -g -c ${INCLUDE} NetworkGenerator.C Schedule.C Network.C Node.C
	${CC} -g -c ${INCLUDE} -I${BOOST_DIR} ${DEBUG} RandomGenerator.C

nwgen: initialize
	cp -f generate_ps.sh ${BIN_TEST_NWGEN_DIR}

	${CC} ${INCLUDE} ${NWGEN_OBJS} -g nwgen.C -o ${BIN_TEST_NWGEN_DIR}/nwgen

testrun: initialize
	${CC} ${INCLUDE} ${PART_LIBS} ${LIBS} ${COMMON_LIBS} ${NWGEN_OBJS} -lm -lrt -g testrun.C -o ${BIN_TEST_NWGEN_DIR}/testrun 

schedule:
	${CC} ${INCLUDE} -lm -lrt -g -c ScheduleGen.C -o schedule.o

generator: schedule
	${CC} ${INCLUDE} schedule.o  -lm -lrt -g ScheduleGenerator.C -o generator

yagen: 
	${CC} ${INCLUDE}  -lm -lrt -g ScheduleGen2.C -o yagen

offline: schedule
	${CC} ${INCLUDE} ${PART_LIBS} ${LIBS} ${COMMON_LIBS} ${NWGEN_OBJS} schedule.o -lm -lrt -g OfflineAlgo.C -o offlineAlgo

clean:
	rm -rf ${BIN_TEST_NWGEN_DIR}
	rm -f *.o *~ \#* include/*~ include/\#*
