# Usage

## Getting Started

To use the FreudenthalTriangulations module, begin your code with

using FreudenthalTriangulations

## FreudenthalTriangulation

The FreudenthalTriangulation struct can be used to specify the dimension of the space which is represented by n and the m represents the granularity of the triangulation.

## Finding Freudenthal Vertices

To find a Freudenthal triangulation of a space of dimension n with granularity m use the vertices function which takes in a FreudenthalTriangulation struct and returns a list of vertices. Each of these vertices are represented by n dimensional vectors. Thus if we set T = FreudenthalTriangulation(n, m) and

V = vertices(T)

then V is a list of vertices comprising a freudenthal triangulation of an n dimensional space.

## Finding Simplex and Barycentric Coordinates

To find the vertices of the simplex around a point x in Freudenthal space and the barycentric coordinates, run

V, coords = simplex(x)

Then we have that V is the simplex vertices in the Freudenthal space and coords will be the barycentric coordinates with respect to the simplex.

For these functions, the requirements are

• x::Vector{Float64} The point in Freudenthal space
• V::Vector{Vector{Float64}} The vertices of the simplex around x in Freudenthal space
• coords::Vector{Float64} The barycentric coordinates of x with respect to the simplex

## Operating in Belief Space

This package provides two functions to operate in belief space. First to convert a freudenthal triangulation into belief space use the function

bv = belief_vertices(T)

We see that bv is a set of vertices in belief space corresponding to a freudenthal triangulation in Freudenthal space. Given any point in belief space we can find a simplex of points in these belief vertices bv and from there approximate the value function at this belief.

This leads us into the second function over the belief space, belief_simplex. This function allows us to calculate the belief simplex of a belief.

B, coords = belief_simplex(T, b)

where T is a FreudenthalTriangulation struct and b is a belief. Then we have that B is a vector containing a set of beliefs corresponding to the belief simplex and coords is the barycentric coordinates of the belief in the belief simplex.

For these functions, the requirements are

• T::FreudenthalTriangulation FreudenthalTriangulation struct
• b::Vector{Float64} A belief in the belief space
• bv::Vector{Float64} The belief vertices of a triangulation T
• B::Vector{Vector{Float64}} The vector of vertices of the belief simplex of a belief b
• coords::Vector{Float64} The barycentric coordinates of the belief in the belief simplex

## Example: Interpolating a Function in Belief Space

For an example of function approximation using this package, consider the function U(x,y) = ((x-1)^2 + (y-1)^2)^0.5. However, assume that we do not have access to U(x,y) but instead, we only know U for values [x,y] in belief_vertices(FreudenthalTriangulation(2, m)) for some granularity m. Assume for this example that the maximum granularity is m = 3. Thus we have access to a function U_vertices(x, y) which returns U(x,y) if [x,y] in belief_vertices(FreudenthalTriangulation(2, 3)) and None otherwise.

Using U_vertices, we can create a function U_interp which will approximate U(x,y) by interpolating on the Freudenthal space. To do this, we will use the freudenthal_simplex_and_coords function.

function U_interp(x, y)
X = [x, y]
T = FreudenthalTriangulation(2, 3)
B, coords = belief_simplex(T, X)

interp_val = 0
for (b, coord) in zip(B, coords)
interp_val += U_vertices(v[1], v[2]) * coord
end
return interp_val
end		

Thus U_interp allows us to approximate U at real coordinates based on the U_vertices function.