# LocalFunctionApproximation

This package provides local function approximators that interpolates a scalar-valued function across a vector space. It does so based on the values of the function at "nearby" points, based on an appropriate locality metric, and not via any global regression or fitting function. Currently it supports multi-linear and simplex interpolations for multi-dimensional grids, and k-nearest-neighbor interpolation. Two important dependencies are GridInterpolations and NearestNeighbors.

## Installation and Usage

Start Julia and run the following:

```
Pkg.add("LocalFunctionApproximation")
using LocalFunctionApproximation
```

## Create Function Approximators

Create a rectangular grid for interpolation using `GridInterpolations`

and create the function approximator
that uses it:

```
using GridInterpolations # Make the grid interpolations module available
grid = RectangleGrid([0., 0.5, 1.],[0., 0.5, 1.]) # rectangular grid
grid_values = [8., 1., 6., 3., 5., 7., 4., 9., 2.] # corresponding values at each grid point
gifa = LocalGIFunctionApproximator(grid, grid_values) # create the function approximator using the grid and values
```

Create a nearest neighbor tree using `NearestNeighbors`

and create the corresponding approximator:

```
using NearestNeighbors, StaticArrays
points = [SVector(0.,0.), SVector(0.,1.), SVector(1.,1.), SVector(1.,0.)] # the 4 corners of the unit square
nntree = KDTree(points) # create a KDTree using the points
vals = [1., 1., -1., -1] # values corresponding to points
k = 2 # the k parameter for knn approximator
knnfa = LocalNNFunctionApproximator(nntree, points, k)
```

## Compute values at arbitrary points

```
point = rand(2) # random 2D point
compute_value(gifa, point) # obtain the value by interpolating the function at that point
compute_value(knnfa, point) # do the same for the kNN approximator
```

A typical use case for this package is for Local Approximation Value Iteration, as shown here.