Added cddlib-094h from http://www.inf.ethz.ch/personal/fukudak/cdd_home/
Change-Id: I64519509269e434b1b9ea87c3fe0805e711c0ac9
diff --git a/third_party/cddlib/lib-src/cddmp.c b/third_party/cddlib/lib-src/cddmp.c
new file mode 100644
index 0000000..fe04849
--- /dev/null
+++ b/third_party/cddlib/lib-src/cddmp.c
@@ -0,0 +1,185 @@
+/* cddmp.c (cddlib arithmetic operations using gmp)
+ written by Komei Fukuda, fukuda@math.ethz.ch
+ Version 0.94h, April 30, 2015
+*/
+/* 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" /* set operation library header (Ver. March 16,1995 or later) */
+#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 */