import%20marimo%0A%0A__generated_with%20%3D%20%220.19.11%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20The%20form%20language%20in%20Jaxfun%20(WIP)%0A%0A%20%20%20%20Jaxfun%20consists%20of%20a%20rich%20form-language%20that%20is%20used%20to%20formulate%20problems.%20This%20language%20is%20built%20on%20top%20of%20Sympy's%20Function%20and%20Vector%20classes.%20The%20fundamental%20idea%20is%20that%20you%20choose%20a%20functionspace%20and%20then%20you%20create%20functions%20on%20that%20space.%20For%20the%20global%20Galerkin%20method%2C%20this%20means%20that%20you%20work%20with%20functions%20like%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20v(x)%20%3D%20%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%20%5Chat%7Bv%7D_i%20%5Cphi_i(x)%20%5Ctag%7B1%7D%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20where%20%24v(x)%24%20is%20your%20function%2C%20%24%5Cphi_i(x)%24%20are%20%24N%24%20basis%20functions%20and%20%24%5Chat%7Bv%7D_i%24%20are%20%24N%24%20unknown%20expansion%20coefficients.%20The%20functionspace%20corresponding%20to%20this%20function%20is%20%24V%3D%5Ctext%7Bspan%7D%5C%7B%5Cphi_i%5C%7D_%7Bi%3D0%7D%5E%7BN-1%7D%24.%20When%20we%20say%20that%20%24v(x)%20%5Cin%20V%24%2C%20this%20means%20that%20%24v%24%20can%20be%20expanded%20as%20shown%20in%20Eq.%20(1)%2C%20but%20we%20do%20not%20necessarily%20know%20the%20coefficients.%0A%0A%20%20%20%20A%20tensorproductspace%20in%202D%20Cartesian%20space%20can%20be%20defined%20as%20%24T%20%3D%20V%20%5Cotimes%20V%24.%20A%20scalar%20function%20%24f%20%5Cin%20T%24%20is%20then%20defined%20as%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20f(x%2C%20y)%20%3D%20%5Csum_%7Bi%3D0%7D%5E%7BN-1%7D%20%5Csum_%7Bj%3D0%7D%5E%7BN-1%7D%20%5Chat%7Bf%7D_%7Bij%7D%20%5Cphi_i(x)%20%5Cphi_j(y)%20%5Ctag%7B2%7D%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20with%20the%20unknown%20matrix%20%24F%3D%5C%7B%5Chat%7Bf%7D_%7Bij%7D%5C%7D_%7Bi%2Cj%3D0%7D%5E%7BN-1%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7BN%20%5Ctimes%20N%7D%24.%0A%0A%20%20%20%20A%20vector%20tensorproductspace%20in%202D%20can%20be%20defined%20as%20%24W%20%3D%20T%20%5Ctimes%20T%24.%20A%20function%20%24%5Cboldsymbol%7Bw%7D%20%5Cin%20W%24%20is%20then%20defined%20as%0A%0A%20%20%20%20%5Cbegin%7Bequation%7D%0A%20%20%20%20%5Cboldsymbol%7Bw%7D(x%2C%20y)%20%3D%20w%5E%7B(0)%7D(x%2C%20y)%20%5Cboldsymbol%7Bi%7D%20%2B%20w%5E%7B(1)%7D(x%2C%20y)%20%5Cboldsymbol%7Bj%7D%20%5Ctag%7B3%7D%0A%20%20%20%20%5Cend%7Bequation%7D%0A%0A%20%20%20%20where%20%24%5Cboldsymbol%7Bi%7D%24%20and%20%24%5Cboldsymbol%7Bj%7D%24%20are%20Cartesian%20unit%20vectors%20in%20%24x%24%20and%20%24y%24%20direction%2C%20respectively%2C%20and%20%24w%5E%7B(i)%7D%24%20represents%20component%20%24i%24%20of%20the%20vector.%20That%20is%2C%20%24w%5E%7B(0)%7D%20%3D%20%5Cboldsymbol%7Bw%7D%20%5Ccdot%20%5Cboldsymbol%7Bi%7D%24%20and%20%24w%5E%7B(1)%7D%20%3D%20%5Cboldsymbol%7Bw%7D%20%5Ccdot%20%5Cboldsymbol%7Bj%7D%24.%20In%20Eq.%20(3)%20both%20%24w%5E%7B(0)%7D%24%20and%20%24w%5E%7B(1)%7D%24%20can%20be%20expanded%20as%20shown%20in%20Eq%20(2).%0A%0A%20%20%20%20In%20Jaxfun%20you%20choose%20the%20functionspace%20and%20then%20you%20create%20functions.%20Let's%20create%20samples%20of%20all%20the%20three%20Galerkin%20functions%20defined%20above%20(%24v(x)%2C%20f(x%2C%20y)%2C%20%5Cboldsymbol%7Bw%7D(x%2C%20y)%24)%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20IPython.display%20import%20display%0A%0A%20%20%20%20import%20jax.numpy%20as%20jnp%0A%0A%20%20%20%20from%20jaxfun.galerkin%20import%20(%0A%20%20%20%20%20%20%20%20JAXFunction%2C%0A%20%20%20%20%20%20%20%20Legendre%2C%0A%20%20%20%20%20%20%20%20TensorProduct%2C%0A%20%20%20%20%20%20%20%20TestFunction%2C%0A%20%20%20%20%20%20%20%20TrialFunction%2C%0A%20%20%20%20%20%20%20%20VectorTensorProductSpace%2C%0A%20%20%20%20%20%20%20%20inner%2C%0A%20%20%20%20)%0A%0A%20%20%20%20N%20%3D%2020%0A%20%20%20%20V%20%3D%20Legendre.Legendre(N%2C%20name%3D%22V%22%2C%20fun_str%3D%22phi%22)%0A%20%20%20%20T%20%3D%20TensorProduct(V%2C%20V%2C%20name%3D%22T%22)%0A%20%20%20%20W%20%3D%20VectorTensorProductSpace(T%2C%20name%3D%22W%22)%0A%20%20%20%20v%20%3D%20TestFunction(V%2C%20name%3D%22v%22)%0A%20%20%20%20f%20%3D%20TestFunction(T%2C%20name%3D%22f%22)%0A%20%20%20%20w%20%3D%20TestFunction(W%2C%20name%3D%22w%22)%0A%20%20%20%20display(v)%0A%20%20%20%20display(f)%0A%20%20%20%20display(w)%0A%20%20%20%20return%20JAXFunction%2C%20N%2C%20T%2C%20TrialFunction%2C%20V%2C%20W%2C%20display%2C%20f%2C%20inner%2C%20jnp%2C%20v%2C%20w%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Note%20that%20the%20three%20displayed%20functions%20are%20all%20in%20unevaluated%20state.%20They%20appear%20as%20the%20left%20hand%20side%20of%20their%20definition.%20We%20see%20%24v(x%3B%20V)%24%2C%20which%20is%20the%20left%20hand%20side%20of%20Eq.%20(1)%2C%20with%20an%20additional%20%24V%24%20to%20show%20that%20this%20function%20has%20been%20created%20from%20the%20space%20named%20%22V%22.%0A%0A%20%20%20%20We%20can%20get%20the%20basisfunctions%20from%20the%20right%20hand%20side%20by%20evaluating%20the%20expressions%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(display%2C%20f%2C%20v%2C%20w)%3A%0A%20%20%20%20display(v.doit())%0A%20%20%20%20display(f.doit())%0A%20%20%20%20display(w.doit())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Note%20that%20since%20test%20functions%20do%20not%20contain%20any%20expansion%20coefficients%2C%20only%20the%20basis%20functions%20are%20shown.%20The%20superscript%20in%20parenthesis%20on%20the%20vector%20components%20shows%20the%20index%20into%20the%20vector%20of%20basis%20functions.%20Hence%2C%20%24%5Cphi_i%5E%7B(0)%7D(x)%24%20is%20the%20%24i%24'th%20basis%20function%20in%20the%20first%20component%20of%20the%20vector%20space%20%24W%24%2C%20and%20%24%5Cphi_j%5E%7B(1)%7D(y)%24%20is%20the%20%24j%24'th%20basis%20function%20in%20the%20second%20component%20of%20%24W%24.%0A%0A%20%20%20%20A%20trial%20function%20is%20similar%20to%20the%20test%20function%2C%20but%20represents%20the%20unknown%20solution%20that%20we%20are%20trying%20to%20find.%20The%20trial%20function%20is%20displayed%20exactly%20like%20the%20test%20function%2C%20but%20with%20a%20different%20index.%20Remember%20the%20test%20function%20on%20%24V%24%20was%20displayed%20as%20%24%5Cphi_i(x)%24.%20The%20trial%20function%20is%20displayed%20as%20%24%5Cphi_j(x)%24%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(TrialFunction%2C%20V%2C%20display)%3A%0A%20%20%20%20u%20%3D%20TrialFunction(V%2C%20name%3D%22u%22)%0A%20%20%20%20display(u)%0A%20%20%20%20display(u.doit())%0A%20%20%20%20return%20(u%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Trial%20and%20test%20functions%20are%20used%20together%20to%20assemble%20matrices%20in%20variational%20forms.%20Consider%20the%20L2%20inner%20product%0A%0A%20%20%20%20%24%24%0A%20%20%20%20(u%2C%20v)_%7BL%5E2(%5COmega)%7D%20%3D%20%5Cint_%7B%5COmega%7D%20%5Cphi_j(x)%5Cphi_i(x)dx%2C%20(i%2C%20j)%20%5Cin%20(0%2C%20%5Cldots%2C%20N-1)%20%5Ctimes%20(0%2C%20%5Cldots%2C%20N-1)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20where%20%24u%24%20is%20a%20trial%20function%20and%20%24v%24%20is%20a%20test%20function.%20The%20left%20hand%20side%20is%20in%20unevaluated%20form%20and%20the%20right%20hand%20side%20with%20the%20integral%20is%20in%20evaluated%20form%20using%20the%20basis%20functions%20retrieved%20from%20%60doit%60.%20This%20inner%20product%20results%20in%20a%20matrix%20%24A%20%5Cin%20%5Cmathbb%7BR%7D%5E%7BN%20%5Ctimes%20N%7D%24%20with%20components%20%24a_%7Bij%7D%20%3D%20%5Cint_%7B%5COmega%7D%20%5Cphi_j(x)%5Cphi_i(x)dx%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(display%2C%20inner%2C%20u%2C%20v)%3A%0A%20%20%20%20A%20%3D%20inner(u%20*%20v)%0A%20%20%20%20display(u%20*%20v)%0A%20%20%20%20display((u%20*%20v).doit())%0A%20%20%20%20print(%22Shape%20of%20matrix%20A%20%3D%22%2C%20A.shape)%0A%20%20%20%20return%20(A%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20integral%20is%20computed%20using%20numerical%20quadrature%20on%20the%20quadrature%20points%20of%20the%20Legendre%20basis%20functions.%20For%20multidimensional%20problems%20we%20get%20tensor%20product%20matrices%2C%20that%20we%20will%20get%20back%20to%20in%20a%20little%20while.%20First%2C%20there%20is%20a%20third%20function%20that%20deserves%20some%20attentions.%20The%20%60JAXFunction%60s%20are%20complete%20Galerkin%20functions%2C%20containing%20also%20the%20expansion%20coefficients%20of%20the%20Galerkin%20function.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(JAXFunction%2C%20N%2C%20V%2C%20display%2C%20jnp)%3A%0A%20%20%20%20h%20%3D%20JAXFunction(jnp.ones(N)%2C%20V%2C%20name%3D%22h%22)%0A%20%20%20%20display(h)%0A%20%20%20%20display(h.doit(linear%3DTrue))%0A%20%20%20%20return%20(h%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20JAXFunction%20displayed%20above%20is%20shown%20first%20in%20unevaluated%20state.%20It%20is%20shown%20as%20a%20function%20of%20%24x%24%2C%20created%20on%20the%20function%20space%20%60V%60.%20When%20evaluated%20using%20%60doit%60%2C%20the%20JAXFunction%20returns%20the%20product%20of%20its%20expansion%20coefficients%20%24%5Chat%7Bh%7D_j%24%20and%20trial%20basis%20functions%20(using%20the%20same%20index%20as%20the%20trial%20function).%20Note%20that%20there%20is%20summation%20implied%20by%20repeating%20indices.%20Unlike%20the%20test%20and%20trial%20functions%2C%20the%20JAXFunction%20may%20appear%20in%20expressions%20in%20non-linear%20form.%20In%20that%20case%2C%20we%20do%20not%20expand%20the%20function%20with%20indices%2C%20but%20treat%20it%20like%20any%20other%20computable%20function.%20Note%20the%20missing%20keyword%20argument%20%60linear%3DTrue%60%20below%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(display%2C%20h)%3A%0A%20%20%20%20display(h.doit())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20can%20create%20JAXFunctions%20for%20any%20of%20the%20three%20spaces%20created%20initially%20in%20this%20notebook%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(JAXFunction%2C%20N%2C%20T%2C%20display%2C%20jnp)%3A%0A%20%20%20%20b%20%3D%20JAXFunction(jnp.ones((N%2C%20N))%2C%20T%2C%20name%3D%22b%22)%0A%20%20%20%20display(b)%0A%20%20%20%20display(b.doit(linear%3DTrue))%0A%20%20%20%20display(b.doit())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(JAXFunction%2C%20N%2C%20W%2C%20display%2C%20jnp)%3A%0A%20%20%20%20c%20%3D%20JAXFunction(jnp.ones((2%2C%20N%2C%20N))%2C%20W%2C%20name%3D%22c%22)%0A%20%20%20%20display(c)%0A%20%20%20%20display(c.doit(linear%3DTrue))%0A%20%20%20%20display(c.doit())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Consider%20the%20%24L%5E2%24%20inner%20product%20%24(h%2C%20v)_%7BL%5E2(%5COmega)%7D%24.%20The%20integrand%20is%20now%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(h%2C%20v)%3A%0A%20%20%20%20(h%20*%20v).doit(linear%3DTrue)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Note%20the%20repeated%20%24j%24%20index%2C%20which%20implies%20summation%20(Einstein%20summation%20convention).%20There%20is%20only%20one%20free%20index%2C%20%24i%24%2C%20and%20a%20such%20%60inner(h*v)%60%20returns%20a%20vector.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(h%2C%20v)%3A%0A%20%20%20%20from%20jaxfun.galerkin.forms%20import%20split%0A%0A%20%20%20%20split(v%20*%20h)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(h%2C%20inner%2C%20v)%3A%0A%20%20%20%20hv%20%3D%20inner(h%20*%20v)%0A%20%20%20%20print(hv.shape)%0A%20%20%20%20return%20(hv%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20vector%20%60hv%60%20equals%20the%20matrix%20vector%20product%20%24A%20h%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20h%2C%20hv%2C%20jnp)%3A%0A%20%20%20%20assert%20jnp.all(hv%20%3D%3D%20A%20%40%20h)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20For%20the%20tensorproductspace%20we%20get%204%20free%20indices%2C%20%24%5Cphi_i(x)%5Cphi_j(y)%24%20from%20the%20test%20function%20and%20%24%5Cphi_k(x)%5Cphi_l(y)%24%20from%20the%20trial.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(T%2C%20TrialFunction%2C%20display%2C%20f)%3A%0A%20%20%20%20g%20%3D%20TrialFunction(T%2C%20%22g%22)%0A%20%20%20%20display((g%20*%20f).doit())%0A%20%20%20%20return%20(g%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Hence%20the%20inner%20product%20leads%20to%20a%20tensor%20with%204%20indices.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(display%2C%20f%2C%20g%2C%20inner)%3A%0A%20%20%20%20B%20%3D%20inner(f%20*%20g)%0A%20%20%20%20display(B)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20%60TPMatrix%60%20B%20is%20a%20tensor%20product%20matrix%20equal%20to%20the%20outer%20product%20of%20two%20regular%20matrices%20%24b_%7Bijkl%7D%3Db%5E%7B(0)%7D_%7Bik%7Db%5E%7B(1)%7D_%7Bjl%7D%24%2C%20where%20%24b%5E%7B(0)%7D_%7Bik%7D%3D%5Cint_%7B%5COmega_x%7D%5Cphi_i(x)%5Cphi_k(x)dx%24%20and%20%24b%5E%7B(1)%7D_%7Bjl%7D%3D%5Cint_%7B%5COmega_y%7D%5Cphi_j(y)%5Cphi_l(y)dy%24%2C%20with%20%24%5COmega%20%3D%20%5COmega_x%20%5Ctimes%20%5COmega_y%24.%20The%20two%20smaller%20matrices%20are%20stored%20under%20%60B.mats%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20A%20multilayer%20perceptron%20neural%20network%20is%20defined%20as%20the%20function%0A%0A%20%20%20%20%24%24%0A%20%20%20%20M(%5Cboldsymbol%7Bz%7D%3B%20%5Ctheta)%20%3D%20%20W%5E%7BL%7D%20%5Csigma(%20W%5E%7BL-1%7D%20%5Cldots%20%5Csigma(%20W%5E1%20%5Cboldsymbol%7Bz%7D%20%2B%20%5Cboldsymbol%7Bb%7D%5E1)%20%5Cldots%20%2B%20%5Cboldsymbol%7Bb%7D%5E%7BL-1%7D)%20%20%2B%20%5Cboldsymbol%7Bb%7D%5EL%0A%20%20%20%20%24%24%0A%0A%20%20%20%20where%20%24%5Ctheta%20%3D%20%5C%7BW%5El%2C%20%5Cboldsymbol%7Bb%7D%5El%5C%7D_%7Bl%3D1%7D%5EL%24%20represents%20all%20the%20unknowns%20in%20the%20model%20and%20%24W%5El%2C%20%5Cboldsymbol%7Bb%7D%5El%24%20represents%20the%20weights%20and%20biases%20on%20level%20%24l%24.%20The%20model%20input%20%24%5Cboldsymbol%7Bz%7D%24%20can%20be%20anything.%20For%20example%2C%20%24%5Cboldsymbol%7Bz%7D%24%20can%20represent%20%24(x)%2C%20(x%2C%20y)%2C%20(x%2C%20y%2C%20z)%2C%20(x%2C%20t)%2C%20(x%2C%20y%2C%20t)%2C%20...%24.%20For%20%24Z%24%20number%20of%20inputs%20the%20scalar%20function%20%24M_%7B%5Ctheta%7D%3A%20%5Cmathbb%7BR%7D%5EZ%20%5Crightarrow%20%5Cmathbb%7BR%7D%24.%20Similarly%2C%20a%20vector%20function%20in%202D%20space%20is%20simply%20%24M_%7B%5Ctheta%7D%3A%20%5Cmathbb%7BR%7D%5EZ%20%5Crightarrow%20%5Cmathbb%7BR%7D%5E2%24.%20The%20neural%20networks%20are%20represented%20in%20Jaxfun%20through%20a%20%60FlaxFunction%60%2C%20and%20we%20can%20use%20them%20in%20any%20numer%20of%20dimensions%20and%20also%20of%20vector%20rank.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(display)%3A%0A%20%20%20%20from%20jaxfun.pinns%20import%20FlaxFunction%2C%20MLPSpace%0A%0A%20%20%20%20M1%20%3D%20MLPSpace(%5B20%5D%2C%20dims%3D1%2C%20rank%3D0%2C%20name%3D%22M1%22)%0A%20%20%20%20M2%20%3D%20MLPSpace(%5B20%5D%2C%20dims%3D2%2C%20rank%3D0%2C%20name%3D%22M2%22)%0A%20%20%20%20M3%20%3D%20MLPSpace(%5B20%5D%2C%20dims%3D2%2C%20rank%3D1%2C%20name%3D%22M3%22)%0A%20%20%20%20f1%20%3D%20FlaxFunction(M1%2C%20name%3D%22a%22)%0A%20%20%20%20f2%20%3D%20FlaxFunction(M2%2C%20name%3D%22b%22)%0A%20%20%20%20f3%20%3D%20FlaxFunction(M3%2C%20name%3D%22c%22)%0A%20%20%20%20display(f1)%0A%20%20%20%20display(f2)%0A%20%20%20%20display(f3)%0A%20%20%20%20display(f1.doit())%0A%20%20%20%20display(f2.doit())%0A%20%20%20%20display(f3.doit())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
9b866ead5cf9ead8c619f1f4274d194a