module Sampler:Adaptative sampling of functions.`sig`

..`end`

type`strategy =`

`float -> float -> float`

A strategy is a function

`f t1 t2`

that returns an internal point
tm between `t1`

and `t2`

which will be used to decide if we need
to increment precision or not. The given `t1`

and `t2`

will
always be finite.type`cost =`

`Archimedes.Matrix.rectangle ->`

float -> float -> float -> float -> float -> float -> float

A cost

`f bb x0 y0 xm ym x1 y1`

which returns the cost measuring
how much the three points `(x0, y0)`

, `(xm, ym)`

, and `(x1, y1)`

differ from a straight line. `bb`

is a rough bounding box of the
set of points that can be used to determine whether two points are
close (in relative measure). A cost `<= 0.`

means one is satisfied
with drawing straight lines connecting the three points.`val xy : ``?tlog:bool ->`

?n:int ->

?strategy:strategy ->

?cost:cost ->

(float -> float * float) -> float -> float -> float array * float array

`xy f t1 t2`

samples the parametric function `f`

on the
interval going from `t1`

to `t2`

. Returns a list of the points in
the sample.`tlog`

: do we need to step in a logarithmic way ?`n`

: is a maximum number of evaluations of `f`

that are allowed.
Default: `100`

.`strategy`

: a customized strategy.`cost`

: a customized cost.`val x : ``?tlog:bool ->`

?n:int ->

?strategy:strategy ->

?cost:cost ->

(float -> float) -> float -> float -> float array * float array

`x f x1 x2`

same as `Archimedes.Sampler.xy`

but for the scalar function `f`

on the interval going from `x1`

to `x2`

.`val strategy_midpoint : ``strategy`

The default strategy: choose the middle point

`val strategy_random : ``strategy`

A strategy that avoids aliasing sampling, but not efficient:
chooses randomly a point between t1 and t2

`val strategy_center_random : ``strategy`

A more efficient strategy that avoids aliasing sampling: chooses
randomly a points between t1 and t2 in its 10% center interval

`val cost_angle : ``cost`

Measures the angle at the middle point

`(xm, ym)`

, the flatter the
angle, the lower the cost.`val cost_angle_dist : ``cost`

Measures the angle at the middle point

`(xm, ym)`

, the flatter the
angle, the better and combines it with the distance of the points
`(x0, y0)`

and `(x1, y1)`

to the middle point, the smaller the
distance, the better.`val cost_angle_log : ``bool -> bool -> cost`

Same criterion as

`Archimedes.Sampler.cost_angle`

suitable for logarithmic
cordinates.