#!/bin/bash
HELPSTRING="^#HELP#"; # string identifying help lines

#HELP# PURPOSE: calls SCIP, optimizes, and constructs a solution file (*.sol)
#HELP# INPUT  : MIP file (*.lp)
#HELP# OUTPUT : Solution file (*.sol)
#HELP# Syntax : solve  [-o output_file] [-t time_limit_in_seconds] [--cplex] [--gurobi] lp_file
#HELP# Author : Christian Raack

TELEKOMDIR=~/COatWork-Data/1005
TIMELIMIT=180
SCIPBIN=/home/coatwork/software/ziboptsuite-1.2.0/scip-1.2.0/bin/scip
SCIPSET=$TELEKOMDIR/scripts/scip.set
CPLEXBIN=/home/coatwork/software/cplex121/bin/x86_debian4.0_4.1/cplex
CPLEXBATCH=$TELEKOMDIR/scripts/cplex.batch
GUROBIBIN=/home/coatwork/software/gurobi11/linux32/bin/gurobi.sh
GUROBISCRIPT=$TELEKOMDIR/scripts/gurobi.py
LOG=$TELEKOMDIR/solver.log
PERLFILE=$TELEKOMDIR/scripts/log2sol.pl
SOLFILE="some-solution.sol"
SOLVER="SCIP"

get_sol(){

# write some SCIP parameters to a SCIP parameter file
echo " separating/mcf/nclusters = 9" > $SCIPSET
echo " separating/mcf/checkcutshoreconnectivity = FALSE" >> $SCIPSET
echo " separating/mcf/maxinconsistencyratio = 1000" >> $SCIPSET
echo " separating/mcf/maxarcinconsistencyratio = 0.5" >> $SCIPSET
echo " separating/mcf/freq = 0" >> $SCIPSET
echo " limits/time = $TIMELIMIT" >> $SCIPSET
# write CPLEX batch file
echo "read $LPFILE" > $CPLEXBATCH
echo "set timelimit $TIMELIMIT" >> $CPLEXBATCH
echo "optimize" >> $CPLEXBATCH
echo "disp sol var -" >> $CPLEXBATCH
echo "quit" >> $CPLEXBATCH
# write gurobi script
echo "#!/usr/bin/python" > $GUROBISCRIPT
echo "from gurobipy import *" >> $GUROBISCRIPT
echo "mip = read(\"$LPFILE\")" >> $GUROBISCRIPT
echo "setParam(GRB.Param.TimeLimit,$TIMELIMIT)" >> $GUROBISCRIPT
echo "mip.optimize()" >> $GUROBISCRIPT
echo "print ' Variable Name         Value'" >> $GUROBISCRIPT
echo "for v in mip.getVars():" >> $GUROBISCRIPT
echo "   x = v.X" >> $GUROBISCRIPT
echo "   if x > 10e-6: print v.VarName, x;" >> $GUROBISCRIPT
echo "print 'All other variables in the range are 0'" >> $GUROBISCRIPT


## lets check which solver to use 
if [ $SOLVER == "CPLEX" ]
then
   if test ! -e $CPLEXBIN
   then
      echo ""
      echo "       I cannot find CPLEX binary $CPLEXBIN"
      echo "       Please set up the CPLEXBIN variable in the solve.sh script "
      echo "       Using SCIP instead ....  "
      sleep 1
   SOLVER="SCIP"
   fi
fi
if [ $SOLVER == "GUROBI" ]
then
   if test ! -e $GUROBIBIN
   then
      echo ""
      echo "       I cannot find GUROBI binary $GUROBIBIN"
      echo "       Please set up the GUROBIBIN variable in the solve.sh script "
      echo "       Using SCIP instead ....  "
      sleep 1
   SOLVER="SCIP"
   fi
fi
if [ $SOLVER == "SCIP" ]
then
   if test ! -e $SCIPBIN
   then
      echo ""
      echo " Do you have SCIP installed ??"
      echo " I cannot find $SCIPBIN"
      echo " Please set up the SCIPBIN variable in the solve.sh script"
      exit;
   fi
fi

echo ""
echo ""
echo " ..............................................................................."
echo "                  Calling $SOLVER with a time limit of " $TIMELIMIT " seconds"
echo " ..............................................................................."
echo ""
echo ""


if [ $SOLVER == "CPLEX" ]
then
   cat $CPLEXBATCH | $CPLEXBIN | tee $LOG;
else if [ $SOLVER == "GUROBI" ]
   then
      $GUROBIBIN $GUROBISCRIPT | tee $LOG;
   else
      $SCIPBIN -f $LPFILE -s $SCIPSET | tee $LOG;
   fi
fi


if test -e $TBLFILE
then
  echo ""
  echo " ........................................................ "
  echo " ........................................................ "
   if test -e $SOLFILE; then
      echo " " Moved old solution file  $SOLFILE to  $SOLFILE.bak
      mv $SOLFILE $SOLFILE.bak
   fi
   if [ $SOLVER == "SCIP" ]
   then
	# construct solution file
	$TELEKOMDIR/scripts/log2sol.pl \
                        -l $LOG  \
			-t $TBLFILE   \
			-s $SOLFILE;
   else
	# construct solution file
	$TELEKOMDIR/scripts/log2sol.pl \
                        --cplex \
                        -l $LOG  \
			-t $TBLFILE   \
			-s $SOLFILE;
  fi
  echo " ........................................................ "
  echo " ........................................................ "
  echo ""
fi

rm -f gurobi.log cplex.log $SCIPSET $CPLEXBATCH $GUROBISCRIPT $LOG
}

# --------------------------------------------------------------------------
usage() {
   grep $HELPSTRING $0 | sed -e s/$HELPSTRING//;
}


#--------------------------------------------------------------------------
#  Main
#--------------------------------------------------------------------------

# Check parameters and preconditions
if [ $# -lt 1 ]; then
   echo "please provide a MIP file (*.lp)"
   usage; exit;
fi

if [ $# -gt 7 ]; then
   echo "to many input parameters"
   usage; exit;
fi

LPBASE=""
LPDIR="./"
LPFILE=""
TBLFILE=""
umask 007
while [ $# -gt 0 ]; do
   case "$1" in
      --help)
         usage; exit;
         ;;
      --cplex)
         SOLVER="CPLEX";
         shift;
         ;;
      --gurobi)
         SOLVER="GUROBI";
         shift;
         ;;
      -t)
         TIMELIMIT=$2;
         shift;shift;
         ;;
      -o)
         if [ "$2" == "" ]; then
            echo "--- no output file given ---"
            usage; exit;
         fi
         SOLFILE=$2;
         shift;shift;
         ;;
       *)
         if test ! -e $1
         then
            echo "file $1 not found"
            usage; exit;
         else
            file=$1
            LPBASE=`basename $file .lp`
            LPDIR=`dirname $file`
            if [ "$SOLFILE" == "some-solution.sol" ];then
               SOLFILE=$LPDIR/$LPBASE.sol
            fi
            if test ! -e $LPDIR/$LPBASE.lp
            then
               echo "I will optimize but I cannot construct a solution. Use zimpl and give me a *.lp file ..."
               sleep 1
            fi
            LPFILE=$file
            # look for TBL FILE
            if test ! -e $LPDIR/$LPBASE.tbl
            then
               echo "I will optimize but I cannot construct a solution. Where is your $LPBASE.tbl file ??"
               sleep 1
            fi
            TBLFILE=$LPDIR/$LPBASE.tbl
         fi
         shift
         ;;
   esac
done
get_sol;
