doc: update voting theory reference
[barvinok.git] / bernstein / src / main.cpp
blobba2b3a7c005c6629b7014533d27c2548ea92b37c
1 #include <stdio.h>
2 #include <stdlib.h>
4 #include <ginac/ginac.h>
5 #include <gmp.h>
6 #include "polylib++.h"
8 #include <bernstein/bernstein.h>
9 #include <bernstein/maximize.h>
11 #define MAXRAYS 1000
13 using namespace std;
14 using namespace GiNaC;
15 using namespace bernstein;
17 static ex readPolynomial(const exvector& vars, const exvector& params);
18 static void printCoefficients(lst coeffs);
19 static int printMaxMinCoefficient(Polyhedron *VD, lst coeffs, const exvector& Params);
21 /* main function */
22 int main(void) {
23 Matrix *a, *b;
24 Polyhedron *A, *B; // initial matrices
25 char **param_name; // name of the parameters
26 exvector params, vars;
27 ex polynomial;
29 Param_Polyhedron *PP;
30 Param_Domain *Q;
32 unsigned int nb_param, nb_var;
34 printf("\n===============================================\n");
36 a = Matrix_Read();
37 A = Constraints2Polyhedron(a,200);
39 b = Matrix_Read();
40 B = Constraints2Polyhedron(b,200);
42 /* Set the number of parameters */
43 nb_param = B->Dimension;
44 nb_var = A->Dimension - B->Dimension;
46 /* Read the name of the parameters */
47 param_name = Read_ParamNames(stdin, nb_var+nb_param);
48 vars = constructParameterVector(param_name, nb_var);
49 params = constructParameterVector(param_name+nb_var, nb_param);
51 polynomial = readPolynomial(vars, params);
53 Matrix_Free(a);
54 Matrix_Free(b);
56 /* Find the parametrized domains */
57 PP = Polyhedron2Param_Domain(A,B,MAXRAYS);
58 for(Q=PP->D;Q;Q=Q->next) {
59 Polyhedron *VD;
60 lst coeffs;
62 printf("\nDomain: \n");
63 VD = DomainSimplify(Q->Domain, B, MAXRAYS);
64 Print_Domain(stdout, VD, param_name+nb_var);
65 matrix VM = domainVertices(PP, Q, params);
66 coeffs = bernsteinExpansion(VM, polynomial, vars, params);
67 printCoefficients(coeffs);
68 printMaxMinCoefficient(Q->Domain, coeffs, params);
69 Domain_Free(VD);
70 printf("\n\n===============================================\n");
73 Domain_Free(A);
74 Domain_Free(B);
75 Param_Polyhedron_Free(PP);
76 free(param_name);
78 return 0;
79 } /* main */
82 void printCoefficients(lst coeffs)
84 cout << "-----------------------------------------------" << endl;
85 cout << "Coefficients: " << endl << endl;
87 for (lst::const_iterator i = coeffs.begin(); i != coeffs.end(); ++i)
88 cout << "\t" << *i << endl;
92 /* Reads the polynomial matrix, converts it to long long precision and calls ginac functions */
93 ex readPolynomial(const exvector& vars, const exvector& params)
95 char buffer[1024], *s;
96 lst allvars;
97 ex p;
99 for (int i = 0; i < vars.size(); ++i)
100 allvars.append(vars[i]);
101 for (int i = 0; i < params.size(); ++i)
102 allvars.append(params[i]);
105 s = fgets(buffer, 1024, stdin);
106 while (s && (s[0] == '#' || s[0] == '\n'));
108 if (!s)
109 return 0;
111 try {
112 p = ex(string(s), allvars);
113 } catch (exception &p) {
114 cerr << p.what() << endl;
115 return 0;
118 return p;
122 int printMaxMinCoefficient(Polyhedron *VD, lst coeffs, const exvector& Params)
124 cout << "\tMinimum coefficient(s): " << minimize(VD, coeffs, Params) << endl;
125 cout << "\tMaximum coefficient(s): " << maximize(VD, coeffs, Params) << endl;
126 return 0;