# srtree: A symbolic regression expression tree structure.

`srtree`

is a Haskell library with a data structure and supporting functions to manipulate expression trees for symbolic regression.

The tree-like structure is defined as a fixed-point of an n-ary tree. The variables and parameters of the regression model are indexed as `Int`

type and the constant values are `Double`

.

The tree supports leaf nodes containing a variable, a free parameter, or a constant value; internal nodes that represents binary operators such as the four basic math operations, logarithm with custom base, and the power of two expressions; and unary functions specified by `Function`

data type.

The `SRTree`

structure has instances for `Num, Fractional, Floating`

which allows to create an expression as a valid Haskell expression such as:

```
x = var 0)
y = var 1
expr = x * 2 + sin(y * pi + x) :: Fix SRTree
```

## Other features:

- derivative w.r.t. a variable (
`deriveByVar`

) and w.r.t. a parameter (`deriveByParam`

)
- evaluation (
`evalTree`

)
- relabel free parameters sequentially (
`relabelParams`

)
- gradient calculation with
`forwardMode`

, or optimized with `gradParams`

if there is only a single occurrence of each parameter (most of the cases).

## TODO:

- support more advanced functions
- support conditional branching (
`IF-THEN-ELSE`

)