following note1

packed31 is a vector of length 16

try to understand how the trace is generated

the bottom lines actually transfer the M31 values into circleDomain

from start:

N is log N instances

this code is to initialise the witness columns, later use to store the witness.

this code generate N numbers of BaseColumns, each based columns has length 2^log_size, but it is presented by chunks of 16 length each, as packedM31.

## Constraints

in the code, the constraints is generated by component

wideFibonacciComponent is a FrameworkComponent that has general type C which implement FrameworkEval, FrameworkEval requires to defined a function evaluate which has general type E that implement EvalAtRow

WideFibonacciComponent is defined like this

frameworkComponent is defined like this

when perceive eval, remember it is a type that implement FrameworkEval, which doesn’t mean it is a struct called FrameworkEval

FrameworkEval looks like this, it is a trait!!!

EvalAtRow looks like this

where all the operations defined

new function for a generate a new component

this piece of code generate a

FIB sequence length is 32

log n instance is 6

implementation of FrameworkEval for WideFibonacciEval,

The most important function here is evaluate, which generate the fibonacci constraint

let’t understand it!

so the eval is a place to store all the constraint, it is AssertEvaluator struct

the evaluate function has input eval restricted by E EvalatRow

and the function is called like this

which means eval as AssertEvaluator should implemented EvalatRow

let’s see how it looks:

recall the component of AssertEvaluator

`TreeVec`

is essentially a wrapper around a `Vec`

(a dynamically-sized array in Rust)

The new function take a trace, create a vector that has the same length with the trace

the trait EvalAtRow has these functions need to be defined:

let’s start digging into this one

The AssertEvaluator’s implementation for next_interaction mask is:

trace is a TreeVec<Vec<Vec<BaseField>>>

it can be something like this:

```
self.trace = [
[ [1, 2, 3], [4, 5], [6] ],
[ [7, 8], [9, 10, 11] ]
];
```

when indexing TreeVec[], it find a set of witness for a single fibonacci instance, indexing TreeVec[][] find a specific witness trace (from the same vaiable!) like find [1,2,3], then row+offset will find the witness values in a specific row

and then next function next trace mask is based on next interaction mask

it would be go to the next column and the same row to read witness value.

then note3