[FFmpeg-devel] [PATCH] eval: Add taylor series evaluation support.
Nicolas George
nicolas.george at normalesup.org
Wed Feb 22 10:16:25 CET 2012
Le tridi 3 ventôse, an CCXX, Michael Niedermayer a écrit :
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
> doc/eval.texi | 7 +++++++
> libavutil/eval.c | 20 +++++++++++++++++++-
> 2 files changed, 26 insertions(+), 1 deletions(-)
>
> diff --git a/doc/eval.texi b/doc/eval.texi
> index 92fdc6d..b481bfe 100644
> --- a/doc/eval.texi
> +++ b/doc/eval.texi
> @@ -106,6 +106,13 @@ the evaluation of @var{y}, return 0 otherwise.
> @item ifnot(x, y)
> Evaluate @var{x}, and if the result is zero return the result of the
> evaluation of @var{y}, return 0 otherwise.
> +
> + at item taylor(expr, x)
> +Evaluate a taylor series at x.
> +expr represents the LD(0)-th derivates of f(x) at 0.
Could the variable id be a parameter too? Maybe optional?
> +note, when you have the derivatives at y instead of 0
> +taylor(expr, x-y) can be used
> +When the series does not converge the results are undefined.
Do you have a practical use case in mind?
> @end table
>
> The following constants are available:
> diff --git a/libavutil/eval.c b/libavutil/eval.c
> index 2ee3965..49079c5 100644
> --- a/libavutil/eval.c
> +++ b/libavutil/eval.c
> @@ -134,7 +134,7 @@ struct AVExpr {
> e_squish, e_gauss, e_ld, e_isnan,
> e_mod, e_max, e_min, e_eq, e_gt, e_gte,
> e_pow, e_mul, e_div, e_add,
> - e_last, e_st, e_while, e_floor, e_ceil, e_trunc,
> + e_last, e_st, e_while, e_taylor, e_floor, e_ceil, e_trunc,
> e_sqrt, e_not, e_random, e_hypot, e_gcd,
> e_if, e_ifnot,
> } type;
> @@ -181,6 +181,21 @@ static double eval_expr(Parser *p, AVExpr *e)
> d=eval_expr(p, e->param[1]);
> return d;
> }
> + case e_taylor: {
> + double t = 1, d = 0, ld, v;
> + double x = eval_expr(p, e->param[1]);
> + int i;
> + for(i=0; i<1000; i++) {
> + double ld = d;
ld is defined twice.
> + p->var[0] = i;
> + v = eval_expr(p, e->param[0]);
> + d += t*v;
> + if(ld==d && v)
> + break;
I am not sure if this test is correct: v could be very small but not zero,
and be much larger in a future evaluation.
> + t *= x / (i+1);
> + }
> + return d;
> + }
> default: {
> double d = eval_expr(p, e->param[0]);
> double d2 = eval_expr(p, e->param[1]);
> @@ -318,6 +333,7 @@ static int parse_primary(AVExpr **e, Parser *p)
> else if (strmatch(next, "isnan" )) d->type = e_isnan;
> else if (strmatch(next, "st" )) d->type = e_st;
> else if (strmatch(next, "while" )) d->type = e_while;
> + else if (strmatch(next, "taylor")) d->type = e_taylor;
> else if (strmatch(next, "floor" )) d->type = e_floor;
> else if (strmatch(next, "ceil" )) d->type = e_ceil;
> else if (strmatch(next, "trunc" )) d->type = e_trunc;
> @@ -698,6 +714,8 @@ int main(int argc, char **argv)
> "if(1, 2)",
> "ifnot(0, 23)",
> "ifnot(1, NaN) + if(0, 1)",
> + "taylor(1, 1)",
> + "taylor(eq(mod(ld(0),4),1)-eq(mod(ld(0),4),3), PI/2)",
> NULL
> };
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120222/f4f894e7/attachment.asc>
More information about the ffmpeg-devel
mailing list