4 #include <ginac/ginac.h>
8 #include <bernstein/bernstein.h>
9 #include <bernstein/maximize.h>
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
);
24 Polyhedron
*A
, *B
; // initial matrices
25 char **param_name
; // name of the parameters
26 exvector params
, vars
;
32 unsigned int nb_param
, nb_var
;
34 printf("\n===============================================\n");
37 A
= Constraints2Polyhedron(a
,200);
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
);
56 /* Find the parametrized domains */
57 PP
= Polyhedron2Param_Domain(A
,B
,MAXRAYS
);
58 for(Q
=PP
->D
;Q
;Q
=Q
->next
) {
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
);
70 printf("\n\n===============================================\n");
75 Param_Polyhedron_Free(PP
);
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
;
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'));
112 p
= ex(string(s
), allvars
);
113 } catch (exception
&p
) {
114 cerr
<< p
.what() << endl
;
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
;