Statistiques
| Révision :

root / pobysoC-4.0 / src / pobyso.h @ 146

Historique | Voir | Annoter | Télécharger (12 ko)

1 26 storres
/** @file pobyso.h
2 26 storres
 * Integration of Sollya to C programs
3 26 storres
 * @author S.T.
4 26 storres
 * @date 2011-10-11
5 137 storres
 * @note pobyso stands for POwered BY SOllya.
6 137 storres
 * @todo                        --      -- --
7 26 storres
 */
8 26 storres
/******************************************************************************/
9 26 storres
10 26 storres
/*
11 26 storres
 * Add below all the headers needed to get this header work.
12 26 storres
 */
13 26 storres
/* <stdio.h> is needed *before* <mpfr.h> for all MPFR input/output functions
14 26 storres
 * prototypes be defined. */
15 127 storres
#include <string.h>
16 26 storres
#include <stdio.h>
17 26 storres
#include <sollya.h>
18 26 storres
#include <mpfr.h>
19 26 storres
20 26 storres
#ifndef POBYSO_h
21 26 storres
22 128 storres
/* Typedefs to make code more readable. */
23 132 storres
24 128 storres
typedef sollya_obj_t pobyso_error_t;
25 130 storres
typedef sollya_obj_t pobyso_func_exp_t;
26 132 storres
typedef sollya_obj_t pobyso_on_off_t;
27 146 storres
typedef mpfr_prec_t  pobyso_precision_t;
28 128 storres
typedef sollya_obj_t pobyso_range_t;
29 128 storres
30 132 storres
#define POBYSO_ABSOLUTE (1)
31 132 storres
#define POBYSO_RELATIVE (2)
32 128 storres
33 146 storres
#define POBYSO_UNFAITHFUL (129)
34 139 storres
#define POBYSO_NAN (130)
35 139 storres
36 132 storres
#define POBYSO_OFF (0)
37 132 storres
#define POBYSO_ON (1)
38 128 storres
39 26 storres
/* Mimic the default behavior of interactive Sollya. */
40 26 storres
#define POBYSO_DEFAULT_POINTS 501
41 26 storres
#define POBYSO_INF_NORM_NUM_POINTS (POBYSO_DEFAULT_POINTS)
42 26 storres
#define POBYSO_GUESS_DEGREE_BOUND 1024
43 26 storres
44 128 storres
45 128 storres
/* Very thin wrappers around a lot of Sollya functions.
46 128 storres
 */
47 128 storres
static inline pobyso_error_t pobyso_error(void)
48 128 storres
{return(sollya_lib_error());}
49 128 storres
50 128 storres
static inline int pobyso_is_error(sollya_obj_t errorCandidate)
51 128 storres
{return(sollya_lib_obj_is_error(errorCandidate));}
52 128 storres
53 128 storres
static inline int pobyso_is_function(sollya_obj_t functionCandidate)
54 128 storres
{return(sollya_lib_obj_is_function(functionCandidate));}
55 128 storres
56 26 storres
/**
57 136 storres
 * Print an object to stdout.
58 134 storres
 * A very thin wrapper around the lib_sollya_autoprint() function.
59 26 storres
 */
60 26 storres
void
61 137 storres
pobyso_autoprint(sollya_obj_t objSo);
62 26 storres
63 26 storres
/**
64 26 storres
 * Print object(s) to stdout: the va_list companion function.
65 26 storres
 * A very thin wrapper around the lib_sollya_v_autoprint() function.
66 26 storres
 * The last argument in the va_list should be NULL.
67 26 storres
 */
68 26 storres
69 26 storres
void
70 137 storres
pobyso_autoprint_v(va_list va);
71 26 storres
72 133 storres
/**
73 146 storres
 * A wrapper around the Sollya dirtyfindzeros function.
74 146 storres
 * Find the numerical values of the zeroes of the funcExpSo expression over
75 146 storres
 * the [lowerBoundMp, upperBoundMp] interval.
76 146 storres
 * @param funcExpSo:    a Sollya functional expression;
77 146 storres
 * @param lowerBoundMp: the lower bound as an MPFR number;
78 146 storres
 * @param upperBoundMp: the upper bound as an MPFR number;
79 146 storres
 * @param zerosCount: a pointer to the int where the number of zeros will be
80 146 storres
 *                    stored;
81 146 storres
 * @return a (possibly empty) list of the zeroes of the function or NULL if
82 146 storres
 *         something goes wrong or there are no zeroes. *zerosCount should
83 146 storres
 *         always be tested first.
84 146 storres
 *         If *zeroCounts == 0 the function returns NULL. No deallocation is
85 146 storres
 *         needed.
86 146 storres
 *         If *zeroCounts >= 0, the list must be deallocated by the caller
87 146 storres
 *         after each of the elements has been "mpfr_cleared".
88 146 storres
 *         if something goes wrong *zeroCounts < 0.
89 146 storres
 */
90 146 storres
mpfr_t *
91 146 storres
pobyso_dirty_find_zeros_bounds(pobyso_func_exp_t funcExpSo,
92 146 storres
                              mpfr_t lowerBoundMp,
93 146 storres
                              mpfr_t upperBoundMp,
94 146 storres
                              int* zerosCount);
95 146 storres
96 146 storres
/**
97 134 storres
 * Get the current verbosity level.
98 134 storres
 * @return an integer at the current verbosity level.
99 134 storres
 */
100 134 storres
int
101 134 storres
pobyso_get_verbosity();
102 134 storres
103 134 storres
/**
104 139 storres
 * Evaluate an expression for a constant.
105 139 storres
 *
106 139 storres
 * The result of the evaluation must be "inited" by the caller.
107 140 storres
 * Its contents is modified only if the evaluation yields some useful
108 140 storres
 * result. In this case, its precision may change too.
109 139 storres
 *@param functionSo : the function to evaluate;
110 139 storres
 *@param argumentMp : the argument used for the evaluation;
111 139 storres
 *@param evalutionMp: the result of the evalution.
112 139 storres
 *@retun 0 if 0K, 1 in case of a "generic" error, POBYSO_UNFAITHFULL if the
113 139 storres
 *       result is the mean of the two bound of the range encompassing it
114 139 storres
 *       and POBYSO_NAN if the result of the evaluation is not a number.
115 139 storres
 */
116 139 storres
int
117 139 storres
pobyso_evaluate_constant(pobyso_func_exp_t functionSo,
118 139 storres
                         mpfr_t argumentMp,
119 139 storres
                         mpfr_t evaluationMp);
120 139 storres
/**
121 133 storres
 * Check if a sollya object is a constant expression.
122 133 storres
 * @return 1 if true and zero otherwise
123 133 storres
 */
124 133 storres
int
125 133 storres
pobyso_is_constant_expression(sollya_obj_t obj_to_text);
126 132 storres
127 26 storres
/**
128 138 storres
 * Check if an expression is a monomial (the free variable to an integer
129 138 storres
 * positive or null power.
130 137 storres
 * @param exprSo: a Sollya functional expression object;
131 137 storres
 * @return 1 if exprSo is a monomial (as defined above), 0 otherwise.
132 137 storres
 */
133 137 storres
int pobyso_is_monomial(pobyso_func_exp_t exprSo);
134 137 storres
135 137 storres
/**
136 138 storres
 * Check if an expression is a polynomial term (monome)
137 138 storres
 * (a constant * the free variable to an integer positive or null power or
138 138 storres
 *  the free variable to an integer positive or null power * a constant).
139 138 storres
 * @param exprSo: a Sollya functional expression object;
140 138 storres
 * @return 1 if exprSo is a polynomial term (as defined above), 0 otherwise.
141 138 storres
 */
142 138 storres
int pobyso_is_polynomial_term(pobyso_func_exp_t exprSo);
143 138 storres
144 138 storres
/**
145 137 storres
 * Check if an expression is an integer.
146 137 storres
 */
147 137 storres
int
148 137 storres
pobyso_is_int(pobyso_func_exp_t exprSo);
149 137 storres
150 137 storres
/**
151 133 storres
 * Create a Sollya monomial from a Sollya constant,
152 134 storres
 * the coefficient, and an integer, the exponent.
153 134 storres
 * @param coefficient must be a non NULL constant expression;
154 134 storres
 * @param degree must be a non negative integer;
155 133 storres
 * @return a Sollya functional expression if successes, or a Sollya error
156 133 storres
 * if fails.
157 26 storres
 */
158 134 storres
pobyso_func_exp_t
159 133 storres
pobyso_new_monomial(pobyso_func_exp_t coefficient, long degree);
160 128 storres
161 128 storres
/**
162 128 storres
 * A wrapper around the Sollya Remez function.
163 128 storres
 */
164 128 storres
/**
165 128 storres
 * Parse a string to create a Sollya object.
166 128 storres
 * A very thin wrapper around the sollya_lib_parse_string() function.
167 128 storres
 * If the final ";" is forgotten in the expression, it is added by the
168 128 storres
 * function.
169 133 storres
 * @return a Sollya functional expression if successes, or a Sollya error
170 133 storres
 * if fails.
171 128 storres
 */
172 134 storres
pobyso_func_exp_t
173 26 storres
pobyso_parse_string(const char* expression);
174 26 storres
175 26 storres
/**
176 128 storres
 * A wrapper around the Sollya Remez function with the canonical monomials
177 128 storres
 * base.
178 128 storres
 */
179 128 storres
180 130 storres
pobyso_func_exp_t
181 130 storres
pobyso_remez_canonical_monomials_base(pobyso_func_exp_t function,
182 128 storres
                                      long int degree,
183 128 storres
                                      pobyso_range_t interval,
184 130 storres
                                      pobyso_func_exp_t weight,
185 128 storres
                                      double quality,
186 128 storres
                                      pobyso_range_t bounds);
187 128 storres
188 128 storres
/**
189 128 storres
 * A wrapper around the Sollya Remez function with the a sparse monomials
190 128 storres
 * base.
191 128 storres
 */
192 128 storres
193 130 storres
pobyso_func_exp_t
194 130 storres
pobyso_remez_sparse_monomials_base(pobyso_func_exp_t);
195 128 storres
196 128 storres
/**
197 128 storres
 * A wrapper around the Sollya Remez function with the canonical monomials
198 128 storres
 * base.
199 128 storres
 */
200 128 storres
201 130 storres
pobyso_func_exp_t
202 130 storres
pobyso_remez_arbitrary_base(pobyso_func_exp_t);
203 128 storres
204 132 storres
/**
205 132 storres
 * Set the canonical mode.
206 132 storres
 */
207 128 storres
208 132 storres
int
209 132 storres
pobyso_set_canonical_on(void);
210 128 storres
211 128 storres
/**
212 26 storres
 * Set the verbosity mode off (level 0).
213 132 storres
 * The current level of verbosity is returned.
214 26 storres
 */
215 134 storres
int
216 128 storres
pobyso_set_verbosity_off(void);
217 26 storres
218 26 storres
/**
219 26 storres
 * Set the verbosity level to newVerbosityLevel.
220 132 storres
 * @param newVerbosityLevel must be a Sollya object corresponding to an
221 26 storres
 *        integer constant.
222 26 storres
 */
223 134 storres
int
224 134 storres
pobyso_set_verbosity_to(int newVerbosityLevel);
225 26 storres
226 132 storres
/**
227 134 storres
 * Wrapper around the sollya_lib_subpoly Sollya function.
228 134 storres
 */
229 132 storres
230 134 storres
pobyso_func_exp_t
231 136 storres
pobyso_subpoly(pobyso_func_exp_t polynomial, long expsNum, long* expsList);
232 134 storres
233 26 storres
#if 0
234 26 storres
/**
235 26 storres
 * Create the canonical (non sparse) base of monomials for a given degree.
236 26 storres
 */
237 26 storres
chain*
238 26 storres
pobyso_create_canonical_monomials_base(const unsigned int degree);
239 26 storres

240 26 storres
/**
241 26 storres
 * Create a chain from an array of int.
242 26 storres
 */
243 26 storres
sollya_int_list
244 26 storres
pobyso_create_int_list_from_int_Array(int* intArray,
245 26 storres
                                    const unsigned int arrayLength);
246 26 storres

247 26 storres
/**
248 26 storres
 * Create a chain from an array of int.
249 26 storres
 */
250 26 storres
sollya_int_list_t
251 26 storres
pobyso_create_int_list_from_unsigned_int_array(unsigned int* intArray,
252 26 storres
                                            const unsigned int arrayLength);
253 26 storres
/**
254 26 storres
 * Differentiation of a function.
255 26 storres
 * A slim wrapper around the Sollya differentiate function.
256 26 storres
 * @param functionNode - the Sollya node to differentiate;
257 26 storres
 * @return a node representing the function differentiated or NULL, if
258 26 storres
 *         something goes wrong.
259 26 storres
 */
260 26 storres

261 26 storres
sollya_obj_t
262 26 storres
pobyso_diff(sollya_obj_t function);
263 26 storres

264 26 storres
/**
265 26 storres
 * A match to the Sollya dirtyinfnorm.
266 26 storres
 * A slim wrapper around the Sollya function.
267 26 storres
 * @param infnorm - out parameter to return the result, must be "inited"
268 26 storres
 *                  and "cleared" by the caller;
269 26 storres
 * @param functionNode - the Sollya node to compute the infinite norm of;
270 26 storres
 * @param lowerBound - the lower bound of the interval;
271 26 storres
 * @param upperBound - the upper bound of the interval;
272 26 storres
 * @param precision  - the internal precision Sollya must use.
273 26 storres
 * @return 0 if everything is OK, != 0 if something goes wrong.
274 26 storres
 */
275 26 storres
int
276 26 storres
pobyso_dirty_infnorm(mpfr_t infNorm,
277 26 storres
                      node *functionNode,
278 26 storres
                      mpfr_t lowerBound,
279 26 storres
                      mpfr_t upperBound,
280 26 storres
                      mp_prec_t precision);
281 26 storres

282 26 storres

283 26 storres
/**
284 26 storres
 * Faithful evaluation of an expression.
285 26 storres
 *
286 26 storres
 * @param faitufulEvaluation - holds the result, must be "inited" by the
287 26 storres
 *                             caller;
288 26 storres
 */
289 26 storres
int
290 26 storres
pobyso_evaluate_faithful(mpfr_t faithfulEvaluation,
291 26 storres
                          node *nodeToEvaluate,
292 26 storres
                          mpfr_t argument,
293 26 storres
                          mpfr_prec_t precision);
294 26 storres

295 26 storres
/**
296 26 storres
 * Find the zeros of a function on a given interval.
297 26 storres
 */
298 26 storres
chain*
299 26 storres
pobyso_find_zeros(node *function,
300 26 storres
                  mpfr_t *lowerBound,
301 26 storres
                  mpfr_t *upperBound);
302 26 storres
/**
303 26 storres
 * Free a chain of node.
304 26 storres
 * All elements of the chain have to be nodes.
305 26 storres
 */
306 26 storres
void
307 26 storres
pobyso_free_chain_of_nodes(chain *theChain);
308 26 storres

309 26 storres
/**
310 26 storres
 * Free a range.
311 26 storres
 * It involves clearing the mpfr_t elements and deallocating the
312 26 storres
 * pointers.
313 26 storres
 */
314 26 storres
void
315 26 storres
pobyso_free_range(rangetype range);
316 26 storres

317 26 storres
/**
318 26 storres
 * Computes a good polynomial approximation with fixed-point or floating-point
319 26 storres
 * coefficients.
320 26 storres
 */
321 26 storres
node*
322 26 storres
pobyso_fp_minimax_canonical_monomials_base(node *function,
323 26 storres
                                          int degree,
324 26 storres
                                          chain *formats,
325 26 storres
                                          chain *points,
326 26 storres
                                          mpfr_t lowerBound,
327 26 storres
                                          mpfr_t upperBound,
328 26 storres
                                          int fpFixedArg,
329 26 storres
                                          int absRel,
330 26 storres
                                          node *constPart,
331 26 storres
                                          node *minimax);
332 26 storres
/**
333 26 storres
 * Parses a string to build the node representing the function.
334 26 storres
 * In fact, does nothing for the moment: the string must be a correct function
335 26 storres
 * definition. No error correction takes place here.
336 26 storres
 */
337 26 storres
node*
338 26 storres
pobyso_parse_function(char *functionString,
339 26 storres
                      char *freeVariableNameString);
340 26 storres

341 26 storres
/** Compute a polynomial approximation in the canonical monomials basis for
342 26 storres
 *  a function, for a given precision. The returned polynomial has the minimal
343 26 storres
 *  degree to achieve the required precision.
344 26 storres
 */
345 26 storres
node*
346 26 storres
pobyso_remez_approx_canonical_monomials_base_for_error(node *functionNode,
347 26 storres
                                                      unsigned int mode,
348 26 storres
                                                      mpfr_t lowerBound,
349 26 storres
                                                      mpfr_t upperBound,
350 26 storres
                                                      mpfr_t eps);
351 26 storres

352 26 storres
/**
353 26 storres
 * Computes a the remez approximation of a function.
354 26 storres
 * @param function   - the node holding the function to approximate;
355 26 storres
 * @param weight     - the node holding the weight function, can be NULL. In
356 26 storres
 *                     this case a default weight of "1" will be provided and
357 26 storres
 *                     the approximation is related is with respect to the
358 26 storres
 *                     absolute error.
359 26 storres
 * @param degree     - the degree of the approximation polynomial;
360 26 storres
 * @param lowerBound - the lower bound of the approximation interval;
361 26 storres
 * @param upperBound - the upper bound of the approximation interval;
362 26 storres
 * @param quality    - quality = (eps - eps*) / eps*; the search stop when the required
363 26 storres
 *                     quality is achieved.
364 26 storres
 *
365 26 storres
 * @return a node holding the approximation polynomial in Horner form.
366 26 storres
 */
367 26 storres
node*
368 26 storres
pobyso_remez_canonical_monomials_base(node *function,
369 26 storres
                                       node *weight,
370 26 storres
                                       unsigned int degree,
371 26 storres
                                       mpfr_t lowerBound,
372 26 storres
                                       mpfr_t upperBound,
373 26 storres
                                       mpfr_t quality);
374 26 storres
#endif
375 26 storres
#define POBYSO_h
376 26 storres
377 26 storres
#endif