- the goal is to create a general structure that allows for polynomial composition that is correct, efficient and easy to use - the immediate use is to represent the f(b, c) polynomial in the [[gkr]] protocol, so I'd start my analysis from there and see if I can generalize later. - $f(b, c) = add(b, c)(w(b) + w(c)) + mul(b, c)(w(b) \cdot w(c))$ - we can further simplify to - $f(b, c) = add(b, c)w_1(b, c) + mul(b, c)w_2(b, c)$ - where $w_1(b, c) = w(b) + w(c)$ and $w_2(b, c) = w(b) \cdot w(c)$ - in the very specific case we have three types of polynomials - unit polynomials - represents a single [[multilinear-extension|mle]]. - sum polynomials - holds a collection of [[multilinear-extension|mle]]s that are assumed to be added to one another. - product polynomials - holds a collection of [[multilinear-extension|mle]]s that are assumed to be multiplied with one another. - we are making a tradeoff between full representation (add and multiply everything out) vs [[decomposition]] - #todo explore the cost model for decomposition vs multiplying out (there is a tradeoff space here). - rust enums could be used to achieve infinite composition - see very rough experiment: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=19dcde23b698067275a1ea78f51ba53a - more importantly, I need to define the constraints when composing - [[polynomial-composition-constraints]] - the only identifiable feature of the [[multilinear-extension|mle]]s right now is the number of variables that they have. - we don't know if two [[multilinear-extension|mle]]s share the same variables (no variable labelling), hence we have to assume. - [[uniform-variable-constraint]] - one constraint that could be had is that all [[multilinear-extension|mle]] in the composed polynomial have the same variables - the following equation fits that: - $f(b, c) = add(b, c)w_1(b, c) + mul(b, c)w_2(b, c)$ - how do we enforce such a constraint? - when constructing product, sum or unit, they ensure all the composed polynomials have the same number of variables and they themselves inherit that number. - NOTE: it is possible to combine polynomials with different variables will just need an extra labelling step to make everything work. - might also require some kind of compile time formula parsing to make the UX better. - but for the first version will stick to the [[uniform-variable-constraint]] - max variable degree calculation (assuming [[uniform-variable-constraint]]) - for unit polynomials the degree is basically 1 - for sum polynomials the degree is the highest degree of the component polynomials - for product polynomials, the degree is the sum of the degrees of the component polynomials - methods to implement - evaluate - partial_evaluate - n_vars - deg - reduce - fully evaluates the polynomial (multiply and sum everything out in the [[2HC]]) and returns the final vector - the [[hypercube|HC]] can be generalized later.