/* cddmp.c       (cddlib arithmetic operations using gmp)
   written by Komei Fukuda, fukuda@math.ethz.ch
*/
/* This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "setoper.h"
#include "cdd.h"

void dd_set_global_constants()
{
 dd_init(dd_zero);
 dd_init(dd_minuszero);
 dd_init(dd_one);
 dd_init(dd_minusone);
 dd_init(dd_purezero);
  
 time(&dd_statStartTime); /* cddlib starting time */
 dd_statBApivots=0;  /* basis finding pivots */
 dd_statCCpivots=0;  /* criss-cross pivots */
 dd_statDS1pivots=0; /* phase 1 pivots */
 dd_statDS2pivots=0; /* phase 2 pivots */
 dd_statACpivots=0;  /* anticycling (cc) pivots */

 dd_choiceLPSolverDefault=dd_DualSimplex;  /* Default LP solver Algorithm */
 dd_choiceRedcheckAlgorithm=dd_DualSimplex;  /* Redundancy Checking Algorithm */
 dd_choiceLexicoPivotQ=dd_TRUE;    /* whether to use the lexicographic pivot */
 
#if defined GMPRATIONAL
 dd_statBSpivots=0;  /* basis status checking pivots */
 mpq_set_ui(dd_zero,0U,1U);
 mpq_set_ui(dd_purezero,0U,1U);
 mpq_set_ui(dd_one,1U,1U);
 mpq_set_si(dd_minusone,-1L,1U);
 ddf_set_global_constants();
#elif defined GMPFLOAT
 mpf_set_d(dd_zero,dd_almostzero);
 mpf_set_ui(dd_purezero,0U);
 mpf_set_ui(dd_one,1U);
 mpf_set_si(dd_minusone,-1L,1U);
#else
 dd_zero[0]= dd_almostzero;  /*real zero */
 dd_purezero[0]= 0.0;
 dd_one[0]= 1L;
 dd_minusone[0]= -1L;
#endif
 dd_neg(dd_minuszero,dd_zero);
}

void dd_free_global_constants()
{
 dd_clear(dd_zero);
 dd_clear(dd_minuszero);
 dd_clear(dd_one);
 dd_clear(dd_minusone);
 dd_clear(dd_purezero);
  
 time(&dd_statStartTime); /* cddlib starting time */
 dd_statBApivots=0;  /* basis finding pivots */
 dd_statCCpivots=0;  /* criss-cross pivots */
 dd_statDS1pivots=0; /* phase 1 pivots */
 dd_statDS2pivots=0; /* phase 2 pivots */
 dd_statACpivots=0;  /* anticycling (cc) pivots */

 dd_choiceLPSolverDefault=dd_DualSimplex;  /* Default LP solver Algorithm */
 dd_choiceRedcheckAlgorithm=dd_DualSimplex;  /* Redundancy Checking Algorithm */
 dd_choiceLexicoPivotQ=dd_TRUE;    /* whether to use the lexicographic pivot */
 
#if defined GMPRATIONAL
 dd_statBSpivots=0;  /* basis status checking pivots */
 ddf_free_global_constants();
#endif
}


#if defined GMPRATIONAL
void ddd_mpq_set_si(mytype a,signed long b)
{
  mpz_t nz, dz;

  mpz_init(nz); mpz_init(dz);

  mpz_set_si(nz, b);
  mpz_set_ui(dz, 1U);
  mpq_set_num(a, nz);
  mpq_set_den(a, dz);
  mpz_clear(nz);  mpz_clear(dz);
}
#endif

#if defined dd_CDOUBLE
void ddd_init(mytype a)   
{
  a[0]=0L;
}
  
void ddd_clear(mytype a)
{
  /* a[0]=0L;  */
}

void ddd_set(mytype a,mytype b)
{
  a[0]=b[0];
}

void ddd_set_d(mytype a,double b)
{
  a[0]=b;
}

void ddd_set_si(mytype a,signed long b)
{
  a[0]=(double)b;
}

void ddd_set_si2(mytype a,signed long b, unsigned long c)
{
  a[0]=(double)b/(double)c;
}

void ddd_add(mytype a,mytype b,mytype c)
{
  a[0]=b[0]+c[0];
}

void ddd_sub(mytype a,mytype b,mytype c)
{
  a[0]=b[0]-c[0];
}

void ddd_mul(mytype a,mytype b,mytype c)
{
  a[0]=b[0]*c[0];
}

void ddd_div(mytype a,mytype b,mytype c)
{
  a[0]=b[0]/c[0];
}

void ddd_neg(mytype a,mytype b)
{
  a[0]=-b[0];
}

void ddd_inv(mytype a,mytype b)
{
  a[0]=1/b[0];
}

int ddd_cmp(mytype a,mytype b)
{
  if (a[0]-b[0]>0) return 1;
  else if (a[0]-b[0]>=0) return 0;
  else return -1;
}

int ddd_sgn(mytype a)
{
  if (a[0]>0) return 1;
  else if (a[0]>=0) return 0;
  else return -1;
}

double ddd_get_d(mytype a)
{
  return a[0];
}
#endif

/* end of  cddmp.h  */
