From 291a214d3c41eecc34cd8138c10464f810f0a9ab Mon Sep 17 00:00:00 2001 From: Jacan Chaplais Date: Mon, 7 Jul 2025 11:39:46 +0100 Subject: [PATCH 01/12] doc: add jax-fem example --- docs/examples/jax_fem/bar_params.json | 1 + docs/examples/jax_fem/tesseract_api.py | 340 +++++++++++++++++ docs/examples/jax_fem/tesseract_config.yaml | 38 ++ .../jax_fem/tesseract_environment.yaml | 22 ++ docs/examples/jax_fem/udf.py | 89 +++++ docs/examples/vectoradd_jax/README.md | 86 +++++ .../examples/vectoradd_jax}/requirements.txt | 0 .../examples/vectoradd_jax}/run.sh | 0 .../screenshots/header-vec-a.png | Bin .../vectoradd_jax}/screenshots/outputs.png | Bin .../vectoradd_jax}/screenshots/plot.png | Bin .../vectoradd_jax}/screenshots/vec-b.png | Bin .../examples/vectoradd_jax}/udf.py | 2 +- examples/README.md | 72 ---- examples/jax_fem/README.md | 92 +++++ examples/jax_fem/bar_params.json | 1 + examples/jax_fem/requirements.txt | 2 + examples/jax_fem/run.sh | 35 ++ examples/jax_fem/tesseract_api.py | 349 ++++++++++++++++++ examples/jax_fem/tesseract_config.yaml | 38 ++ examples/jax_fem/tesseract_environment.yaml | 22 ++ examples/jax_fem/udf.py | 89 +++++ examples/vectoradd_jax/README.md | 86 +++++ examples/vectoradd_jax/requirements.txt | 2 + examples/vectoradd_jax/run.sh | 34 ++ .../screenshots/header-vec-a.png | Bin 0 -> 45932 bytes .../vectoradd_jax/screenshots/outputs.png | Bin 0 -> 44595 bytes examples/vectoradd_jax/screenshots/plot.png | Bin 0 -> 44922 bytes examples/vectoradd_jax/screenshots/vec-b.png | Bin 0 -> 32703 bytes examples/vectoradd_jax/udf.py | 65 ++++ ruff.toml | 2 + 31 files changed, 1394 insertions(+), 73 deletions(-) create mode 100644 docs/examples/jax_fem/bar_params.json create mode 100644 docs/examples/jax_fem/tesseract_api.py create mode 100644 docs/examples/jax_fem/tesseract_config.yaml create mode 100644 docs/examples/jax_fem/tesseract_environment.yaml create mode 100644 docs/examples/jax_fem/udf.py create mode 100644 docs/examples/vectoradd_jax/README.md rename {examples => docs/examples/vectoradd_jax}/requirements.txt (100%) rename {examples => docs/examples/vectoradd_jax}/run.sh (100%) rename {examples => docs/examples/vectoradd_jax}/screenshots/header-vec-a.png (100%) rename {examples => docs/examples/vectoradd_jax}/screenshots/outputs.png (100%) rename {examples => docs/examples/vectoradd_jax}/screenshots/plot.png (100%) rename {examples => docs/examples/vectoradd_jax}/screenshots/vec-b.png (100%) rename {examples => docs/examples/vectoradd_jax}/udf.py (96%) delete mode 100644 examples/README.md create mode 100644 examples/jax_fem/README.md create mode 100644 examples/jax_fem/bar_params.json create mode 100644 examples/jax_fem/requirements.txt create mode 100644 examples/jax_fem/run.sh create mode 100644 examples/jax_fem/tesseract_api.py create mode 100644 examples/jax_fem/tesseract_config.yaml create mode 100644 examples/jax_fem/tesseract_environment.yaml create mode 100644 examples/jax_fem/udf.py create mode 100644 examples/vectoradd_jax/README.md create mode 100644 examples/vectoradd_jax/requirements.txt create mode 100644 examples/vectoradd_jax/run.sh create mode 100644 examples/vectoradd_jax/screenshots/header-vec-a.png create mode 100644 examples/vectoradd_jax/screenshots/outputs.png create mode 100644 examples/vectoradd_jax/screenshots/plot.png create mode 100644 examples/vectoradd_jax/screenshots/vec-b.png create mode 100644 examples/vectoradd_jax/udf.py diff --git a/docs/examples/jax_fem/bar_params.json b/docs/examples/jax_fem/bar_params.json new file mode 100644 index 0000000..45462c6 --- /dev/null +++ b/docs/examples/jax_fem/bar_params.json @@ -0,0 +1 @@ +[[[-30.0,-5.0,0.0],[-18.0,-5.0,0.0],[-6.0,-5.0,0.0],[6.000000953674316,-5.0,0.0],[18.0,-5.0,0.0],[30.0,-5.0,0.0]],[[-30.0,-2.5,0.0],[-18.0,-2.5,0.0],[-6.0,-2.5,0.0],[6.000000953674316,-2.5,0.0],[18.0,-2.5,0.0],[30.0,-2.5,0.0]],[[-30.0,0.0,0.0],[-18.0,0.0,0.0],[-6.0,0.0,0.0],[6.000000953674316,0.0,0.0],[18.0,0.0,0.0],[30.0,0.0,0.0]],[[-30.0,2.5,0.0],[-18.0,2.5,0.0],[-6.0,2.5,0.0],[6.000000953674316,2.5,0.0],[18.0,2.5,0.0],[30.0,2.5,0.0]]] diff --git a/docs/examples/jax_fem/tesseract_api.py b/docs/examples/jax_fem/tesseract_api.py new file mode 100644 index 0000000..88b1c8e --- /dev/null +++ b/docs/examples/jax_fem/tesseract_api.py @@ -0,0 +1,340 @@ +# Copyright 2025 Pasteur Labs. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Tesseract API module for jax-fem +# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 + + +from collections.abc import Callable +from functools import lru_cache + +import jax +import jax.numpy as jnp +import numpy as np +import pyvista as pv +from jax_fem.generate_mesh import Mesh, get_meshio_cell_type, rectangle_mesh +from jax_fem.problem import Problem +from jax_fem.solver import ad_wrapper +from pydantic import BaseModel, Field +from tesseract_core.runtime import Array, Differentiable, Float32 + +# +# Schemas +# + + +class InputSchema(BaseModel): + bar_params: Differentiable[ + Array[ + (None, None, 3), + Float32, + ] + ] = Field( + description=( + "Vertex positions of the bar geometry. " + "The shape is (num_bars, num_vertices, 3), where num_bars is the number of bars " + "and num_vertices is the number of vertices per bar. The last dimension represents " + "the x, y, z coordinates of each vertex." + ) + ) + + bar_radius: float = Field( + default=1.5, + description=( + "Radius of the bars in the geometry. " + "This is a scalar value that defines the thickness of the bars." + ), + ) + + Lx: float = Field( + default=60.0, + description=( + "Length of the plane in the x direction. " + "This is a scalar value that defines the size of the plane along the x-axis." + ), + ) + Ly: float = Field( + default=30.0, + description=( + "Length of the plane in the y direction. " + "This is a scalar value that defines the size of the plane along the y-axis." + ), + ) + Nx: int = Field( + default=60, + description=( + "Number of points in the x direction. " + "This is an integer value that defines the resolution of the plane along the x-axis." + ), + ) + Ny: int = Field( + default=30, + description=( + "Number of points in the y direction. " + "This is an integer value that defines the resolution of the plane along the y-axis." + ), + ) + epsilon: float = Field( + default=1e-5, + description=( + "Epsilon value for finite difference approximation of the Jacobian. " + "This is a small scalar value used to compute the numerical gradient." + ), + ) + + +class OutputSchema(BaseModel): + compliance: Differentiable[ + Array[ + (), + Float32, + ] + ] = Field(description="Compliance of the structure, a measure of stiffness") + + +# +# Helper functions +# + + +def build_geometry( + params: np.ndarray, + radius: float, +) -> list[pv.PolyData]: + """Build a pyvista geometry from the parameters. + + The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), + """ + n_chains = params.shape[0] + geometry = [] + + for chain in range(n_chains): + tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) + geometry.append(tube) + + return geometry + + +def compute_sdf( + params: np.ndarray, + radius: float, + Lx: float, + Ly: float, + Nx: int, + Ny: int, +) -> pv.PolyData: + """Create a pyvista plane that has the SDF values stored as a vertex attribute. + + The SDF field is computed based on the geometry defined by the parameters. + """ + grid_coords = pv.Plane( + center=(0, 0, 0), + direction=(0, 0, 1), + i_size=Lx, + j_size=Ly, + i_resolution=Nx - 1, + j_resolution=Ny - 1, + ) + grid_coords = grid_coords.triangulate() + + geometries = build_geometry( + params, + radius=radius, + ) + + sdf_field = None + + for geometry in geometries: + # Compute the implicit distance from the geometry to the grid coordinates. + # The implicit distance is a signed distance field, where positive values + # are outside the geometry and negative values are inside. + this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) + if sdf_field is None: + sdf_field = this_sdf + else: + sdf_field["implicit_distance"] = np.minimum( + sdf_field["implicit_distance"], this_sdf["implicit_distance"] + ) + + return sdf_field + + +def sdf_to_rho( + sdf: jnp.ndarray, scale: float = 4.0, offset: float = 1.0 +) -> jnp.ndarray: + """Convert signed distance function to material density using sigmoid. + + Args: + sdf: Signed distance function values. + scale: Sigmoid steepness (higher = sharper transition). + offset: SDF value where density = 0.5. + + Returns: + Material density field in [0,1]. + """ + return 1 / (1 + jnp.exp(scale * sdf - offset)) + + +# Define constitutive relationship +# Adapted from JAX-FEM +# https://github.com/deepmodeling/jax-fem/blob/1bdbf060bb32951d04ed9848c238c9a470fee1b4/demos/topology_optimization/example.py +class Elasticity(Problem): + def custom_init(self): + self.fe = self.fes[0] + self.fe.flex_inds = jnp.arange(len(self.fe.cells)) + + def get_tensor_map(self): + def stress(u_grad, theta): + Emax = 70.0e3 + Emin = 1e-3 * Emax + nu = 0.3 + penal = 3.0 + E = Emin + (Emax - Emin) * theta[0] ** penal + epsilon = 0.5 * (u_grad + u_grad.T) + eps11 = epsilon[0, 0] + eps22 = epsilon[1, 1] + eps12 = epsilon[0, 1] + sig11 = E / (1 + nu) / (1 - nu) * (eps11 + nu * eps22) + sig22 = E / (1 + nu) / (1 - nu) * (nu * eps11 + eps22) + sig12 = E / (1 + nu) * eps12 + sigma = jnp.array([[sig11, sig12], [sig12, sig22]]) + return sigma + + return stress + + def get_surface_maps(self): + def surface_map(u, x): + return jnp.array([0.0, 100.0]) + + return [surface_map] + + def set_params(self, params): + # Override base class method. + full_params = jnp.ones((self.fe.num_cells, params.shape[1])) + full_params = full_params.at[self.fe.flex_inds].set(params) + thetas = jnp.repeat(full_params[:, None, :], self.fe.num_quads, axis=1) + self.full_params = full_params + self.internal_vars = [thetas] + + def compute_compliance(self, sol): + # Surface integral + boundary_inds = self.boundary_inds_list[0] + _, nanson_scale = self.fe.get_face_shape_grads(boundary_inds) + u_face = ( + sol[self.fe.cells][boundary_inds[:, 0]][:, None, :, :] + * self.fe.face_shape_vals[boundary_inds[:, 1]][:, :, :, None] + ) + u_face = jnp.sum(u_face, axis=2) + subset_quad_points = self.physical_surface_quad_points[0] + neumann_fn = self.get_surface_maps()[0] + traction = -jax.vmap(jax.vmap(neumann_fn))(u_face, subset_quad_points) + val = jnp.sum(traction * u_face * nanson_scale[:, :, None]) + return val + + +# Memoize the setup function to avoid expensive recomputation +@lru_cache(maxsize=1) +def setup( + Nx: int = 60, + Ny: int = 30, + Lx: float = 60.0, + Ly: float = 30.0, +) -> tuple[Elasticity, Callable]: + # Specify mesh-related information. We use first-order quadrilateral element. + ele_type = "QUAD4" + cell_type = get_meshio_cell_type(ele_type) + meshio_mesh = rectangle_mesh(Nx=Nx, Ny=Ny, domain_x=Lx, domain_y=Ly) + mesh = Mesh(meshio_mesh.points, meshio_mesh.cells_dict[cell_type]) + + # Define boundary conditions and values. + def fixed_location(point): + return jnp.isclose(point[0], 0.0, atol=1e-5) + + def load_location(point): + return jnp.logical_and( + jnp.isclose(point[0], Lx, atol=1e-5), + jnp.isclose(point[1], 0.0, atol=0.1 * Ly + 1e-5), + ) + + def dirichlet_val(point): + return 0.0 + + dirichlet_bc_info = [[fixed_location] * 2, [0, 1], [dirichlet_val] * 2] + + location_fns = [load_location] + + # Define forward problem + problem = Elasticity( + mesh, + vec=2, + dim=2, + ele_type=ele_type, + dirichlet_bc_info=dirichlet_bc_info, + location_fns=location_fns, + ) + + # Apply the automatic differentiation wrapper + # This is a critical step that makes the problem solver differentiable + fwd_pred = ad_wrapper( + problem, + solver_options={"umfpack_solver": {}}, + adjoint_solver_options={"umfpack_solver": {}}, + ) + return problem, fwd_pred + + +# +# Required endpoints +# + + +def apply(inputs: InputSchema) -> OutputSchema: + Nx, Ny, Lx, Ly = inputs.Nx, inputs.Ny, inputs.Lx, inputs.Ly + sdf_geom = compute_sdf( + params=inputs.bar_params, + radius=inputs.bar_radius, + Lx=Lx, + Ly=Ly, + Nx=Nx, + Ny=Ny, + )["implicit_distance"] + sdf = sdf_geom.reshape((Ny, Nx)).T + density = jnp.reshape(sdf_to_rho(sdf), (Nx * Ny, 1)) + problem, fwd_pred = setup( + Nx=Nx, + Ny=Ny, + Lx=Lx, + Ly=Ly, + ) + sol_list = fwd_pred(density) + compliance = problem.compute_compliance(sol_list[0]) + return OutputSchema(compliance=compliance) + + +# +# Optional endpoints +# + +# import numpy as np + +# def jacobian(inputs: InputSchema, jac_inputs: set[str], jac_outputs: set[str]): +# return {} + +# def jacobian_vector_product( +# inputs: InputSchema, +# jvp_inputs: set[str], +# jvp_outputs: set[str], +# tangent_vector: dict[str, np.typing.ArrayLike] +# ) -> dict[str, np.typing.ArrayLike]: +# return {} + +# def vector_jacobian_product( +# inputs: InputSchema, +# vjp_inputs: set[str], +# vjp_outputs: set[str], +# cotangent_vector: dict[str, np.typing.ArrayLike] +# ) -> dict[str, np.typing.ArrayLike]: +# return {} + +# def abstract_eval(abstract_inputs): +# return {} diff --git a/docs/examples/jax_fem/tesseract_config.yaml b/docs/examples/jax_fem/tesseract_config.yaml new file mode 100644 index 0000000..5969af0 --- /dev/null +++ b/docs/examples/jax_fem/tesseract_config.yaml @@ -0,0 +1,38 @@ +# Tesseract configuration file +# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 + +name: "jax-fem" +version: "0.1.0" +description: | + Tesseract that computes the compliance of a structure from its gridded signed + distance function (SDF), computed from a set of shape parameters. + + Parameters are expected to define the control points and radii of piecewise + linear tubes in 3D space. + + +build_config: + # Base image to use for the container, must be Ubuntu or Debian-based + # base_image: "debian:bookworm-slim" + + # Platform to build the container for. In general, images can only be executed + # on the platform they were built for. + target_platform: "linux/x86_64" + base_image: "condaforge/miniforge3:latest" + requirements: + provider: conda + extra_packages: + - libgl1 + + # Additional packages to install in the container (via apt-get) + # extra_packages: + # - package_name + + # Data to copy into the container, relative to the project root + # package_data: + # - [path/to/source, path/to/destination] + + # Additional Dockerfile commands to run during the build process + # custom_build_steps: + # - | + # RUN echo "Hello, World!" diff --git a/docs/examples/jax_fem/tesseract_environment.yaml b/docs/examples/jax_fem/tesseract_environment.yaml new file mode 100644 index 0000000..9b5db26 --- /dev/null +++ b/docs/examples/jax_fem/tesseract_environment.yaml @@ -0,0 +1,22 @@ +name: jax-fem-env +channels: + - conda-forge +dependencies: + - python==3.12 + - numpy==1.26.4 + - scipy==1.15.2 + - matplotlib==3.10.3 + - meshio==5.3.5 + - petsc4py==3.23.3 + - fenics==2019.1.0 + - gmsh==4.13.1 + - python-gmsh==4.13.1 + - pip + - pyvista=0.45.2 + - pip: + - setuptools + - wheel + - fenics-basix==0.9.0 + - pyfiglet==1.0.3 + - jax[cpu]==0.5.3 + - jax-fem==0.0.9 diff --git a/docs/examples/jax_fem/udf.py b/docs/examples/jax_fem/udf.py new file mode 100644 index 0000000..42c4193 --- /dev/null +++ b/docs/examples/jax_fem/udf.py @@ -0,0 +1,89 @@ +import typing + +import numpy as np +import pyvista as pv + + +def _build_geometry( + params: np.ndarray, + radius: float, +) -> list[pv.PolyData]: + """Build a pyvista geometry from the parameters. + + The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), + """ + n_chains = params.shape[0] + geometry = [] + + for chain in range(n_chains): + tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) + geometry.append(tube) + + return geometry + + +def _compute_sdf( + params: np.ndarray, + radius: float, + Lx: float, + Ly: float, + Nx: int, + Ny: int, +) -> pv.PolyData: + """Create a pyvista plane that has the SDF values stored as a vertex attribute. + + The SDF field is computed based on the geometry defined by the parameters. + """ + grid_coords = pv.Plane( + center=(0, 0, 0), + direction=(0, 0, 1), + i_size=Lx, + j_size=Ly, + i_resolution=Nx - 1, + j_resolution=Ny - 1, + ) + grid_coords = grid_coords.triangulate() + + geometries = _build_geometry( + params, + radius=radius, + ) + + sdf_field = None + + for geometry in geometries: + # Compute the implicit distance from the geometry to the grid coordinates. + # The implicit distance is a signed distance field, where positive values + # are outside the geometry and negative values are inside. + this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) + if sdf_field is None: + sdf_field = this_sdf + else: + sdf_field["implicit_distance"] = np.minimum( + sdf_field["implicit_distance"], this_sdf["implicit_distance"] + ) + + return sdf_field + + +def input_geometry(inputs: dict[str, typing.Any]) -> pv.Plotter: + """Display the geometry defined by the parameters. + + Shows the chains formed of bars, and the signed distance field + around them. + """ + bar_params, bar_radius = np.array(inputs["bar_params"]), inputs["bar_radius"] + Lx, Ly, Nx, Ny = inputs["Lx"], inputs["Ly"], inputs["Nx"], inputs["Ny"] + geometries = _build_geometry(bar_params, bar_radius) + # Concatenate all pipe geometries into a single PolyData object + geometry = sum(geometries, start=pv.PolyData()) + sdf = _compute_sdf(bar_params, radius=bar_radius, Lx=Lx, Ly=Ly, Nx=Nx, Ny=Ny) + isoval = sdf.contour(isosurfaces=[0.0], scalars="implicit_distance") + + plotter = pv.Plotter() + plotter.add_mesh(geometry, color="lightblue", show_edges=True, edge_color="black") + plotter.add_mesh( + sdf, scalars="implicit_distance", cmap="coolwarm", show_edges=False + ) + plotter.add_mesh(isoval, color="red", show_edges=True, line_width=2) + return plotter diff --git a/docs/examples/vectoradd_jax/README.md b/docs/examples/vectoradd_jax/README.md new file mode 100644 index 0000000..c7c9666 --- /dev/null +++ b/docs/examples/vectoradd_jax/README.md @@ -0,0 +1,86 @@ +# Visualising `vectoradd_jax` with Streamlit + +This example shows how to quickly generate a Streamlit app to interact with the `vectoradd_jax` Tesseract. +Using `tesseract-streamlit`, you'll get an app with autogenerated input controls and optional Python-defined visualisations โ€” no UI code needed! ๐Ÿš€ + +--- + +## ๐Ÿ“ฅ Step 1: Download the Example Code + +We'll use the `vectoradd_jax` example from `tesseract-core` version `v0.9.0`. Clone it with: + +```shell +git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git ~/Downloads/tesseract-core +``` + +--- + +## ๐Ÿ“ฆ Step 2: Install Requirements + +Install the required packages for this example: + +```bash +pip install -r requirements.txt +``` + +--- + +## ๐Ÿ› ๏ธ Step 3: Build and Serve the Tesseract + +Use the Tesseract CLI to build and serve `vectoradd_jax`: + +```bash +tesseract build ~/Downloads/tesseract-core/examples/vectoradd_jax +tesseract serve vectoradd_jax +``` + +> [!NOTE] +> Make note of the `PORT` and `PROJECT ID` printed to stdout โ€” you'll need them shortly. + +--- + +## โšก Step 4: Generate the Streamlit App + +With `tesseract-streamlit` installed, generate a ready-to-run Streamlit app: + +```bash +tesseract-streamlit --user-code udf.py "http://localhost:" app.py +``` + +`udf.py` can be found in under `tesseract-streamlit/examples/vectoradd_jax/`. +It contains a custom function that takes the Tesseract's inputs and outputs and drops a Plotly-powered vector addition diagram straight into the web UI โ€” automatically! ๐ŸŽฏ +Check it out to see how it works. + +--- + +## โ–ถ๏ธ Step 5: Launch the App + +Run your new app with: + +```bash +streamlit run app.py +``` + +This will launch a web interface for submitting inputs, running the Tesseract, and visualising the results. + +--- + +## ๐Ÿ–ผ๏ธ Screenshots + +| ![](screenshots/header-vec-a.png) | ![](screenshots/outputs.png) | +| --------------------------------- | ---------------------------- | +| ![](screenshots/vec-b.png) | ![](screenshots/plot.png) | + +--- + +## ๐Ÿงน Step 6: Clean Up + +When you're done, you can stop the Tesseract server with: + +```bash +tesseract teardown +``` + +--- + +๐ŸŽ‰ Thatโ€™s it โ€” you've transformed a running Tesseract into a beautiful Streamlit web app with interactive plots, with minimal effort from the command line! diff --git a/examples/requirements.txt b/docs/examples/vectoradd_jax/requirements.txt similarity index 100% rename from examples/requirements.txt rename to docs/examples/vectoradd_jax/requirements.txt diff --git a/examples/run.sh b/docs/examples/vectoradd_jax/run.sh similarity index 100% rename from examples/run.sh rename to docs/examples/vectoradd_jax/run.sh diff --git a/examples/screenshots/header-vec-a.png b/docs/examples/vectoradd_jax/screenshots/header-vec-a.png similarity index 100% rename from examples/screenshots/header-vec-a.png rename to docs/examples/vectoradd_jax/screenshots/header-vec-a.png diff --git a/examples/screenshots/outputs.png b/docs/examples/vectoradd_jax/screenshots/outputs.png similarity index 100% rename from examples/screenshots/outputs.png rename to docs/examples/vectoradd_jax/screenshots/outputs.png diff --git a/examples/screenshots/plot.png b/docs/examples/vectoradd_jax/screenshots/plot.png similarity index 100% rename from examples/screenshots/plot.png rename to docs/examples/vectoradd_jax/screenshots/plot.png diff --git a/examples/screenshots/vec-b.png b/docs/examples/vectoradd_jax/screenshots/vec-b.png similarity index 100% rename from examples/screenshots/vec-b.png rename to docs/examples/vectoradd_jax/screenshots/vec-b.png diff --git a/examples/udf.py b/docs/examples/vectoradd_jax/udf.py similarity index 96% rename from examples/udf.py rename to docs/examples/vectoradd_jax/udf.py index 6527ade..0a1a906 100644 --- a/examples/udf.py +++ b/docs/examples/vectoradd_jax/udf.py @@ -2,7 +2,7 @@ import plotly.graph_objects as go -def plot_vector_addition(inputs, outputs) -> go.Figure: # noqa +def plot_vector_addition(inputs, outputs) -> go.Figure: """Plot vector addition using the triangle method with Plotly. Adds the input vectors A and B, scaled by their associated factors. diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index 7430b59..0000000 --- a/examples/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# vectoradd_jax - -First, we need to download the example code. Let's clone the `tesseract-core` -repo at version `0.9.0` (which is what this example was written with). -We do this at a depth of 1 to prevent cloning the repo's whole history. - -```shell -git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git ~/Downloads/tesseract-core -``` - -`tesseract-streamlit` gives users the option to pass some custom code, see -the info about `udf.py` later. -You can use whatever packages you like to write this code; for this example, -we have put the required packages in `requirements.txt`. - -```shell -pip install -r requirements.txt -``` - -Next, we can build and serve `vectoradd_jax`, which is the Tesseracct we will -be creating a Streamlit app for here. - -```shell -tesseract build ~/Downloads/tesseract-core/examples/vectoradd_jax -tesseract serve vectoradd_jax -``` - -Make a note of the `port` and `project_id` randomly assigned by -`tesseract serve`, which will print to `stdout`, as it will be useful in the -next steps. - -If you haven't already followed the [installation guide](../README.md#-installation) to -install `tesseract-streamlit`, we recommend doing this now. -We will use the command of the same name that comes with the package to -automatically generate the Streamlit app! - -```shell -tesseract-streamlit --user-code udf.py "http://localhost:" app.py -``` - -Here we have passed `udf.py`, which contains a single user-defined function -(hence the name). It takes the inputs and outputs from the Tesseract, and -returns a Plotly figure. You aren't limited to using Plotly, any visualisation -library supported by Streamlit is fine. The list can be seen [here][stplots]. -Users may also write functions to plot the inputs or outputs alone. - -Functions may have any name, and the docstrings will be used as descriptions -in the web-app accompanying the plots. -Just make sure to name the parameters `input_schema` and / or `output_schema` -accordingly, and `tesseract-streamlit` will handle the rest. - -Finally, we can run our app! Since we have generated a Streamlit app to call -our Tesseract, we spin it up using `streamlit run`. - -```shell -streamlit run app.py -``` - -Hey presto! You should have a web-app with automatically generated inputs for -the `vectoradd_jax` Tesseract, with some custom visualisations! - - -| ![](screenshots/header-vec-a.png) | ![](screenshots/outputs.png) | -| --------------------------------- | ---------------------------- | -| ![](screenshots/vec-b.png) | ![](screenshots/plot.png) | - -When you finish up, you may want to stop serving the Tesseract. You can do this -with - -```shell -tesseract teardown -``` diff --git a/examples/jax_fem/README.md b/examples/jax_fem/README.md new file mode 100644 index 0000000..bc86b16 --- /dev/null +++ b/examples/jax_fem/README.md @@ -0,0 +1,92 @@ +# Using JAX with finite element methods (JAX-FEM) + +In this example, you'll generate a Streamlit app from a Tesseract which models a structure and computes its compliance with finite element methods. +This is based on the excellent example for [shape optimisation in Tesseract JAX](https://docs.pasteurlabs.ai/projects/tesseract-jax/latest/examples/fem-shapeopt/demo.html) using JAX-FEM. +This, of course, uses `tesseract-streamlit` to automatically generate an interactive web app, this time with an interactive PyVista plot of the structure! โšก + +--- + +## ๐Ÿ“ฅ Step 1: Download the Example Code + +We've written a custom Tesseract for this example, mashing up the Design Tesseract and FEM Tesseract from the original Tesseract JAX tutorial, so clone `tesseract-streamlit` like so: + +```shell +git clone --depth 1 https://github.com/pasteurlabs/tesseract-streamlit.git ~/Downloads/tesseract-streamlit +``` + +--- + +## ๐Ÿ“ฆ Step 2: Install Requirements + +Enter the example directory, and install the required packages: + +```bash +cd ~/Documents/tesseract-streamlit/examples/jax_fem +pip install -r requirements.txt +``` + +--- + +## ๐Ÿ› ๏ธ Step 3: Build and Serve the Tesseract + +Use the Tesseract CLI to build and serve `jax-fem`: + +```bash +tesseract build ~/Downloads/tesseract-core/examples/jax_fem +tesseract serve jax-fem +``` + +> [!NOTE] +> Make note of the `PORT` and `PROJECT ID` printed to stdout โ€” you'll need them shortly. + +--- + +## โšก Step 4: Generate the Streamlit App + +With `tesseract-streamlit` installed, generate a ready-to-run Streamlit app: + +```bash +tesseract-streamlit --user-code udf.py "http://localhost:" app.py +``` + +`udf.py` can be found in under `tesseract-streamlit/examples/jax-fem/`. +It contains a custom function that takes the Tesseract's inputs to render a PyVista plot of the design structure directly in the UI! โš™๏ธ +Check out the [source code to see how it works](https://github.com/pasteurlabs/tesseract-streamlit/examples/jax_fem/udf.py). + +--- + +## โ–ถ๏ธ Step 5: Launch the App + +Run your new app with: + +```bash +streamlit run app.py +``` + +This will launch a web interface for submitting inputs, running the Tesseract, and visualising the results. + +The form is populated from sensible defaults defined in `tesseract_api.py`. +To easily provide the input parameters for the structure itself, you can upload the `bar_params.json` file in the current directory. + +--- + +## ๐Ÿ–ผ๏ธ Screenshots + + +| | | +| --- | --- | +| | | + +--- + +## ๐Ÿงน Step 6: Clean Up + +When you're done, you can stop the Tesseract server with: + +```bash +tesseract teardown +``` + +--- + +๐ŸŽ‰ Thatโ€™s it โ€” you've transformed a running Tesseract into a beautiful Streamlit web app with interactive plots, with minimal effort from the command line! diff --git a/examples/jax_fem/bar_params.json b/examples/jax_fem/bar_params.json new file mode 100644 index 0000000..45462c6 --- /dev/null +++ b/examples/jax_fem/bar_params.json @@ -0,0 +1 @@ +[[[-30.0,-5.0,0.0],[-18.0,-5.0,0.0],[-6.0,-5.0,0.0],[6.000000953674316,-5.0,0.0],[18.0,-5.0,0.0],[30.0,-5.0,0.0]],[[-30.0,-2.5,0.0],[-18.0,-2.5,0.0],[-6.0,-2.5,0.0],[6.000000953674316,-2.5,0.0],[18.0,-2.5,0.0],[30.0,-2.5,0.0]],[[-30.0,0.0,0.0],[-18.0,0.0,0.0],[-6.0,0.0,0.0],[6.000000953674316,0.0,0.0],[18.0,0.0,0.0],[30.0,0.0,0.0]],[[-30.0,2.5,0.0],[-18.0,2.5,0.0],[-6.0,2.5,0.0],[6.000000953674316,2.5,0.0],[18.0,2.5,0.0],[30.0,2.5,0.0]]] diff --git a/examples/jax_fem/requirements.txt b/examples/jax_fem/requirements.txt new file mode 100644 index 0000000..6d221c4 --- /dev/null +++ b/examples/jax_fem/requirements.txt @@ -0,0 +1,2 @@ +pyvista==0.45.2 +numpy==2.2.5 diff --git a/examples/jax_fem/run.sh b/examples/jax_fem/run.sh new file mode 100644 index 0000000..dfb1523 --- /dev/null +++ b/examples/jax_fem/run.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# the parent dir of this script: +scriptdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# a temporary dir to store the downloads for the example: +tmpdir=$(mktemp -d) +workdir="${tmpdir}/tesseract-streamlit" + +# clone tesseract-core for its example subdirectory: +git clone --depth 1 --branch jacan/examples git@github.com:pasteurlabs/tesseract-streamlit.git $workdir + +# install requirements for the udf.py module: +pip install -r "${scriptdir}/requirements.txt" + +# build and serve the vectoradd_jax example tesseract: +example=jax_fem +tesseract build "${workdir}/examples/${example}" +tessinfo=$(tesseract serve $example) +tessid=$(echo $tessinfo | jq -r '.project_id') +tessport=$(echo $tessinfo | jq -r '.containers[0].port') + +# automatically generate the Streamlit app from the served tesseract: +tesseract-streamlit --user-code "${scriptdir}/udf.py" "http://localhost:${tessport}" "${tmpdir}/app.py" + +# launch the web-app: +streamlit run "${tmpdir}/app.py" + +# stop serving the tesseract +tesseract teardown $tessid + +# clean up the temporary directory: +rm -rf $tmpdir + +exit 0 diff --git a/examples/jax_fem/tesseract_api.py b/examples/jax_fem/tesseract_api.py new file mode 100644 index 0000000..0b66a22 --- /dev/null +++ b/examples/jax_fem/tesseract_api.py @@ -0,0 +1,349 @@ +# Copyright 2025 Pasteur Labs. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Tesseract API module for jax-fem +# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 + + +from collections.abc import Callable +from functools import lru_cache + +import jax +import jax.numpy as jnp +import numpy as np +import pyvista as pv +from jax_fem.generate_mesh import Mesh, get_meshio_cell_type, rectangle_mesh +from jax_fem.problem import Problem +from jax_fem.solver import ad_wrapper +from pydantic import BaseModel, Field +from tesseract_core.runtime import Array, Differentiable, Float32 + +# +# Schemas +# + + +class InputSchema(BaseModel): + bar_params: Differentiable[ + Array[ + (None, None, 3), + Float32, + ] + ] = Field( + description=( + "Vertex positions of the bar geometry. " + "The shape is (num_bars, num_vertices, 3), where num_bars is the number of bars " + "and num_vertices is the number of vertices per bar. The last dimension represents " + "the x, y, z coordinates of each vertex." + ) + ) + + bar_radius: float = Field( + default=1.5, + description=( + "Radius of the bars in the geometry. " + "This is a scalar value that defines the thickness of the bars." + ), + ) + + Lx: float = Field( + default=60.0, + description=( + "Length of the plane in the x direction. " + "This is a scalar value that defines the size of the plane along the x-axis." + ), + ) + Ly: float = Field( + default=30.0, + description=( + "Length of the plane in the y direction. " + "This is a scalar value that defines the size of the plane along the y-axis." + ), + ) + Nx: int = Field( + default=60, + description=( + "Number of points in the x direction. " + "This is an integer value that defines the resolution of the plane along the x-axis." + ), + ) + Ny: int = Field( + default=30, + description=( + "Number of points in the y direction. " + "This is an integer value that defines the resolution of the plane along the y-axis." + ), + ) + epsilon: float = Field( + default=1e-5, + description=( + "Epsilon value for finite difference approximation of the Jacobian. " + "This is a small scalar value used to compute the numerical gradient." + ), + ) + + +class OutputSchema(BaseModel): + compliance: Differentiable[ + Array[ + (), + Float32, + ] + ] = Field(description="Compliance of the structure, a measure of stiffness") + + +# +# Helper functions +# + + +def build_geometry( + params: np.ndarray, + radius: float, +) -> list[pv.PolyData]: + """Build a pyvista geometry from the parameters. + + The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), + """ + n_chains = params.shape[0] + geometry = [] + + for chain in range(n_chains): + tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) + geometry.append(tube) + + return geometry + + +def compute_sdf( + params: np.ndarray, + radius: float, + Lx: float, + Ly: float, + Nx: int, + Ny: int, +) -> pv.PolyData: + """Create a pyvista plane that has the SDF values stored as a vertex attribute. + + The SDF field is computed based on the geometry defined by the parameters. + """ + grid_coords = pv.Plane( + center=(0, 0, 0), + direction=(0, 0, 1), + i_size=Lx, + j_size=Ly, + i_resolution=Nx - 1, + j_resolution=Ny - 1, + ) + grid_coords = grid_coords.triangulate() + + geometries = build_geometry( + params, + radius=radius, + ) + + sdf_field = None + + for geometry in geometries: + # Compute the implicit distance from the geometry to the grid coordinates. + # The implicit distance is a signed distance field, where positive values + # are outside the geometry and negative values are inside. + this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) + if sdf_field is None: + sdf_field = this_sdf + else: + sdf_field["implicit_distance"] = np.minimum( + sdf_field["implicit_distance"], this_sdf["implicit_distance"] + ) + + return sdf_field + + +def sdf_to_rho( + sdf: jnp.ndarray, scale: float = 4.0, offset: float = 1.0 +) -> jnp.ndarray: + """Convert signed distance function to material density using sigmoid. + + Args: + sdf: Signed distance function values. + scale: Sigmoid steepness (higher = sharper transition). + offset: SDF value where density = 0.5. + + Returns: + Material density field in [0,1]. + """ + return 1 / (1 + jnp.exp(scale * sdf - offset)) + + +# Define constitutive relationship +# Adapted from JAX-FEM +# https://github.com/deepmodeling/jax-fem/blob/1bdbf060bb32951d04ed9848c238c9a470fee1b4/demos/topology_optimization/example.py +class Elasticity(Problem): + def custom_init(self): + self.fe = self.fes[0] + self.fe.flex_inds = jnp.arange(len(self.fe.cells)) + + def get_tensor_map(self): + def stress(u_grad, theta): + Emax = 70.0e3 + Emin = 1e-3 * Emax + nu = 0.3 + penal = 3.0 + E = Emin + (Emax - Emin) * theta[0] ** penal + epsilon = 0.5 * (u_grad + u_grad.T) + eps11 = epsilon[0, 0] + eps22 = epsilon[1, 1] + eps12 = epsilon[0, 1] + sig11 = E / (1 + nu) / (1 - nu) * (eps11 + nu * eps22) + sig22 = E / (1 + nu) / (1 - nu) * (nu * eps11 + eps22) + sig12 = E / (1 + nu) * eps12 + sigma = jnp.array([[sig11, sig12], [sig12, sig22]]) + return sigma + + return stress + + def get_surface_maps(self): + def surface_map(u, x): + return jnp.array([0.0, 100.0]) + + return [surface_map] + + def set_params(self, params): + # Override base class method. + full_params = jnp.ones((self.fe.num_cells, params.shape[1])) + full_params = full_params.at[self.fe.flex_inds].set(params) + thetas = jnp.repeat(full_params[:, None, :], self.fe.num_quads, axis=1) + self.full_params = full_params + self.internal_vars = [thetas] + + def compute_compliance(self, sol): + # Surface integral + boundary_inds = self.boundary_inds_list[0] + _, nanson_scale = self.fe.get_face_shape_grads(boundary_inds) + u_face = ( + sol[self.fe.cells][boundary_inds[:, 0]][:, None, :, :] + * self.fe.face_shape_vals[boundary_inds[:, 1]][:, :, :, None] + ) + u_face = jnp.sum(u_face, axis=2) + subset_quad_points = self.physical_surface_quad_points[0] + neumann_fn = self.get_surface_maps()[0] + traction = -jax.vmap(jax.vmap(neumann_fn))(u_face, subset_quad_points) + val = jnp.sum(traction * u_face * nanson_scale[:, :, None]) + return val + + +# Memoize the setup function to avoid expensive recomputation +@lru_cache(maxsize=1) +def setup( + Nx: int = 60, + Ny: int = 30, + Lx: float = 60.0, + Ly: float = 30.0, +) -> tuple[Elasticity, Callable]: + # Specify mesh-related information. We use first-order quadrilateral element. + ele_type = "QUAD4" + cell_type = get_meshio_cell_type(ele_type) + meshio_mesh = rectangle_mesh(Nx=Nx, Ny=Ny, domain_x=Lx, domain_y=Ly) + mesh = Mesh(meshio_mesh.points, meshio_mesh.cells_dict[cell_type]) + + # Define boundary conditions and values. + def fixed_location(point): + return jnp.isclose(point[0], 0.0, atol=1e-5) + + def load_location(point): + return jnp.logical_and( + jnp.isclose(point[0], Lx, atol=1e-5), + jnp.isclose(point[1], 0.0, atol=0.1 * Ly + 1e-5), + ) + + def dirichlet_val(point): + return 0.0 + + dirichlet_bc_info = [[fixed_location] * 2, [0, 1], [dirichlet_val] * 2] + + location_fns = [load_location] + + # Define forward problem + problem = Elasticity( + mesh, + vec=2, + dim=2, + ele_type=ele_type, + dirichlet_bc_info=dirichlet_bc_info, + location_fns=location_fns, + ) + + # Apply the automatic differentiation wrapper + # This is a critical step that makes the problem solver differentiable + fwd_pred = ad_wrapper( + problem, + solver_options={"umfpack_solver": {}}, + adjoint_solver_options={"umfpack_solver": {}}, + ) + return problem, fwd_pred + + +# +# Required endpoints +# + + +def apply(inputs: InputSchema) -> OutputSchema: + """Computes the compliance of a structure. + + Gridded signed distance function (SDF) is computed from a set of + shape parameters, which are taken as inputs. + Parameters define control points and radii of piecewise 3D tubes. + + JAX-FEM evaluates compliance of the structure from density as a + function of the SDF field. + """ + Nx, Ny, Lx, Ly = inputs.Nx, inputs.Ny, inputs.Lx, inputs.Ly + sdf_geom = compute_sdf( + params=inputs.bar_params, + radius=inputs.bar_radius, + Lx=Lx, + Ly=Ly, + Nx=Nx, + Ny=Ny, + )["implicit_distance"] + sdf = sdf_geom.reshape((Ny, Nx)).T + density = jnp.reshape(sdf_to_rho(sdf), (Nx * Ny, 1)) + problem, fwd_pred = setup( + Nx=Nx, + Ny=Ny, + Lx=Lx, + Ly=Ly, + ) + sol_list = fwd_pred(density) + compliance = problem.compute_compliance(sol_list[0]) + return OutputSchema(compliance=compliance) + + +# +# Optional endpoints +# + +# import numpy as np + +# def jacobian(inputs: InputSchema, jac_inputs: set[str], jac_outputs: set[str]): +# return {} + +# def jacobian_vector_product( +# inputs: InputSchema, +# jvp_inputs: set[str], +# jvp_outputs: set[str], +# tangent_vector: dict[str, np.typing.ArrayLike] +# ) -> dict[str, np.typing.ArrayLike]: +# return {} + +# def vector_jacobian_product( +# inputs: InputSchema, +# vjp_inputs: set[str], +# vjp_outputs: set[str], +# cotangent_vector: dict[str, np.typing.ArrayLike] +# ) -> dict[str, np.typing.ArrayLike]: +# return {} + +# def abstract_eval(abstract_inputs): +# return {} diff --git a/examples/jax_fem/tesseract_config.yaml b/examples/jax_fem/tesseract_config.yaml new file mode 100644 index 0000000..2aa8424 --- /dev/null +++ b/examples/jax_fem/tesseract_config.yaml @@ -0,0 +1,38 @@ +# Tesseract configuration file +# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 + +name: "jax_fem" +version: "0.1.0" +description: | + Tesseract that computes the compliance of a structure from its gridded signed + distance function (SDF), computed from a set of shape parameters. + + Parameters are expected to define the control points and radii of piecewise + linear tubes in 3D space. + + +build_config: + # Base image to use for the container, must be Ubuntu or Debian-based + # base_image: "debian:bookworm-slim" + + # Platform to build the container for. In general, images can only be executed + # on the platform they were built for. + target_platform: "linux/x86_64" + base_image: "condaforge/miniforge3:latest" + requirements: + provider: conda + extra_packages: + - libgl1 + + # Additional packages to install in the container (via apt-get) + # extra_packages: + # - package_name + + # Data to copy into the container, relative to the project root + # package_data: + # - [path/to/source, path/to/destination] + + # Additional Dockerfile commands to run during the build process + # custom_build_steps: + # - | + # RUN echo "Hello, World!" diff --git a/examples/jax_fem/tesseract_environment.yaml b/examples/jax_fem/tesseract_environment.yaml new file mode 100644 index 0000000..9b5db26 --- /dev/null +++ b/examples/jax_fem/tesseract_environment.yaml @@ -0,0 +1,22 @@ +name: jax-fem-env +channels: + - conda-forge +dependencies: + - python==3.12 + - numpy==1.26.4 + - scipy==1.15.2 + - matplotlib==3.10.3 + - meshio==5.3.5 + - petsc4py==3.23.3 + - fenics==2019.1.0 + - gmsh==4.13.1 + - python-gmsh==4.13.1 + - pip + - pyvista=0.45.2 + - pip: + - setuptools + - wheel + - fenics-basix==0.9.0 + - pyfiglet==1.0.3 + - jax[cpu]==0.5.3 + - jax-fem==0.0.9 diff --git a/examples/jax_fem/udf.py b/examples/jax_fem/udf.py new file mode 100644 index 0000000..42c4193 --- /dev/null +++ b/examples/jax_fem/udf.py @@ -0,0 +1,89 @@ +import typing + +import numpy as np +import pyvista as pv + + +def _build_geometry( + params: np.ndarray, + radius: float, +) -> list[pv.PolyData]: + """Build a pyvista geometry from the parameters. + + The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), + """ + n_chains = params.shape[0] + geometry = [] + + for chain in range(n_chains): + tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) + geometry.append(tube) + + return geometry + + +def _compute_sdf( + params: np.ndarray, + radius: float, + Lx: float, + Ly: float, + Nx: int, + Ny: int, +) -> pv.PolyData: + """Create a pyvista plane that has the SDF values stored as a vertex attribute. + + The SDF field is computed based on the geometry defined by the parameters. + """ + grid_coords = pv.Plane( + center=(0, 0, 0), + direction=(0, 0, 1), + i_size=Lx, + j_size=Ly, + i_resolution=Nx - 1, + j_resolution=Ny - 1, + ) + grid_coords = grid_coords.triangulate() + + geometries = _build_geometry( + params, + radius=radius, + ) + + sdf_field = None + + for geometry in geometries: + # Compute the implicit distance from the geometry to the grid coordinates. + # The implicit distance is a signed distance field, where positive values + # are outside the geometry and negative values are inside. + this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) + if sdf_field is None: + sdf_field = this_sdf + else: + sdf_field["implicit_distance"] = np.minimum( + sdf_field["implicit_distance"], this_sdf["implicit_distance"] + ) + + return sdf_field + + +def input_geometry(inputs: dict[str, typing.Any]) -> pv.Plotter: + """Display the geometry defined by the parameters. + + Shows the chains formed of bars, and the signed distance field + around them. + """ + bar_params, bar_radius = np.array(inputs["bar_params"]), inputs["bar_radius"] + Lx, Ly, Nx, Ny = inputs["Lx"], inputs["Ly"], inputs["Nx"], inputs["Ny"] + geometries = _build_geometry(bar_params, bar_radius) + # Concatenate all pipe geometries into a single PolyData object + geometry = sum(geometries, start=pv.PolyData()) + sdf = _compute_sdf(bar_params, radius=bar_radius, Lx=Lx, Ly=Ly, Nx=Nx, Ny=Ny) + isoval = sdf.contour(isosurfaces=[0.0], scalars="implicit_distance") + + plotter = pv.Plotter() + plotter.add_mesh(geometry, color="lightblue", show_edges=True, edge_color="black") + plotter.add_mesh( + sdf, scalars="implicit_distance", cmap="coolwarm", show_edges=False + ) + plotter.add_mesh(isoval, color="red", show_edges=True, line_width=2) + return plotter diff --git a/examples/vectoradd_jax/README.md b/examples/vectoradd_jax/README.md new file mode 100644 index 0000000..c7c9666 --- /dev/null +++ b/examples/vectoradd_jax/README.md @@ -0,0 +1,86 @@ +# Visualising `vectoradd_jax` with Streamlit + +This example shows how to quickly generate a Streamlit app to interact with the `vectoradd_jax` Tesseract. +Using `tesseract-streamlit`, you'll get an app with autogenerated input controls and optional Python-defined visualisations โ€” no UI code needed! ๐Ÿš€ + +--- + +## ๐Ÿ“ฅ Step 1: Download the Example Code + +We'll use the `vectoradd_jax` example from `tesseract-core` version `v0.9.0`. Clone it with: + +```shell +git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git ~/Downloads/tesseract-core +``` + +--- + +## ๐Ÿ“ฆ Step 2: Install Requirements + +Install the required packages for this example: + +```bash +pip install -r requirements.txt +``` + +--- + +## ๐Ÿ› ๏ธ Step 3: Build and Serve the Tesseract + +Use the Tesseract CLI to build and serve `vectoradd_jax`: + +```bash +tesseract build ~/Downloads/tesseract-core/examples/vectoradd_jax +tesseract serve vectoradd_jax +``` + +> [!NOTE] +> Make note of the `PORT` and `PROJECT ID` printed to stdout โ€” you'll need them shortly. + +--- + +## โšก Step 4: Generate the Streamlit App + +With `tesseract-streamlit` installed, generate a ready-to-run Streamlit app: + +```bash +tesseract-streamlit --user-code udf.py "http://localhost:" app.py +``` + +`udf.py` can be found in under `tesseract-streamlit/examples/vectoradd_jax/`. +It contains a custom function that takes the Tesseract's inputs and outputs and drops a Plotly-powered vector addition diagram straight into the web UI โ€” automatically! ๐ŸŽฏ +Check it out to see how it works. + +--- + +## โ–ถ๏ธ Step 5: Launch the App + +Run your new app with: + +```bash +streamlit run app.py +``` + +This will launch a web interface for submitting inputs, running the Tesseract, and visualising the results. + +--- + +## ๐Ÿ–ผ๏ธ Screenshots + +| ![](screenshots/header-vec-a.png) | ![](screenshots/outputs.png) | +| --------------------------------- | ---------------------------- | +| ![](screenshots/vec-b.png) | ![](screenshots/plot.png) | + +--- + +## ๐Ÿงน Step 6: Clean Up + +When you're done, you can stop the Tesseract server with: + +```bash +tesseract teardown +``` + +--- + +๐ŸŽ‰ Thatโ€™s it โ€” you've transformed a running Tesseract into a beautiful Streamlit web app with interactive plots, with minimal effort from the command line! diff --git a/examples/vectoradd_jax/requirements.txt b/examples/vectoradd_jax/requirements.txt new file mode 100644 index 0000000..32fb54b --- /dev/null +++ b/examples/vectoradd_jax/requirements.txt @@ -0,0 +1,2 @@ +plotly==6.0.1 +numpy==2.2.5 diff --git a/examples/vectoradd_jax/run.sh b/examples/vectoradd_jax/run.sh new file mode 100644 index 0000000..820a1fd --- /dev/null +++ b/examples/vectoradd_jax/run.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# the parent dir of this script: +scriptdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# a temporary dir to store the downloads for the example: +tmpdir=$(mktemp -d) + +# clone tesseract-core for its example subdirectory: +git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git "${tmpdir}/tesseract-core" + +# install requirements for the udf.py module: +pip install -r "${scriptdir}/requirements.txt" + +# build and serve the vectoradd_jax example tesseract: +example=vectoradd_jax +tesseract build "${tmpdir}/tesseract-core/examples/${example}" +tessinfo=$(tesseract serve $example) +tessid=$(echo $tessinfo | jq -r '.project_id') +tessport=$(echo $tessinfo | jq -r '.containers[0].port') + +# automatically generate the Streamlit app from the served tesseract: +tesseract-streamlit --user-code "${scriptdir}/udf.py" "http://localhost:${tessport}" "${tmpdir}/app.py" + +# launch the web-app: +streamlit run "${tmpdir}/app.py" + +# stop serving the tesseract +tesseract teardown $tessid + +# clean up the temporary directory: +rm -rf $tmpdir + +exit 0 diff --git a/examples/vectoradd_jax/screenshots/header-vec-a.png b/examples/vectoradd_jax/screenshots/header-vec-a.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae5442e9e06be2bb731a2916cc41381c500f125 GIT binary patch literal 45932 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 z%0A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 WpL#5rDFGDm2@Msva=|Uju>S$Y)Mq3B literal 0 HcmV?d00001 diff --git a/examples/vectoradd_jax/screenshots/vec-b.png b/examples/vectoradd_jax/screenshots/vec-b.png new file mode 100644 index 0000000000000000000000000000000000000000..d16b5ca695131bdba4d079d66041cc3c22d2a1dc GIT binary patch literal 32703 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 AIRF3v literal 0 HcmV?d00001 diff --git a/examples/vectoradd_jax/udf.py b/examples/vectoradd_jax/udf.py new file mode 100644 index 0000000..0a1a906 --- /dev/null +++ b/examples/vectoradd_jax/udf.py @@ -0,0 +1,65 @@ +import numpy as np +import plotly.graph_objects as go + + +def plot_vector_addition(inputs, outputs) -> go.Figure: + """Plot vector addition using the triangle method with Plotly. + + Adds the input vectors A and B, scaled by their associated factors. + This only works for 2D vectors. If higher dimensional vectors are + passed, only the first two components are shown. + """ + scalar_a, scalar_b = inputs["a"]["s"], inputs["b"]["s"] + vec_a = scalar_a * np.array(inputs["a"]["v"][:2]) + vec_b = scalar_b * np.array(inputs["b"]["v"][:2]) + result = outputs["vector_add"]["result"] + + fig = go.Figure() + + # Vector A: from origin to A + fig.add_trace( + go.Scatter( + x=[0, vec_a[0]], + y=[0, vec_a[1]], + mode="lines+markers+text", + name="Vector A", + text=["", "A"], + textposition="top center", + ) + ) + + # Vector B: from tip of A to A + B + fig.add_trace( + go.Scatter( + x=[vec_a[0], vec_a[0] + vec_b[0]], + y=[vec_a[1], vec_a[1] + vec_b[1]], + mode="lines+markers+text", + name="Vector B", + text=["", "B"], + textposition="top center", + ) + ) + + # Resultant vector: from origin to A + B + fig.add_trace( + go.Scatter( + x=[0, result[0]], + y=[0, result[1]], + mode="lines+markers+text", + name="A + B", + line={"dash": "dash", "color": "green"}, + text=["", "A + B"], + textposition="top center", + ) + ) + + fig.update_layout( + title="Vector Addition (Triangle Method)", + xaxis={"title": "X", "zeroline": True}, + yaxis={"title": "Y", "zeroline": True}, + showlegend=True, + width=600, + height=600, + ) + + return fig diff --git a/ruff.toml b/ruff.toml index 119ae02..0de08c0 100644 --- a/ruff.toml +++ b/ruff.toml @@ -43,6 +43,8 @@ ignore = [ [lint.extend-per-file-ignores] # Ignore missing docstrings and type annotations for selected directories "tests/*" = ["D101", "D102", "D103", "ANN"] +"examples/*" = ["D101", "D102", "D103", "ANN"] +"docs/examples/*" = ["D101", "D102", "D103", "ANN"] [lint.pydocstyle] convention = "google" From aa5d36b03336466ce78b40cb5fb351b4d70eda6d Mon Sep 17 00:00:00 2001 From: Jacan Chaplais Date: Mon, 7 Jul 2025 14:52:23 +0100 Subject: [PATCH 02/12] fix: update readme paths to new subdir --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6c9a8d7..4076aa5 100644 --- a/README.md +++ b/README.md @@ -94,14 +94,14 @@ This setup gives you control over what to display and how to explain it, directl See the example README for a basic example walk-through, or simply run the following script to see the end result! ```bash -bash examples/run.sh +bash examples/vectoradd_jax/run.sh ``` This will open a browser window with the Streamlit UI where users can input values and visualise the response. -| ![](examples/screenshots/header-vec-a.png) | ![](examples/screenshots/outputs.png) | +| ![](examples/vectoradd_jax/screenshots/header-vec-a.png) | ![](examples/vectoradd_jax/screenshots/outputs.png) | | --------------------------------- | ---------------------------- | -| ![](examples/screenshots/vec-b.png) | ![](examples/screenshots/plot.png) | +| ![](examples/vectoradd_jax/screenshots/vec-b.png) | ![](examples/vectoradd_jax/screenshots/plot.png) | ## โš ๏ธ Current Limitations From f49fa31541af44c194be6bc5f75003287042fa92 Mon Sep 17 00:00:00 2001 From: Jacan Chaplais Date: Mon, 7 Jul 2025 15:07:27 +0100 Subject: [PATCH 03/12] fix: untrack examples in docs --- docs/examples/jax_fem/bar_params.json | 1 - docs/examples/jax_fem/tesseract_api.py | 340 ------------------ docs/examples/jax_fem/tesseract_config.yaml | 38 -- .../jax_fem/tesseract_environment.yaml | 22 -- docs/examples/jax_fem/udf.py | 89 ----- docs/examples/vectoradd_jax/README.md | 86 ----- docs/examples/vectoradd_jax/requirements.txt | 2 - docs/examples/vectoradd_jax/run.sh | 34 -- .../screenshots/header-vec-a.png | Bin 45932 -> 0 bytes .../vectoradd_jax/screenshots/outputs.png | Bin 44595 -> 0 bytes .../vectoradd_jax/screenshots/plot.png | Bin 44922 -> 0 bytes .../vectoradd_jax/screenshots/vec-b.png | Bin 32703 -> 0 bytes docs/examples/vectoradd_jax/udf.py | 65 ---- 13 files changed, 677 deletions(-) delete mode 100644 docs/examples/jax_fem/bar_params.json delete mode 100644 docs/examples/jax_fem/tesseract_api.py delete mode 100644 docs/examples/jax_fem/tesseract_config.yaml delete mode 100644 docs/examples/jax_fem/tesseract_environment.yaml delete mode 100644 docs/examples/jax_fem/udf.py delete mode 100644 docs/examples/vectoradd_jax/README.md delete mode 100644 docs/examples/vectoradd_jax/requirements.txt delete mode 100644 docs/examples/vectoradd_jax/run.sh delete mode 100644 docs/examples/vectoradd_jax/screenshots/header-vec-a.png delete mode 100644 docs/examples/vectoradd_jax/screenshots/outputs.png delete mode 100644 docs/examples/vectoradd_jax/screenshots/plot.png delete mode 100644 docs/examples/vectoradd_jax/screenshots/vec-b.png delete mode 100644 docs/examples/vectoradd_jax/udf.py diff --git a/docs/examples/jax_fem/bar_params.json b/docs/examples/jax_fem/bar_params.json deleted file mode 100644 index 45462c6..0000000 --- a/docs/examples/jax_fem/bar_params.json +++ /dev/null @@ -1 +0,0 @@ -[[[-30.0,-5.0,0.0],[-18.0,-5.0,0.0],[-6.0,-5.0,0.0],[6.000000953674316,-5.0,0.0],[18.0,-5.0,0.0],[30.0,-5.0,0.0]],[[-30.0,-2.5,0.0],[-18.0,-2.5,0.0],[-6.0,-2.5,0.0],[6.000000953674316,-2.5,0.0],[18.0,-2.5,0.0],[30.0,-2.5,0.0]],[[-30.0,0.0,0.0],[-18.0,0.0,0.0],[-6.0,0.0,0.0],[6.000000953674316,0.0,0.0],[18.0,0.0,0.0],[30.0,0.0,0.0]],[[-30.0,2.5,0.0],[-18.0,2.5,0.0],[-6.0,2.5,0.0],[6.000000953674316,2.5,0.0],[18.0,2.5,0.0],[30.0,2.5,0.0]]] diff --git a/docs/examples/jax_fem/tesseract_api.py b/docs/examples/jax_fem/tesseract_api.py deleted file mode 100644 index 88b1c8e..0000000 --- a/docs/examples/jax_fem/tesseract_api.py +++ /dev/null @@ -1,340 +0,0 @@ -# Copyright 2025 Pasteur Labs. All Rights Reserved. -# SPDX-License-Identifier: Apache-2.0 - -# Tesseract API module for jax-fem -# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 - - -from collections.abc import Callable -from functools import lru_cache - -import jax -import jax.numpy as jnp -import numpy as np -import pyvista as pv -from jax_fem.generate_mesh import Mesh, get_meshio_cell_type, rectangle_mesh -from jax_fem.problem import Problem -from jax_fem.solver import ad_wrapper -from pydantic import BaseModel, Field -from tesseract_core.runtime import Array, Differentiable, Float32 - -# -# Schemas -# - - -class InputSchema(BaseModel): - bar_params: Differentiable[ - Array[ - (None, None, 3), - Float32, - ] - ] = Field( - description=( - "Vertex positions of the bar geometry. " - "The shape is (num_bars, num_vertices, 3), where num_bars is the number of bars " - "and num_vertices is the number of vertices per bar. The last dimension represents " - "the x, y, z coordinates of each vertex." - ) - ) - - bar_radius: float = Field( - default=1.5, - description=( - "Radius of the bars in the geometry. " - "This is a scalar value that defines the thickness of the bars." - ), - ) - - Lx: float = Field( - default=60.0, - description=( - "Length of the plane in the x direction. " - "This is a scalar value that defines the size of the plane along the x-axis." - ), - ) - Ly: float = Field( - default=30.0, - description=( - "Length of the plane in the y direction. " - "This is a scalar value that defines the size of the plane along the y-axis." - ), - ) - Nx: int = Field( - default=60, - description=( - "Number of points in the x direction. " - "This is an integer value that defines the resolution of the plane along the x-axis." - ), - ) - Ny: int = Field( - default=30, - description=( - "Number of points in the y direction. " - "This is an integer value that defines the resolution of the plane along the y-axis." - ), - ) - epsilon: float = Field( - default=1e-5, - description=( - "Epsilon value for finite difference approximation of the Jacobian. " - "This is a small scalar value used to compute the numerical gradient." - ), - ) - - -class OutputSchema(BaseModel): - compliance: Differentiable[ - Array[ - (), - Float32, - ] - ] = Field(description="Compliance of the structure, a measure of stiffness") - - -# -# Helper functions -# - - -def build_geometry( - params: np.ndarray, - radius: float, -) -> list[pv.PolyData]: - """Build a pyvista geometry from the parameters. - - The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), - """ - n_chains = params.shape[0] - geometry = [] - - for chain in range(n_chains): - tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) - geometry.append(tube) - - return geometry - - -def compute_sdf( - params: np.ndarray, - radius: float, - Lx: float, - Ly: float, - Nx: int, - Ny: int, -) -> pv.PolyData: - """Create a pyvista plane that has the SDF values stored as a vertex attribute. - - The SDF field is computed based on the geometry defined by the parameters. - """ - grid_coords = pv.Plane( - center=(0, 0, 0), - direction=(0, 0, 1), - i_size=Lx, - j_size=Ly, - i_resolution=Nx - 1, - j_resolution=Ny - 1, - ) - grid_coords = grid_coords.triangulate() - - geometries = build_geometry( - params, - radius=radius, - ) - - sdf_field = None - - for geometry in geometries: - # Compute the implicit distance from the geometry to the grid coordinates. - # The implicit distance is a signed distance field, where positive values - # are outside the geometry and negative values are inside. - this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) - if sdf_field is None: - sdf_field = this_sdf - else: - sdf_field["implicit_distance"] = np.minimum( - sdf_field["implicit_distance"], this_sdf["implicit_distance"] - ) - - return sdf_field - - -def sdf_to_rho( - sdf: jnp.ndarray, scale: float = 4.0, offset: float = 1.0 -) -> jnp.ndarray: - """Convert signed distance function to material density using sigmoid. - - Args: - sdf: Signed distance function values. - scale: Sigmoid steepness (higher = sharper transition). - offset: SDF value where density = 0.5. - - Returns: - Material density field in [0,1]. - """ - return 1 / (1 + jnp.exp(scale * sdf - offset)) - - -# Define constitutive relationship -# Adapted from JAX-FEM -# https://github.com/deepmodeling/jax-fem/blob/1bdbf060bb32951d04ed9848c238c9a470fee1b4/demos/topology_optimization/example.py -class Elasticity(Problem): - def custom_init(self): - self.fe = self.fes[0] - self.fe.flex_inds = jnp.arange(len(self.fe.cells)) - - def get_tensor_map(self): - def stress(u_grad, theta): - Emax = 70.0e3 - Emin = 1e-3 * Emax - nu = 0.3 - penal = 3.0 - E = Emin + (Emax - Emin) * theta[0] ** penal - epsilon = 0.5 * (u_grad + u_grad.T) - eps11 = epsilon[0, 0] - eps22 = epsilon[1, 1] - eps12 = epsilon[0, 1] - sig11 = E / (1 + nu) / (1 - nu) * (eps11 + nu * eps22) - sig22 = E / (1 + nu) / (1 - nu) * (nu * eps11 + eps22) - sig12 = E / (1 + nu) * eps12 - sigma = jnp.array([[sig11, sig12], [sig12, sig22]]) - return sigma - - return stress - - def get_surface_maps(self): - def surface_map(u, x): - return jnp.array([0.0, 100.0]) - - return [surface_map] - - def set_params(self, params): - # Override base class method. - full_params = jnp.ones((self.fe.num_cells, params.shape[1])) - full_params = full_params.at[self.fe.flex_inds].set(params) - thetas = jnp.repeat(full_params[:, None, :], self.fe.num_quads, axis=1) - self.full_params = full_params - self.internal_vars = [thetas] - - def compute_compliance(self, sol): - # Surface integral - boundary_inds = self.boundary_inds_list[0] - _, nanson_scale = self.fe.get_face_shape_grads(boundary_inds) - u_face = ( - sol[self.fe.cells][boundary_inds[:, 0]][:, None, :, :] - * self.fe.face_shape_vals[boundary_inds[:, 1]][:, :, :, None] - ) - u_face = jnp.sum(u_face, axis=2) - subset_quad_points = self.physical_surface_quad_points[0] - neumann_fn = self.get_surface_maps()[0] - traction = -jax.vmap(jax.vmap(neumann_fn))(u_face, subset_quad_points) - val = jnp.sum(traction * u_face * nanson_scale[:, :, None]) - return val - - -# Memoize the setup function to avoid expensive recomputation -@lru_cache(maxsize=1) -def setup( - Nx: int = 60, - Ny: int = 30, - Lx: float = 60.0, - Ly: float = 30.0, -) -> tuple[Elasticity, Callable]: - # Specify mesh-related information. We use first-order quadrilateral element. - ele_type = "QUAD4" - cell_type = get_meshio_cell_type(ele_type) - meshio_mesh = rectangle_mesh(Nx=Nx, Ny=Ny, domain_x=Lx, domain_y=Ly) - mesh = Mesh(meshio_mesh.points, meshio_mesh.cells_dict[cell_type]) - - # Define boundary conditions and values. - def fixed_location(point): - return jnp.isclose(point[0], 0.0, atol=1e-5) - - def load_location(point): - return jnp.logical_and( - jnp.isclose(point[0], Lx, atol=1e-5), - jnp.isclose(point[1], 0.0, atol=0.1 * Ly + 1e-5), - ) - - def dirichlet_val(point): - return 0.0 - - dirichlet_bc_info = [[fixed_location] * 2, [0, 1], [dirichlet_val] * 2] - - location_fns = [load_location] - - # Define forward problem - problem = Elasticity( - mesh, - vec=2, - dim=2, - ele_type=ele_type, - dirichlet_bc_info=dirichlet_bc_info, - location_fns=location_fns, - ) - - # Apply the automatic differentiation wrapper - # This is a critical step that makes the problem solver differentiable - fwd_pred = ad_wrapper( - problem, - solver_options={"umfpack_solver": {}}, - adjoint_solver_options={"umfpack_solver": {}}, - ) - return problem, fwd_pred - - -# -# Required endpoints -# - - -def apply(inputs: InputSchema) -> OutputSchema: - Nx, Ny, Lx, Ly = inputs.Nx, inputs.Ny, inputs.Lx, inputs.Ly - sdf_geom = compute_sdf( - params=inputs.bar_params, - radius=inputs.bar_radius, - Lx=Lx, - Ly=Ly, - Nx=Nx, - Ny=Ny, - )["implicit_distance"] - sdf = sdf_geom.reshape((Ny, Nx)).T - density = jnp.reshape(sdf_to_rho(sdf), (Nx * Ny, 1)) - problem, fwd_pred = setup( - Nx=Nx, - Ny=Ny, - Lx=Lx, - Ly=Ly, - ) - sol_list = fwd_pred(density) - compliance = problem.compute_compliance(sol_list[0]) - return OutputSchema(compliance=compliance) - - -# -# Optional endpoints -# - -# import numpy as np - -# def jacobian(inputs: InputSchema, jac_inputs: set[str], jac_outputs: set[str]): -# return {} - -# def jacobian_vector_product( -# inputs: InputSchema, -# jvp_inputs: set[str], -# jvp_outputs: set[str], -# tangent_vector: dict[str, np.typing.ArrayLike] -# ) -> dict[str, np.typing.ArrayLike]: -# return {} - -# def vector_jacobian_product( -# inputs: InputSchema, -# vjp_inputs: set[str], -# vjp_outputs: set[str], -# cotangent_vector: dict[str, np.typing.ArrayLike] -# ) -> dict[str, np.typing.ArrayLike]: -# return {} - -# def abstract_eval(abstract_inputs): -# return {} diff --git a/docs/examples/jax_fem/tesseract_config.yaml b/docs/examples/jax_fem/tesseract_config.yaml deleted file mode 100644 index 5969af0..0000000 --- a/docs/examples/jax_fem/tesseract_config.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Tesseract configuration file -# Generated by tesseract 0.9.0 on 2025-07-03T12:17:32.779918 - -name: "jax-fem" -version: "0.1.0" -description: | - Tesseract that computes the compliance of a structure from its gridded signed - distance function (SDF), computed from a set of shape parameters. - - Parameters are expected to define the control points and radii of piecewise - linear tubes in 3D space. - - -build_config: - # Base image to use for the container, must be Ubuntu or Debian-based - # base_image: "debian:bookworm-slim" - - # Platform to build the container for. In general, images can only be executed - # on the platform they were built for. - target_platform: "linux/x86_64" - base_image: "condaforge/miniforge3:latest" - requirements: - provider: conda - extra_packages: - - libgl1 - - # Additional packages to install in the container (via apt-get) - # extra_packages: - # - package_name - - # Data to copy into the container, relative to the project root - # package_data: - # - [path/to/source, path/to/destination] - - # Additional Dockerfile commands to run during the build process - # custom_build_steps: - # - | - # RUN echo "Hello, World!" diff --git a/docs/examples/jax_fem/tesseract_environment.yaml b/docs/examples/jax_fem/tesseract_environment.yaml deleted file mode 100644 index 9b5db26..0000000 --- a/docs/examples/jax_fem/tesseract_environment.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: jax-fem-env -channels: - - conda-forge -dependencies: - - python==3.12 - - numpy==1.26.4 - - scipy==1.15.2 - - matplotlib==3.10.3 - - meshio==5.3.5 - - petsc4py==3.23.3 - - fenics==2019.1.0 - - gmsh==4.13.1 - - python-gmsh==4.13.1 - - pip - - pyvista=0.45.2 - - pip: - - setuptools - - wheel - - fenics-basix==0.9.0 - - pyfiglet==1.0.3 - - jax[cpu]==0.5.3 - - jax-fem==0.0.9 diff --git a/docs/examples/jax_fem/udf.py b/docs/examples/jax_fem/udf.py deleted file mode 100644 index 42c4193..0000000 --- a/docs/examples/jax_fem/udf.py +++ /dev/null @@ -1,89 +0,0 @@ -import typing - -import numpy as np -import pyvista as pv - - -def _build_geometry( - params: np.ndarray, - radius: float, -) -> list[pv.PolyData]: - """Build a pyvista geometry from the parameters. - - The parameters are expected to be of shape (n_chains, n_edges_per_chain + 1, 3), - """ - n_chains = params.shape[0] - geometry = [] - - for chain in range(n_chains): - tube = pv.Spline(points=params[chain]).tube(radius=radius, capping=False) - geometry.append(tube) - - return geometry - - -def _compute_sdf( - params: np.ndarray, - radius: float, - Lx: float, - Ly: float, - Nx: int, - Ny: int, -) -> pv.PolyData: - """Create a pyvista plane that has the SDF values stored as a vertex attribute. - - The SDF field is computed based on the geometry defined by the parameters. - """ - grid_coords = pv.Plane( - center=(0, 0, 0), - direction=(0, 0, 1), - i_size=Lx, - j_size=Ly, - i_resolution=Nx - 1, - j_resolution=Ny - 1, - ) - grid_coords = grid_coords.triangulate() - - geometries = _build_geometry( - params, - radius=radius, - ) - - sdf_field = None - - for geometry in geometries: - # Compute the implicit distance from the geometry to the grid coordinates. - # The implicit distance is a signed distance field, where positive values - # are outside the geometry and negative values are inside. - this_sdf = grid_coords.compute_implicit_distance(geometry.triangulate()) - if sdf_field is None: - sdf_field = this_sdf - else: - sdf_field["implicit_distance"] = np.minimum( - sdf_field["implicit_distance"], this_sdf["implicit_distance"] - ) - - return sdf_field - - -def input_geometry(inputs: dict[str, typing.Any]) -> pv.Plotter: - """Display the geometry defined by the parameters. - - Shows the chains formed of bars, and the signed distance field - around them. - """ - bar_params, bar_radius = np.array(inputs["bar_params"]), inputs["bar_radius"] - Lx, Ly, Nx, Ny = inputs["Lx"], inputs["Ly"], inputs["Nx"], inputs["Ny"] - geometries = _build_geometry(bar_params, bar_radius) - # Concatenate all pipe geometries into a single PolyData object - geometry = sum(geometries, start=pv.PolyData()) - sdf = _compute_sdf(bar_params, radius=bar_radius, Lx=Lx, Ly=Ly, Nx=Nx, Ny=Ny) - isoval = sdf.contour(isosurfaces=[0.0], scalars="implicit_distance") - - plotter = pv.Plotter() - plotter.add_mesh(geometry, color="lightblue", show_edges=True, edge_color="black") - plotter.add_mesh( - sdf, scalars="implicit_distance", cmap="coolwarm", show_edges=False - ) - plotter.add_mesh(isoval, color="red", show_edges=True, line_width=2) - return plotter diff --git a/docs/examples/vectoradd_jax/README.md b/docs/examples/vectoradd_jax/README.md deleted file mode 100644 index c7c9666..0000000 --- a/docs/examples/vectoradd_jax/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Visualising `vectoradd_jax` with Streamlit - -This example shows how to quickly generate a Streamlit app to interact with the `vectoradd_jax` Tesseract. -Using `tesseract-streamlit`, you'll get an app with autogenerated input controls and optional Python-defined visualisations โ€” no UI code needed! ๐Ÿš€ - ---- - -## ๐Ÿ“ฅ Step 1: Download the Example Code - -We'll use the `vectoradd_jax` example from `tesseract-core` version `v0.9.0`. Clone it with: - -```shell -git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git ~/Downloads/tesseract-core -``` - ---- - -## ๐Ÿ“ฆ Step 2: Install Requirements - -Install the required packages for this example: - -```bash -pip install -r requirements.txt -``` - ---- - -## ๐Ÿ› ๏ธ Step 3: Build and Serve the Tesseract - -Use the Tesseract CLI to build and serve `vectoradd_jax`: - -```bash -tesseract build ~/Downloads/tesseract-core/examples/vectoradd_jax -tesseract serve vectoradd_jax -``` - -> [!NOTE] -> Make note of the `PORT` and `PROJECT ID` printed to stdout โ€” you'll need them shortly. - ---- - -## โšก Step 4: Generate the Streamlit App - -With `tesseract-streamlit` installed, generate a ready-to-run Streamlit app: - -```bash -tesseract-streamlit --user-code udf.py "http://localhost:" app.py -``` - -`udf.py` can be found in under `tesseract-streamlit/examples/vectoradd_jax/`. -It contains a custom function that takes the Tesseract's inputs and outputs and drops a Plotly-powered vector addition diagram straight into the web UI โ€” automatically! ๐ŸŽฏ -Check it out to see how it works. - ---- - -## โ–ถ๏ธ Step 5: Launch the App - -Run your new app with: - -```bash -streamlit run app.py -``` - -This will launch a web interface for submitting inputs, running the Tesseract, and visualising the results. - ---- - -## ๐Ÿ–ผ๏ธ Screenshots - -| ![](screenshots/header-vec-a.png) | ![](screenshots/outputs.png) | -| --------------------------------- | ---------------------------- | -| ![](screenshots/vec-b.png) | ![](screenshots/plot.png) | - ---- - -## ๐Ÿงน Step 6: Clean Up - -When you're done, you can stop the Tesseract server with: - -```bash -tesseract teardown -``` - ---- - -๐ŸŽ‰ Thatโ€™s it โ€” you've transformed a running Tesseract into a beautiful Streamlit web app with interactive plots, with minimal effort from the command line! diff --git a/docs/examples/vectoradd_jax/requirements.txt b/docs/examples/vectoradd_jax/requirements.txt deleted file mode 100644 index 32fb54b..0000000 --- a/docs/examples/vectoradd_jax/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -plotly==6.0.1 -numpy==2.2.5 diff --git a/docs/examples/vectoradd_jax/run.sh b/docs/examples/vectoradd_jax/run.sh deleted file mode 100644 index 820a1fd..0000000 --- a/docs/examples/vectoradd_jax/run.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash - -# the parent dir of this script: -scriptdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -# a temporary dir to store the downloads for the example: -tmpdir=$(mktemp -d) - -# clone tesseract-core for its example subdirectory: -git clone --depth 1 --branch v0.9.0 https://github.com/pasteurlabs/tesseract-core.git "${tmpdir}/tesseract-core" - -# install requirements for the udf.py module: -pip install -r "${scriptdir}/requirements.txt" - -# build and serve the vectoradd_jax example tesseract: -example=vectoradd_jax -tesseract build "${tmpdir}/tesseract-core/examples/${example}" -tessinfo=$(tesseract serve $example) -tessid=$(echo $tessinfo | jq -r '.project_id') -tessport=$(echo $tessinfo | jq -r '.containers[0].port') - -# automatically generate the Streamlit app from the served tesseract: -tesseract-streamlit --user-code "${scriptdir}/udf.py" "http://localhost:${tessport}" "${tmpdir}/app.py" - -# launch the web-app: -streamlit run "${tmpdir}/app.py" - -# stop serving the tesseract -tesseract teardown $tessid - -# clean up the temporary directory: -rm -rf $tmpdir - -exit 0 diff --git a/docs/examples/vectoradd_jax/screenshots/header-vec-a.png b/docs/examples/vectoradd_jax/screenshots/header-vec-a.png deleted file mode 100644 index 5ae5442e9e06be2bb731a2916cc41381c500f125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45932 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 z%0AMqgXlcSe9Cn2gf?t;B6ktG6>OMT0`WMKIn(gPyOX2Eo7_pd`Kcn$kJc+}osJB9 zhuSY>P)WTEGH$*k-)u~dh_;q8%w2r#u~zF?=-NGlpy%MOx0B5N(#BeSh&^Z$21g3wB!W@Yt0x3l z2HgtP3G$r1n9pN~-ymL5L7qdC0z35U5<@ARL3_Tgp+qb}b$IQ?XDfg8)p*_$>kOpu z+HB=RYz_0Sy9_fCa#7*q#S?g3Mdaa+-%y^oP7eQl+k>&I>0~@g;TAtk zPIE$;YjgB{lzW`EcxDs6&9}y#YqjN$H_D4OJu^^Vx}F_T>TgZ>MNn9JFhRvJ@dKe# zaiCW50jlV+)e;MZ@5U_d`Ha6paMgrbrT&c_?wVl(2-yF2DlC;QW7#-t4C(e)e#5mk zLHGnlE=H#`p88@P@_DmnS3ynDbk{G(%wvHgZH3tH73cO{ky>3R48z;>IG1-J3tA}EzXgzBD6u#+~IhfXy0%vCFtQll#^ID2)R(IRtnD_hF zaWDj?x?{NSipej{ zR2H^PASZBG$G&8>vl2O?t0O~I#*}OX!Cpf^qN3}PT>TiNR*6%&w)`fTBl~Q@9C!Az zg7|J`wOnx#iekroWC>;V)frbQUba%J%~6~h5RC|@M6ac$uDI~*g@xBX-YRhox%*ol z!(KMBnL|eF2T!Va!+hx8KJg}4aM1W}0$D5dAbrN+ukVs~cJ%J$+I@#?Kj)`nSH|c{ zNnE2vNxK>pDzZ6n;8QH>Imd#Xvfp8}vd87`*!sDmAifeq0W6Ev$jef#_LO*)D3ejW z{^a@hgmRAMb)~}=RWx=!hsg@T+LZAiQDosksD8>_5BPCR$+hBZG#tH3!n{-@2dU zvfjJV>hA=t3h^D4!M{PFi_K|bcOtM@h@hfp48WEPJN^AT3wg4ws<*u^wq;wD>vjMx z<0Cv3J5-e#JX(+%Ch#3pPX^RD{RCOS%niXo*0vm{q&4Wz^ShfjPL> zI$kjR-mV%BKcoMhT6C=f;vnDB8Pv;EaVzi>JnK&R;b?(^X)eou&4WDdfMyU;~ z-{p}p`Z>wcGII)#^Y;8bipKb?5ny1)OYLxftu<;r&{EKbff2kdzD!kS^NPW2s9H>5 zKGG1wV>kGV)NvMR5q~}3*bH*cuo=lk?zCiAShP5!b9vrU`!%Qsb9P>G5tFLWd9&b5 z)?uPzEYKkepVxmX6nTO~g2ESZi5(|AWoL=uGv5lfG22Fp+M%7p#K2kksvpRkXwI(@zfG~05$ zsWN;)3ue+-l_^raLTxM)>@U)9o-i@$AA!=w%ja_NsI}@gtM6h(RcUxs)^@d70bxZr zH2*D0wW>OE4jlkK2Ff0s-W|4PG%CIW71&SEbe1tVNgFa%z<26>;){%u9dF^8>3|}( zIK@?Nt;}UP1&FY)bnD!>y<-aseCG#AsRvV>-3oEo=Y{KSkyoil9iOtF%_?VwWPXa4 zIEZeWyZMHHGX!ALjIz*cur|q%EHM+I`*K;q+F~=wP+-<%LTV>Mk@I?SUBN!=1L7?; z=>|O2L|NYNVZx&tEjogNMqfw@YOsQ+-Bsi$?ugS(Y4(vLWUtt28Gf3x9U*;rGdsT= zxypp>iJae~CFj@h;*yqwAs>G+gTQhv;q1z?2PvNHuj#s70^-0u)3t>AyaG(!q^8r7r&HGVA08 z$A6MM^vj3Cz<+6U3QSHjI&jTyLE8DwWUQ+{G@QK|S392Yrb6@6d%AeMHM>oOYK-Uv zaV>2>N^NJ3EinG&+7t4z`A>Ze)(<{`m=Ha4Y{>|ppf0Cs42OpwB&3$*C#3US7Sg_N z+KyjWS-kOs7joNd8ye&utp8$4+{UuGI> zy~B`ZBWztA=lYk4NpP_fgnyB?B)L&DR&EB1|JBue>$;d4gB@oOMEH#;2a8*4#q<8q z_9V$(P{>`BWp9N>`e^$jXVI3as%=e3rX??h?8d%3X3zOVPy`31yMxApdVvn zE@Z`#$f>s!pqjcWk7FF7Jf|UdTd$~L)l{*w+tih>OL3(YmsRYirv(R?;j{iD56~xsIIS%?q=R@T59q4UhD;-{aG?GNnQTHFwpHEA=R{63Y4jUlw$97JE(~WoZpUd zrBSB=2?5^k>5a_2WvrR%mh_>GHwrdrpKgBlCbkT8mhY-W3DEik=S(J?o45DlMiEfy z#^Nts`KR(5!DS=cp3kIDM$`%@f#)7?Vm($YIJh+(#PJc6LsF&)kP5Ynb=krMEkoDN zur-@5z>}hLLG61#-^zXAbEpDFR@8yY6_|(3X26z3a)gy5SVzw2X{6Eo^n0zj09xx#_A~3gWxso**8^gB__ir&Km8`< z#RE8kxM(xOa(a@Fk1=@+tk|c<^Lx)KB=KB{pu47~iP-M^+IgN;y^0g7*65F}l*PBZ zUbChq=9I+w97{KbNK_{h36cSo;msgb$sqU7sj1sJTYUV!79Fw|w4&OJ-nuk{3M!{h zr);%0GKQJQd&+~yeLu#NKV5p$1f&*GVa}3h@gmMibLqPud(@2b&g9XtVRS~0?lLqz zTuzxa)$sb{t={2|qH(%-&ur4o*;AGu@?qSGbp||OwiY<3kaueJ>T4@&Vmr6@{F_`bK(JjZN6F{`K zs4*fTrlFzr>CwULwW_ps|8$C7rSPghJ@0!_;{MUPXiKrrkHrjd1%VxTkNQ{lw}? z4{ID!%Y_qBKyio6WX5gZEjygkg<_206q(0lwvQYn+Ko{KwHP|?d(e9@ zov`p$W>zU1us}s8b;=0}3=F)b#{2&-|JNp9E7JRcnjks?^lme_Xbv?8 z%qb2#R~q*LBys$iU+MF@PATQX^xDx04>~+FAW;LeMspG2tv3_4Oo$a{d+s?aA-$>V zD@gw6BUWWtKqogcQIY3`&irI){_NNOO4sN;sW5v^;riB`(l?r`__87xPLdz(&(d`bfpQMy928s=aws!c`ATs5hJ<_eovrPhen59RaFn zEb5F6-D_zBHxXAx%Xr~2-X6r*97}4)HG%HmNyo*%;L>CpYO2%>_d$M;sCj`nFaASQ zk$kg9K5g|Xd^$9jbyHS{HYeZf!D`Og>*|o8c+nkN52-xp@~v4~`_Eoo76V zM;SiNkx`P7c})hEvf*}<;(kX~v#JpO_45;79Lf3@362Kd55*9?G~Kk$f7@pM%Sfv_#>7LZaIE*h-_THzeujJc%JuOg?*OW|oYyhFaM^pZI)&M$3LE+R-dlO(yVi z#4*9pX^Z{Q*wWiAoR{|elzMCgC#G5IF_Zw*Wfy9l*stm}vGpyrqsEF2e)NO5RgPA#d4bLJeri85qF_c&S7;_ki|b^9 z$R4Eh{jvulPGE~E5s@R0tS4tQw3Zx5Dv*ex%HN->4Is2&;;t%oxq}74v%@N>2fG{@ zW!DFTz8?yz+vUwe?P(j*ak4V!)`F`%%T>&=Qy`XkogF>*YXi!ay=80TQReJo2EE;& z5+#0L**VTow^~nnvbX0_$w4`OVP9c72$>ma(LpnnCuOKSEHYidwq5B+Z*;~njnwL* zmKrXpYe`@jT-r+g;bOWUIgE{9X=g3N(h&92w95Te5KmEwA{m*zm-!SP`Rt6PJ+a=t zd6t+MrUi&_93E>I_f$DPa_C{wQuGETr|Ac$K1}avM+$RS0{nQE?vL)n=mvTYqRC_U z!rOz%nkL;ftJijmlj`R^k{oX-Pg`xWSuSL4PFct?@i=d6n$Et{Wwcm-mO8>CAvVsj z6oR)1P7%{Acq8LRaY^=us=FvKwlqp~R41?-F20>NOwpU#U5@xA+;-~9QWH#V? z3{YSf7V)0?T<)FO0!jGOt3@{Pe^h<@8=IgXEv|h|SLcLcWt;4tVuYoN_e1rFK5_v>^ z^}yG`RpibhMjWtV789Kv{DE@-bFual#wKia~@`2${tQSF&10|((p3!h&B|GPcX za@MsP{mrh%hNn~VS<{9L8ST*fnbyEYdLt4|dupdQ6Ps!}r4BL&s?O*gi|k7L-eS&j z#(Wm)nuUc-*y-Orv3`n|-SIoL*$`O~s`Zo5ul(I%Bs1qLHM(jP*!ZG1Aoj4$0pt5+ za=g3mh`$AiE+EsgGedXm6)@g|G4YCbyS)q_QVy-wf01~}8F5UCJttL6PEwb`S1EGk zvIpxdm#huxjk8v%pN13LR_c#?#MuaPAQN;Uml!V2;xH8r^fCGbwnzY5%-2P<>5pa0 zC?kivu|)^!HzYHo1no{RUcKiwKb?u|D+ghjmCF!wUPR*hff5%|7ZOHC$`Nb{u zlEM7oyA}-O$u2J3We|{BI%Z1+tDD(-tIk@T7!56|bfsx4NW1qNLe<2k-M(eXhL4d5 zOpGYqmj8U6g+;UEy|q*+-6KLpS2^XnI{;$_Bbo{=$~sxP zPj*Oo*0%ob}sI~SYaZKzR{99~+msXj;-$pEnN(MlB8TBQJ{@`2IZzB3r(hPqFg zM^ATr7ZDgXwr5J;6_jLKn;F_9A!+gn__A6pAytc;&88a2FmKwcMuU)m&TJ$2I}B)+ z8d7rLo_Yi=XlXMTxWXyLYPAt zAyWexAC}YyysIT`XM^G1f;%6`pmse%F9C5l{>EBx{yXWvL;F9T+k1))+m1W5t={8o zXo?zYhM7C4^MRJ*#np^nBb~UWus5d}b;r#4=M_=w&nNGPYO?tj3{JjA6DgD3tl`6j zb>`yv+1%54<7D;Fv7oWS7h@$(W#dTq^ex4sdLjJqq-S_=PkppeP+kUZ+gMzrRrX%uUGBuil(s$6-?xj0wCmllYsp z7xQ>XPljg93ArrKBnsN`uH*Di9mkAaUgiJZ0{BH~oV4(Cyvw_JMTnC^=lvmVu%lx? ziYbvDSnTqr6}65UKCRz*B}nw7_YyT@4s3qlEP90t|CDx5$gS>ec+%GBzvw1g*s!|Y z+p3ci`!(oohd;lRn+i|aDj`BlrEy8>a#$1L$g%yoGF*aoCxS(x*sEW{_Ji3buKFI9 znM>@%Ny?YE*54S4APmK#W5x(iYp2Ge6lT%9SEXab`=~3@Sz3=nQZndf`eA6 zDIS-*-5%wgey%lP&fPXs6~~83AcVo(aQ&@Y*WzW*M=2+W7)sd#CeF9B2{XP^rOy@u z7kXB^8GD^dX)b$a0(0`?YaDgXb?C$!z&>tE94Rj_kd2i78zTzu7KChz$!~8wL?Rut z`vEO!t=dZ8d<3#uEEs8NY z>XFTYU_lZbhaj!4jCbW)iG9Q{C0v49?eGEr#=vZxtc&okT|X&G?Y7HX##{&Fumuf$ zDD4dMm=D+GyY3n<1~{|Nry%LZcP6;5YD~pl$f0@1wT?4IHR8hA>I(mJS)-Z+fKXtB zZ{+`rFY=iC6L*r{@gIPbBNOp#xa2@tjq#04 zap=Jo%o=Qw;Uc$QJK%tpiV6$MN&!DG!k{};Zw>znXAw_fHBGwp8b!{0Kd#FPrn4gD zfCZ)m*^M$)W{?UU(|!P(GZ^4w2(Nn8gcB^VWjI=M8T9T7^p%Wkc!ZH^NPptofCTE! z>_>9Hxj+0PJ#~puC@84HpuKHjS@gTv>+Vv2sv2iGio2e7p^DnM_##>feq?f3&ET~2 zsj$p&WbQg&@M%@T2g&E!$Y&)q;|>&UCV}PP-c_fdKrPr(nI;rdd5AlYV{;s#|MP5Q ztNRK|91IEC$gv2@h_}U#J(pwOLqM;H4%Axordq#6^^3F|tr6jI{X;0#RlmG2TqCvH zu32uAF_poTs1Ir_tT$G0ubj6VK0SF zLb5P5<-;uhaCSVRt+L-df1HKa&`$FPEc^}PF1lgl8~fJKrF zsr=ZYH(n#k5KAM?*j8Fh^oCOu*GCbJYQC$Hzx9hfoCltZ&?gWoF{-Ewu&9i12n^dh zMJ$DEQPkC=bdrSb4!X7)5A}TS873GkuOAG=w>}>Yl4w%edxM+_b3f6b_}OrG3zON7 z*)H5Qw4U*;!==a0vM1)D4$PoY`TDxr)zfJU}8ASYw1i~()!$qk;>p&3SI245sOr;Af{?|eZ@R$VWs$TOEG#+ zOCL&fboh~Pyd#phr5zYcFl6sg95+^!zn#tYY7u_x*!MKVLRU7tT}@MAhzR;nI*B;o z%yxVw)Gj`f`uBU|s-DqJ&+$zdJ<}vwSqat^UL}v z0Os`0-#e<6Z2J;NZT~}EpWeZ#+GpVVzvcySjf}Pvig3@n9#Db6p|qQ}5uE@RNu(`@ znc;muejW0IZ=rpUNbS|KhBYs9$+j&)c4cJYWqHkyzODOIZSp=SJKRR&yxR@r6mT;dL=p4;C z9lx9}?sLJoHojQO!sp_y*dF|lX~O91oGq_~paiC-SsHHkwEWc!`Pub`!+F|Os?2mB=|9;uGD#GZ<9 zQq@5_K-^oEEU%B}(wl28gO}c7ss3U$*FZC_RSLLne9f?hll26q8Cng_sw_y?`(P4% z75AKR8RgP)yRRU51L~S~5B^8Vz0qOC%p;=BqwA`&yZV`Wub6Su;QMj~l@ig@!&?vv zzqcLkgH+{{YD{3CtN5nMQ`S6eR#mf~*{Rc}qwVu6SkfCC*=42dcPS?G@#rMQ;)ANWFfyzGf zlQFSX(_;&IKByK{^g@v;dCmlkQ z0vjg?j2pVPd_JY0TJ`5;%Lv?`GRQ?RyELwf7NyQtkE9*;B8muSHz=wmrLZm9CNh3`QR z#kMbqt>1ckXRnB}C@63z_67Mt(>5PI;+RwEDqZ%}f8Msd2Q4-@P^%u*-`VVxpFLjZ zH}AC%xwmS7wp_@QAo{7cgx_Rs@to^rgr~E8D{_u*DE6RH z*N4sI`?JhGY=_?{pVOn)yKPkwYTz+l8~eC4nHL{A945 zh(FyGwA$4;+h&h%>2f;@0Q-Y4(JO!Sug?{7z#TAM^S4UZ1GwFS;xtitrl_h?(7Eud z^SI`z{F}F)EpJejH(S;P3gM-xT%Ig7Ts{+|eFs7r>9bdvJcM_OB@jmS@y$;aqeIhF z@M(42t}|BoJZq4b=US2^@8IW!C=X>=e(Ut1rS`FzUoxqU=v$y!gyRr z$6U19^@vioXn`Nt#)8~c5xR9rS1s1gVk)fr*>cOA&^dl^l=1OJHBn7aTXc-T!I5(p zF&ukfb0R-8N>)AxWtkdg1 zGF?8$Z;8yWpwqD6)|SKQK`SOU*05Bk4->-M1ldpMQf|eUfRs|YI&OD)|QRO61trBV)FuymP!-S!DS?#o{UzsM8G=&C}{IqWO@)u%}sIYOl**~2E> z0yA8R>7V;V$R}e{+d+YBy6g|5bXc#~GV9BK)h^R}K!afFdfO{SXqitQXt|3NBof(! z6AF=a+&cT|0hGS52}$JU35E#v?-Zp0DD6y6LL~)F@u>>04E;kb zI;t%p>r6>Y5|MrDXE~7MQvEy4a7y@+C@WgqS%mXM;*N6>+U)BMJ!_v#8}*^ZyxZ>) zGgV*z7k|)G8B7(LmtIXHbgMXscS)nV_=IF33cHHV>#;Cfx-qK{I$I z&O7g$*6~sO)d~&-Q=IiZ4LT^_5+AAGd0IC!l>r={^vg?6~3s7NB%lmPW<5 zDmdWuOS)c8a)bh7auW@nM6^X=g@_aIV-szJ;Tko$=53DVJX#=?IH1`a20C`Of>V++ zVJc+(NkN^>hcZw~%{FWtE=Hv_{FrayYu0>JFtnIn3P4LVIC3)uu{6!8UxpzE7;Dv- zP1f*Aki5cY$3n&k{=-2m^vIB8fL|i5_cc=K!IRW^T0Q z2_-?+X?JD!M*|rdZe^0}+f$0iK&o{ybDs2hArkuKo^m$9=-mKyLhj#RmpWujzvdU4t()tWR!bzRK=MT%f9(S)-As@Ib;FX_p z&lEeJ+q`!s3oW0x%Y=lx(!CPae&N)#;xrv8ycy7xpFC@mC~J88`2DaIrg~w4K*~6I z!NgoGXx~Vong{0ak4xsF(RZ&Sv=zdP%e~~bn``9Y>$FEdV}Jd2OOw-P2hP$Ye}UzO z3_S{&Ox1H?)JG+W6R^pyY<17Sa9ozQ;kv*3VTvza#K`)j5& z%6bV&slKBBYylBQw4EWwrkhc_uc6)a3!DG-iBF={H2O*w7r3gorQ3vG+#BzO|0riK zKNHi6<&dJ3mG!9UCBcKZGVyj|nFrICJ-r`aaGO%8iC^5$f|6|;m{LxrcAUd%J^Oc5eMWR5RB zcI|x!rUSYaA(UU)HCa3Mx=i=A)BD3zW0DbEwCOD@VPYy=OoqKxrx~!B!*9-IuXro< z^$^&8MuQhe*il;ISSOxxHTPYHNBgv|G2UK-pR`BN>Ae=DPVezykDiD?We7(RjoquC zf&x=i-?Ugc-DkY}tBvIeR{5j5MXa=SKQXfFAGV?$fiI%1K42jy&6`p4jxOP{{zinQ zlBHjqSjhA%4`B)vP2|=8ZVDLSfd;LAL|gYB9O_^_Bt?quv2WDG!V@R-b~HNDp_dEG z5kc8APkwS;gD(B?_uq|JD1!vhN*bCoM@{0ex?s%|S#32x#@!hRF!KAKs0-M3{*#;L&(0avF&nkA%OS9N6E-M9Dq%61Dbw*tE?p)1D ziCVj=GOJ;IJL;5mdU;#YI*1N%3kA4U&Y|B-)K13k4j|+?Q;yZN0f_>p@=>hN?D01maOm-TJ~knOMuQ8W zCvDkip!oj5d0RA3%Kb}-9>xr)c`vREBn7Z03y|PL{jrh9<++k~{6se09b;!Z!L=C5 zZycZM5zm!>gz3}(A#6>{ua$nxxf=HP(b?u*h<#Fuks=~dp|SVnv)|7z8qd4x|IF?M zAbi-w!!-il$BZp{_j$ld>~V5BS>5dfe9P9q;{dkMtbb;AkghwF^3zB@4wOn0S6_#h zv}ZWcE#MUJgfTo^hcC)q61+-aS$;-U8_u!NZm7-K`SQ{6AzmF=PALR0Km#6<@`O`O&D6h`OQho(& zPHzqzsYM{@a7GKo)hb;jf0cQ#c+`#p-WvZ1BxUBH6Q{jQt3DR=0_FOc?h3?>`>V|c z@!d#Lf5zXLmtjICz~bp2`D=ijY~*H%ER3Fq-DmsvuOGudap-}D!SA4)?XD8jwv01IfRX9lX5C}VsUT6{-tLRnvm>!WlN$1GDLTsJ zK0ub^?+OgkTL&9VtBa{GYKfl8L(;tj5@A$Vw*C>LzYy1NA-H^|ozif`seaVQZC9T( z+rJM^w|=xib$rVC7aQ=@cF#IO5?FQe$9#X-P{BBi4Nu*Df`rm1;mK~0SXS` zS4OtSXQS(mjDT+B6fi+Ej&(dI(eX;~gURMR>C^K+mri|a&rb}NN^1jpp_#c%hx~4+ zr0?wThjI_r6T+T~*2R+ljQ>|}3i;}GTHA4NA$4gRQDj#m#GJGJ(B%E?G3C;1M7P5+ z@jt@w41lnES-=O<3XPJX)x84I3@gg814c!7+fNGx z@A5+##Dufw6`9OM-NK0EOx5bGM+HZ#M-s(~%Amtg3(*Z=yz!1F2i}o^y9dAG=G3T0 z{%~@Qz*V&PU}h;L=m9=vcq)Id>q=1p)5Ba=6ZB*=QCWFM&7X>0Fo{1kpYI?r zti42xX-4cu(*QY;tw!b!H1>glNkq9Bp%BdV6VAzklEq0qh`8v%E zqYotxJNIA;^ho3NM=NH;gD*FMPnNVR!)V~zQxQFiS#9TPLyn8Uw|1e?sRss8p{S^rx>^SAzE54OkzY?u!Z=x#l zsQJ5o79HKB?vcVqli8e$Sd*G1m9Jk-Jn{1eFc!jB>g2W-OI%%?<5ECZ668mVZ6}o+ zN8#cdYioiS6`$a^wjhN-rI>3tl=6-rqf2dV&(D1Wl6f!s{=MlK{s`bZX$)bhfT9*2Q15~_tZ86+YmD-~-J*|b`s2O^AB+ih6 zHpPnMR4~7b`J?vfU5-qEY}fMjheZd$jX{~`YY?}+e`pEBfW`v=yfk3A_}|jBmFWnr z#Z!hDZ&so;*qu9M!}HGHF3{CJjrl+)(>6<+k<=eM-}fLlgfmznd);m^4n5YN%w+E5 zzs&Dp^o@bAo=^~%8XCk=y>)OI%&J5#Hudh#&n zP2CUu87miY0pgzMx)!5c5BL1@4-eC2kZwRIazLhq*+ZRk`pv*+*9fn+7#^b2X(OvX z=Cct?t&o`mC%wQ!-uf|Kyi^uk6u7LAAtO~Sp@?ko-O(!TottJ$>tJLR#a;-SS?U8H zusITWDVa@M_Al9FFaMpXv9If{2WQ*da$KZrIviQU#v|O%7#2WnhjJN{e?;wyOpSqR zMAZkYXbHIA2)%Tx6X1E==T_j8j;fL1#y8eF2x`w|rc-q2lRPMbv`?A$L zIlxbJtQ~O^AtPkj1M?$8^S}!XYL#P!GGL@Oc258waGg(qQo6U?FRgC(apTlGkORfV zu5Ti|5XxF$=KZh!H+%qiQlQrT<4Aj&?BQEwY)?&{0FdPG+ot||>>4$mHf)EXm#ori zhNT;X(WCAV2}mX{EHx+sfN+0}q<}J=$5R~epO7!q8`iU_ruIsItNIATQB|IwuTS_} z4#4Hlw}Kv?6Th!@GbWSsAhS&3kX+<9BFnp* zqfv9PG-Z9@WswR^K`m4M3tVD+X^6wo5bvNzXhUAT!-2P4w% z5#w<;I%fPM{R)uMYg9y0BhQ_m#!HJuvTUY!_zyL@mpc&u(7luISRj-U!$7BT|164K zeB!T}AmB|SCvg7h9(?&;`_4*s_bbbxis210x%=emdui~zBLFd#xduw@I1H^JA67?q z#Mm?_@=QRaBzW8hR-bNy(J-aGV_zO^B-Ne&ZMbQlBUigQVK{k%-2@*@iZ; zrlq!eQCGZ#Q-$AcE7dHedY(I}TZ zC@_W?I}4F*SJ`GGiWay0E|L)g#~#oet^!bIrlg0vA^q`+_ROSZ<)4_D21-6SC2A6@ z{hOBK3uN4ADlHazTlt=7cW{vIbfuRBnrQpQ8mhbUXu>236a3$(N2ziw= z`^j1A7O<^+9^gz4ryx_nQ40M$)Ugd3cWC-e)p~MHVmIT@QL!S%^hM%P)K6IyT;WUnjTQ zOR#$mzZghA$3W>d&eMuyA*Ig1y^U9gBNjf~M6v)(_dD+y!Zv3KtEb8r8+D3y=MQn0 z_I7O3a<@FwI6pt?Pul&65x0R7sSs_$%>?9LpJBC4dCv+KZ?ws4Rzd*L*iP~XZSVe>Q0^$!^yM0n=i&^;BAb0 z!OWrV%cOGvru-pZfEQaKGN>9weEwWs$0`oaVLCe+uXtE5Hj0>scHt#u~ z5k{@=5dxBDlEcaEC4)Ry$!nf0enpp30u1d8ivLjqHZ-pcy@^ zFVor9Cx2it87VBxkPs}7kFTrQ+q8J{TnlX)3`qR~({%7TpJJXI8eqel#<|V6AII*)>n9qW_wJsW0O-8d; zxA&lwfVoD3Zk8CuZSIk~Lm0@xKd`$C3;vPg0^}98capD;g`O{`v7KwRi_!6#w7%-?mA;1ijZ1pkj=aB!qPk}7g3z1!{AP6=VjLH-$G<7M-5;z}u1blH}L z7qhS`FthAcx^gmK^cYz_tq4wf9{t(pBKx$PHYZ_x%>O;Kuf?8yJ?8F3<0d+6az7mU z))21n`OH*P7GLgT_r7B7FzoAS?aJWOiNk+N(_@nhmDWS2wd|gX<{$gw_l~*DdBXet z*vp8}CNZIGh8M+QKs>;uU;(n^5f0}7x|A9bDqTPO~_ zu7vJ`JjdY@S>$T@qX3Hqq@BMa`myO|P4|ux@Zb+DMP>rZ*`|}5L>Cd5l?#K3=VHvjd_B_U4wmrKp>Y>sJ};}9`Xe5 z3zM-R7T}@yxz;WB-!AaTWCW#1Xi-!_A$FP^^7RMDSfx;y$spk$G4jj=@PJ3Mv+nSn zANP`TvjUZV4f#iGvfKO}EBAe@@dgS*U?`xh(9u2T69TSGgLDM+J+~MT{ed7;dT6W- znIME8NW?zs^(0iLDD}AE4s2R8-tv%C!8JF4*KBtdw;JCo3Pc9#-p36$iI*76lH;tniC<+W z7R%1esr5h)M)!Iu>57wbyVwOB7Ktv|Z5l}DF{qtg)O$8L`kb>*O-BCB{4oA)?zD09 zYs-Mk+|d`?k^c!Ee=i(1}OVbBfQ1bz|r_Uoj)uxRzx3FHre#=qiq zZTVi}0QNic=Zp&W_;S-bNmOen+^Ee{&I?l=`%&+xg)@{6nu~r0b(y1FAORy0RU5kV z8+||?=MRsMc@{2f%^?M!{iYQ-i|dho4r^#quvlU|Ktrak%g|*Tla3~oyMii!m=uTO zbzm+mH9VswNJzl*XEULfIF7=mv%aIV@jlcYQv&hYBqXxM8FyHeQe64F73#Y!=aAab{kTbX6z&xTlR=-A!T1iBq95f$i6ceOS039tz}S= zNyc9G-7vODgt7~feakYI?~HoizrX9dzU%70e#>*td7k^Z@B19Tu|JPU(6NS(Ds$=a z)^4+A0LNw+IzIJ=kIi44$iO9|tXhq~c69r9yC^h1Q^jXqAZDKOI9l0_GX_N7W#kc? ze^E{-k86RMgI@+r*4+T*XmyHMYFHtMA6v-rz0LsWCfnh)kbqu*~&)z z$W5cwKxZ*2p5J9sP;hd#-RrO7^cRJIU+U}gS~_A>dsrJj;d>O?`Dg!{d0n%Y0BYmw z*S(tgvsqt_3%mGt%*+oml-&CK@)pH zSZ-NXaFR`pGB}YJFfzR}b9l?6Lw{^7HGpP+)oS3vq)cE~d*Wq*xG6X8Z|j2cC_h%cs5QP7> zfGUrNLQC5@Ck)-CVkWxoD;FfD*9tq7WLuZLi`H4c(D5?>4(>v933Djqe!f;M&E8|V z&2f!gOSuEksA!C?7>vBSuVpwBwq`&sw{XFN9?~Ur2S>T~=Xa$p?47Osu$%58H?9`- zdf8h#y~ld{k{IdUDAK+6#R4FLAKeoCxqa+bX|ml+phE{Q4e9tLv`RhFC^txzk6n2Tq=E`U_8oP}?5_7yARuQFso zS-P#2#dD-ZU^vkWrs-Tb(GUtBY&gSj2sij<);hvH(S-*SD6AC3nx<3 zPJo-l^y19BmVMkZby*Qel%{=zf6V{^WW?FuY{g;0m;|g20gAE$@(h*}+xr4<6SG;r z#O)4io%bj{m9GNb9mlm19*^BDen=C1Adb6|*jLvBQh`Mkj6{FA<-N4bWsDiKQLL9) z>fF~8i=kVZu=P`U%v0>X`V*d$}yC zV3qPAO>(vchX_9`dSr(;;i#6dIXdRYC zku+&Dyvv3g{5^AYjX@mfqP-P@ z+DX^K3g%Dfk4<@@EXxv+IyArDt4-xnjnyTCfi;WN&iCDkTeTlQS*GPUe4mt3oUcJj zvE*{8j@3zw^*Iz>emP6m)&0}r6&IW!ttO9qTXxVnH~Gm0)~(I_+)yi#AYal#s$((I zD(AMGCD$Da4t8twNxZ!_74?3AZ+DuxuUGkLI>Ppv`)}+0Jv(}WcGKgaCel5eI`7)Q z#|qVqI)Hyu+7Ro$P~|Rl=b#HQoQJq!KnGm+;z$h!un-S(T$=wKXZKs`SFh<>+mq*6 zoG-Jp)s#HAhCg|@C>6eh9^26%fzKI<6hj!7zrd2|uBRux%Ob(z8P7|4YX+x97lM}% z3hkNbOhITVe9T?7<54pU7zh+~J{zQvfU2llBDWhYUtz!$;H@PoYr6l{XMB7Su@DsFB{u z`a0C3ri&w~@kT9QNY|^Gun0D{$|w7M?<;K@S*eOI>>%3}r~;mkIbcAich`AQp|kyRt< z=~{oIvBJHL=v#(hZJPFOG)l@e2?pX|(tKu7k_Wsg%`&@GhIL7=U08aj{r%K3@aIYa z8nhV$ssdriI&be=<)@2X{gYD+i*;Lta5paAh+bmpTLUtuZ&%2tfV$p=Wir_x;E)yB z0qI5-P!<3a=Z(nN%4L*17MK@Bn6S;?;Ma52LHAfZv^nG5c~-QNW_!*@sD2Ox>Ca+< z=d}BbkliZDQgPRO@b+Def6oybkTreWOHC3}U^06MxMdAhJb1EdT-U1W9N+ey$W$y0 zR}(*qr7L^4FD)NgT%F1H-j%z?3j!a8F9u>k_IsQ=9=@$QjJH4l+9hnpu*>UOs zxX!L++pm9|C>=K2autzi?pLjr<^G_of@oY~V^CD0d0!$BUTi>kp4o~Y3Q}{cqJ5FT zBQ5}35HM9_u@sjK7M65#>7&I`$HNhu8cqCz(0)m4`^2AK^7f?2vRVdV_WY09CM{m^ zz*}>&+RoYm_l_jQ29-Qw71Xc(`~+xZoGdGdBAz)uaCdy3r$ROo8Kl^YzaUstRBhT< zZ2P1*OvrqJPC2Qdsn8WK-~~LxRsa=xz${ZXh*Pb@FH3Y&CJx0@E}T14y0J4j9YtVt zhx-}HN@-}~&u#eSCjvfvpXrXy$P#x1Yap|!*yN0cDFQ*W! z8NckV?!v0&(Pz};px{%U(?7kR&2c253^~NfHF#(^6JtOMb3KhgMV+({xZ`}IEb1G! z7UB^w|9SiN#i^b^`5~HIzIt0(bX(MGYi@lPr#Zv}3Pa1uCH5OM6Ei+_?e9~@*2!?z zQ5HzS;u-YVx<3e6AY%X|+W@mhJAUG$KmMM|eqQO$`4Z*3ryH8)JzfLwUq7`ymju)k zNKs(rG(H{$Z%|hOo*smOi=U^O(1_qwvA$0(SVSo*dZDWwv`U`u$)QFw>gE%dhE*5e z0q05Oliz2O^PFq+Qj?C~#&Cdl7tf5=jpM`#UWlhvO1uQVhv9rAYbf^is=ds}G?~zcO^^yO{0>HgeU=~k;h zxT0vWae*UnOBpR%W#~N`xs&*bZD;qTWZ=rHyb3$V^^b*IFwq`>?1yVA20`AiTtaIY z*`(c%MhU2Y?mihq%*GB2fyZA?bnxiASGF7(T#Bz zt;%>(W-&%c_mx=BQLKr~{N#v@Xp1QExE`Hv!%U24{i>LEon7r|)L;#&YY)Ny&=FXT zIugM-pq}iq0%P^8VV)uz->d86#|B0(dM&(ou+jAXjzCI?6D?Uj69WrWv^+@|Cpgj5 z1Ld2t(&m0Qed)V4z!`kBV~Lg_-M22V4UjFAOo(><$?8WiTY0#a-1zGz!w+NP=vMZ{ z%cri~xvX@Lmy#-h%8pmeroFmyyJY60gnZLreQ9bc?!^u)D;{Z=P*ivGFh`*#h@Ujy z@MOZ0a(4#8N$`btUVH7j3wROAf6*L6SFKHeiha1TY@3eQ8K^}zmYeU}f1|Du)qJLX z!UZir5l||so%TsSfMX@7G1o7ntZV|^9Aq*)imLKXwN5*gmO*Xkwj zESr2nIKSsr!c~D3H8I%~CpH9aGrB68JFBvv@z1I{B6PaKLQ8_I2Y1krWQeLeLjmEJ~leYLO~<=W<9JE>HaxzZ%_cGQXC-Il*TpGn(T zpj0I5nA&VHNsdXTYvRw61bm4Z_cM&U9LG+lZ^>oPFrB0I?Hd)4)R6f64j)QL0x(6964^gHJGW8um9GLSmhj0_!OScemlk{TpNvgHeSVltf)<`P^yw ziaY=tkTQJM@_1BRVqO4965vPxfC185Jll&83dzD`UGgE!>(WGDlN}r57DS=}i;`X< zwpnZ|>>HPZ%`x%pzmNiDVXYjlx-!zQi{ZE4mNoJ}P>>qIy$=~I34PR*0vd*q)g`P= zCMg);0Rl3i{8SYa9qrf@`m6MFCltQj7++j%ic=pxjEucUr7ls(_wwrb`Z`F=Nf#ms zOf>%u;ptP)em0}nO;f1g$EX}K64zWHQZTwx2&gslCalsFa~qxesqTNwOFp z(+_pqN8b-ImO-+s`x3ZfZl zrtA|_m0Vd3h+)#@cy8!PS3&S4p%3ueNl31*@V5PArIc4Fg-=@eJGEz2l!d!uG2ia4 zEwDz@IgHro0K#Qj)VG3SfaKm;dk$+UR$12yXcwJtk$;Xy$VQY~M5?En?5*i4iQzN1 zREtdYhwB_c4wCgo=|w-nt7iuS(bev3C`hM#a)W&G<*iOfU?qh;y_j0)@aYZM{5fGrKLr})un6#( zrPwv5Yk>N0i?ZKk1iTws{WT{m?on<&?JcpUOm8+Lnt48j#~>J)yWmUbECxm+iK8@G_bO{~2p9x5}44;5140ggLPO&~y8j=JInB_xyK-n-^8S}Obe4h>$ zj9Q|aFf+hkW?Q)i-i&it^NxPB_DMZL(1etY@GAT~%ql3<(j{S{PS53?{H<%CV zbph)ALq_ur@~BwQAi+KkiHt#6jD^NqopqiKp&I3$eRV0@m@Zp-`c}~>p#bkZ7R8_j zF2$re%Z5a$SC;O(Q$B)klnp!{KS;Z zz`!#sAD+a8(pBWE-*u~>#f&7Ttiaw|s7lP6)MNpfAp`C-|5rJxqSeFyrCR*vtQWdE zetrZtoh-vl3y^8WrAs?ool(3!&GKaof^$;rTGLX0%Rm{|z-m-9n%ua&x|-3egu+gF zvE!E&6D;cE+&WH;{M0cDE(8@C!e|j2MMb&teY(?}cH!JaYjbkWzF&``=H43et&y3Q zPrE?Ow?44$CqeCtvx-4crT1_NbI1jaeShPrVimxP1Qqv!b-k--N&8hmY+|a;{=&l- zYnHRDQ~!>>?R&{Bw(8M$(q-z>f{94y1UHiq1`{AS4K*KQ%eL zS38ZwQb5Jv*jR?Rnr5ygC${D2(KCJKN;$?8yd=%y&A+o~TQO8i zGZso8jTJZYe>L?a3STB>)Pj=y^zc`;TcRWc{zCW8xO5RBpZILvNWAG-kD;Qdq=0#w z$W4Ck>sdjS`iG=G<;;V*0s7Py2Vp*-+e?V0@n5QS=-tRsKN^NZ`D`!+9i~OjyFoyV zUC^l_2dFMLoY3bDY#o+2|Gm1Hmm8DLhvP6RV%MQ=V3oE+S9oZm8En@~r08_2&Vic* z$0Pc7aUhyg|Ds9es_x_a}-Q*NfQobrl{7#TxK3a6usa(Uv|L`)G3ZN(mg1>=xPeGMSf_kYBE8+q9!129Q@>#(lch#zl0iXQ z3}|r%n(;8_?Y1O*y8u|J7#qHypIlhWwo^O)Gvpt}Zz4QLxQYeix4l?nF6dAL;a=p~ zU8ER{m#<10(xU5^(#K`Q43@YXjavvL<$MJvg{K!qBK!9Q^cV8Zii%EPu6lO(I1=lv z8Mw}Q2GfFV(Wk_?>1Q3Jorc~hR8(8;ci@k??Kym$8amrq9=Uih`ctl?`a}bTzqkOA z@hxTwXQMM?y)eMETG$CSgHqjCEX(?sCqGhVc87|*L+^7+#b>tSDRKE^jktd)jq++BWI6rF#;iNpak zWY-2)PI$>kJ74N9{wn&zNA`~uSuLO!Bsb`B&?!NISKwxKNm^szVd)I*z;hf zKx5_(pd+Z5pP1Dm#6@5;?kzj<5oh6Hd!Csz8yQ5FdA?=7s-1J-z{g!&)tQj#O|t%s zk=E$W*}M0*zV^rz?{X>-TYA<}iG_Ak3-^mArkKozH+jYoYFw^|ug2?mQDtmHd#KLG2Xa+M06oy$RFir{Lk%@|j>GRqJm0{mMB|UmRTRM}b^N|7)f!Ag<-K4Mov3v2z zyC>)(ratWP@IXoKyPFu$|`5yoe2!hh%EJ$dG z=O5`;n*^d4dzafM$K8ZZbpM^Q58fAdNKdyH>*RJ9psH@u*pE_SIsZ`=X zwX8=gxWA+_>{GzLjlcWk6RD8{+SRb^Ecwjvsn(20-6g5a?Vx2M?r8q>$aS;WVSuRn z#+7|X(n9btm8m(iq1}fiQsX*zi08tp_@AWd+*tahKJ#IuW$-}Q$z+3W7LJoj2Y=D8 zdiCgoQ181@qs9kC>xHoG*4haw?ObEC`+8eC!bO)f1bp#rt~SIZ#G~b&S8(t_5w4-< zk%S~*xC{}@raq`4@5Y>%iuIlBdEt09J=tV8kz}y!M{-QF4;qA@R#y0|NQ7n*Cr@_I zwBbm{3G^CHn#07VS2$s?r<*5VO;qxzcqEn8OzUsqDf>75c#v94Ue~ksWA%nwbCA0a zuA5DCQf)~+FI$L>iVJMPiiT^5?uARM_z+H-R1xFt&|d|Ptif4keO~l14IM)20$kLZ zK^Q7`dU2U6$3}zlo|70rg~*-$NLPEMQRQ_DjPerjJkq4LNE^j4F4N!9za}aB_-)_M zO)o%u4Zvq()MxTW{{CDOPY&tPFmZKKaVy(C1I8&xhRdXu1R?Dhfd7MqlX{u5GI{Rt zXE>?!kAL8aCHsGWqw%+&yo8+Fr0>)upN{{(KIOl!ue#$R89Poqp}04n6}XbLVhR5= ze{+UU=BJOs-jdqx?#sxXi99}ZVDG073krB7ZnU9i5I2b!H*FEVn}iKY@BQG|EmyIv z$T9QF0x9Lq(&x}|#~P+}w4b@#`$IBt^BdjK;3pFo;wI~WV%1ZQgH_^<)#Y7-7aGQ8 zA7*hAW3GjhYL5q2IXDL87t48atCtFQTDJ#Rvp5bdF8Qrk^HzzPev@~a))T9`+5V!u zw8ljaNgOC&PZU0HbSU>}uD&I<;(uk(F~+F~-w%F3_xK1K{U^9jqr;#$@-!Q=;m3hI zw&FSWJ-<}fpt<~-!!oIL_a7||HZm7oNm1j+7 zOMQ`SwfWUDa|74PXCq!|9{YU}ZyV$63cl1u>d0ljlM_$R){Y=EDU&S5F44EN>7cdu zHXm*^|Mof;dA-=jp6#^78*b^Rr&H2TIm-={1Qo4vkJ9Hd1;u;OviTdtiKwH0|E8a& zP}~gFMkm*O5LGv%9Z`mboFao7*qLt*8$N_yORaf@SV4v))*<*my%a!0^FBCO?nc%( zoX*_8P;Qp*|F%y9UXQvTKm55W=X#%BhXMM>f`y86XW>x)`rEhph@q$~j!CBMo4UG} zTDcn|YaL5jme_E!H136#vlVUi@Eb=> z;d_+oyyriD+P*XAko7MArc$4Z{y7(P^j$u*HuszI_%WwYI<*IL193lGwfa3eDGc4U zi1izlk`!Ok=I9+6HxBEA`S$0uZj|`CX*!z<)8%>7vPI*5yC>Q7aSFVA@VUmfU@E*Y z|DD?eWcdgi`5o~=@^zMxN9$7Hgy?vCSQq8>gU<1diEi03w!n)%`(Wq0y+YH$g2cVeFz!#jfiWv1L;>j^ zw-PO0&-C_qZ2ubknq#p_4hkh;`*z^r_6LW@^Kb4vvgsRCY#G=^c0Q0*=(&$@ouLIo z)cc1|4gxy=&lu*>%{x{SvvTlDAQgTRN>@2!GyaPWS@&FE&`TVgBhCU4_zUOUT))v4 zy}N%{LeASAe7f`3#fivq*SGg|ZJAK#u%t^w5Fs3a2;uhOu^!@>r(AnH?M6~F88`t# zI=GCA!laGyam+>%7>feUOI2f)ZSjE0p*HTC5ilBLKLUdKz#kcl7+oY7#IrXaQBZVH WpL#5rDFGDm2@Msva=|Uju>S$Y)Mq3B diff --git a/docs/examples/vectoradd_jax/screenshots/vec-b.png b/docs/examples/vectoradd_jax/screenshots/vec-b.png deleted file mode 100644 index d16b5ca695131bdba4d079d66041cc3c22d2a1dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32703 zcmdSAWmFtdur7)ONP-0kE(s7MxI2X4p5X2jro*@N zHX#|DCe>5Sm+XC84^6OK0pB`lc)4DTT!?JQ$zxM=H%) zTTZ-eJVy3?Tls+-bWiMLx2bG-rKRX*=M4=FjhUIHqZcypfu=qaB|ah|A|3KS9{Mj~ z*0sJHM@O**1q?9QkUVg!T9bvPr5obGM+GeOt=pxpgRlO;M`76Nyx)u@TTXdrrICk= zo7+jZ@@d@mZ{gt>DepD6Aw`-lO$K!D7SHPpxlb1C5!>6_CiT>9JKv&!=dNHO5Vg*3 zZo`Ae zIUwoubHbtNIZxI84?!vuDK`XjKC1b%Fz=~?u9^suN;(~E{uO_wdK%b6q5n~@3+_q$ zWX@JvXTkjp>21FmPOYeok+NTK+E4%92QIi`uGSUQAjw5;<{XdCCh0w$QcPKCuknxM zewWbt!tYklSFjqyP7kw?*M1twD@&ii+aS^(VZo6DP3!~gN6JxYU#EuUKL%qud0L45 z|4N6|st)y5Jzg>YN8=gXmo57a?Ob>7-fPzxUEWQrUKSWO*CFxP;459)&N})+`4tzd zEcYjVt~%`Bcg9hAZ=SZjn={UuEA_5=Bxv7X$mF$qMX_>2udUJW;9<1rgzzh7lwM8K zwq35nR>k$Mnh0d`1MaM`S^Xz7)c%g@aABip9(dT<(BCviTX8Ve;eaB0+lTpZA?S=} zQ2f*xmBIeCKST;r|Ca?S%M<4tM#mW~X`;^tGhK-oK^w^sK1IYq*_3EKqjsO0U*->Rsue@2#0~{YP4=SW=5sxT#P{6n0 zl+Qo%*{w!sSXr^Z+-LIUNrrnSGi%3%VBm5Fb@FSJ*;@{*g9Loe2veB#T?8l|_M+L5 z|9t)}6mTyR)f|ptV`Gyo>Q~lruQ^lOUSb)&3oJ5zx7kKN^?aqECuS@e-w)6@M^$yT zpgUtE8Yb~1ZHcgiL~wGwj!v_qDCgt-e$yS(p~%5pX}6@Ikb2)LWmXU?y(&Bzwo3Ku z7Ji+Ol+=B7L&>5~r27N@q;OA9zH5zAh2E&wy7g}}zpwY{w6;Vn-Vhwj%TDLHF|@S2 zue3hJM_LO!r*66GTWH~Xd2oH!nv&_8_?aCZ3%|!*KQ_kn^77hczX{8w^IJPL6cUd} zOVc*G??&KvRt+2rdY`;P3PwhrDb@~uY-~23RSmp6z;JmC82zJ`$HlBww!3h;C9-y0 zNpn0nlv4WOGmrzQhfYjPjEceKzuVc{+@L#AAOeN#B{Zw0o>)8x$d^AM*WbaUGxBUEI zEjB9UeHCcjD3!$!{X?s-hjrj%fVZEv>14fPWIXiqUl1|k+V82S6;Ta{3T8lncmwByTB?-E0JXLo}g2ZSh zZ{Sfy3^{d>5cnOGwLtkG6)nz92+U$sl^jp6wEKN^4Ami!Ql-pbacG+)RP=Awt)Lf}^+2j|-R@;2?b~2r*P}LWz&bi50eEscqrTx^&yt8MmMP_s72D)- zFp;m!EFvO8@`#Wf$%OOv$5EPZ@JGw5$eV8F76Pzj|60chP*Y#SDRp8}l4SElo%U?9 z_?K+qw7$K^jKQ00@n4xa?0{OotWbwSgWA6W6YHCv=03gzp^GWIkI2v~Wvl%FA2ePe ztu}d@?v|9_x-Wqa#hsD(`T401&KZpZMALA^vIoMjIguztydxr$^0{2j`bB1T{_RHs zKTA6hc3yu&9(0#cs$b9P^RGaoTq~B(LGOI9CWw1y%Vq^y!o-*Ls2Skh;Ku=6?s+(7 zpgNp@l(!++bAmXNJRPVTY@uBSi^sD^&DH#z2`>l=DoiCuG_RqLdlMhlGzfnyNS;r<+zy@SSc@9hLC3Q^yZ1wZ_bW`);UB?hBU6Lwq`%FP3VfMv=S z-1_12JFFLSopOBIa*OFAWT=$QQ~O~7+4gmbNrBhLz!}6!e>7;A%?12>@Oz(@y@Y9nMlhb-d`F7`EKpnf^z+L}> ze;u<^J2|ywU-CZ9iVZAW>AC9L*Zzoye7zPuYujq&aI_@W0WA9&0)rr8^-OW?Ku}On z32s4F{CjSDwOBgfDyoT{>Uci9rw87`kC0STS1->TVmr)^Dq?6S<+eJV>|x?z-gJ9I zgSML3F<0vNs*T6i{H)h6d-vVXTBHR=I46C zlo%_HciR8dKUAfV%@!M1=O;0!?!c#*%5seB9Eb0Hr+0PqYV9R>#l^X}xByo&Q+^Mx zitYH~hipAlfqZ%@{Ks%vMp{)>kEcC{%5?Q<@(L;Mry4#>0t$j?hd;USx}{nN181Sd zjEd;&Yzi|ozNrd{kdJmvEG|$nGQL0KKuqsn?hm&O4Ez9NA2jceM|B1Od5ISL1KbV> z6um9RasBZH2D3&k^Uu~hIzs@j#{KNs%+^fd^h}upuxC3bfA_mCE2*HnLXXG5LimUv z_{qgZk8Q1ym-sg@D6q3LcA=3wc)DQR8MY!AxYz{#{&B9I4z_H(u9q$B6*n`J1cV-< zWkhU)|Kq#ErGQy@8sG|l(h0|s^KZ7@XX2+h5uVFX2&dkQQ3*JI$I_Nr`z!tVnr<6% zzR@j0P#C=3$mhH#NAsJ2h8Qi$vq7t<99ONqI2u= z@KZnytE;UYK17}>(z9-hgX#s&O$NCI1=T^&Ks2g^182qj8ek1nKYcz~4pfeSV2!^1f}0GZ@7xGZ%lU1yJB4A-Kb>{pP7)-wP2@@yF<1y4`UHIU#=Po!Ca z_E`{4RaI5_9qA_nQ7CJ4%Pw3qd($@h7OJ{{OZ`)GnCQXdZ?*r!{sqdio2%=YZ7XEl z2yx%Fx(c5CEKVd;r8fi0ukfvkzQF>4KHJD+Yls zn9JQ%XN%@9FBCdjud5ta(Sd0CyGZpEGtO?d2<<~Z&XK&_g2$|9!F0;Ko`rufy%1Y+!+aJ03P|^l+Sa8yhf{>HN1yKD0XW@}5g|Hj)5PK0Q18 zWi?8cttzbQ6OHyoGCc7KIAH(7*x22bv9{L7p{g>TH4eOlmG*Zz5$#dxXK!y?0JsIu z*$Eb*arrM$`^c@-ZYo!vLzuv`QsfK+1r=4m|K|CcX3@kSQ<$8_CljQ$>lH~YEg}H% zt$(~jd+)7<^b$RW+$SD+irwJH$8RgwE|0+>JTG440|-N-NQ23X?sUrdjDPdt_Wb7d z7G--j$P#>e&pNVmUk*V1Z){d70J1Dsc+DB(N+IZ4GvFC@P@q@4a$RUM{fdjtXxrQM zjQ4o(z~wC*g)d9oayT_lYc$iR-1wFXwZVX`rKP3J_P77Hvzr@lbCMnF$zOti+lq)@ zmUx1_=cBE4+Hvdj?-qT2DBA%s^^bl%4zH~SyL(ajAK$2^_Okw3Tf3P*Z~NmJ&PRVa z75c{GhM5vBYPsaJcEO@ULk%B(`f0zp-XA%;4P<-mp)z08-!FWv1q=s@*lJ z`-$Dmia#Kfp}~dr>Ikap>nnr=04_SydB;rN)+++}O8vl}ZUu276Zx;17}TOy*ta&N z$@pyte#c+XF*8R4q0gXp{Hj5~S9~cN00z|-Hl6MN%Ic}VPzn>Alx>bKR)fly>O7YD z`a)YrfK@|nZ0BgtJU0%*qLPXickkbKJso72);-_Sd&nv4EjBlzhx-dDw(F~OC9F1Z zaosFqj-Pi&X^y~;QSPpR1Y?9nO--fZjO;fGC+DO2z`BG0y8z(We=Y5qP0Y>}w80-5F8<^PDa8Ck8_$WH z552kAW4zT)uXfu6W<3DXkIy&`a#Vu%~mh<=E$cP01GfK$4O(L(7tBBk<8yR$#Pa3>k{yEE{XOOSW(uZvMx=239Ho1H z(3n8fN`YB#6jm%rS4>8=oU*9T^xd4OuCL*Ez+0Mk$F8Z3mhpMe{ULqV$0jk)2LW-X zCI9B(1YtR6XY)I;xvW_7pr%4o+3Vbh0jC1IC#Hh4bXZqL@g86jdM*gP0Y2e>$3eu= za!ae2cx`PB2-cghGW#cbY#xX`S?7D>ZvSSODB`Nyn_KmXyzTjdSi(9ZXEYA4x-G1% z){4rWM6`I?-5P~7fo*L%rCN!Jhwa6!`do)*)wfAN9tUZS%oYof`467XQO?SWzCbm{ zbbL+9)zuXUUqRY_{Gum1PgEXiGyG)KQ4bgq_VK^dd6!ws4g10U%gb2=g@ydhx=&L@ z1y7SHRFGJAsR%G6bjd){((|wnE_dl=qiW;vsSpfA$~Y}CAddgtb3h1CXTq9H&qdbd zB1~7yR?17SzfGMD^_XMl8e%@KlzT~6i%GaVk*8(Gh0jFjoMJFId=__ zO{C&@xV5hlw1yoG2|w{!s0y;{gYFfgw!D5^$PYHJ$zo==&SX&avp%6(q_Sh^`VyrYM~grrKh~i8}b{lIg{e zJm+L>gcN~691Zqgh-|Cam8w4Du%5~na@}w{||) zoH2!^SG~Ig^_BEbR{J}pts^O;>#BB=Zm0EoSJP}|=GYUx2_4y5YEEw1-uc}Cb(%S1 zlLRDD`gIZeALQYR#Y+)D_h!ETl@59DPo9!aT<9b5WeAFs?{axeU?jkaXtyFR)ZsSs zWvocbna=>8u{LY%dQ`2>URTK7+N*i^6`+N!@j3Fc(G!mDd9;N6 zL2j$>M&pvHvdu{&PvLcAx$g9`VHjWnl>J+t#NUlW&@VIigWiT91l}CiJ~2XCT6|)F z!}8JGY~FzqP`A@M`IYMN?q52qVnqiJ?{5w-8YiWu_9ek{-q3E*%oc0Y+K%cWHF+H< z02Bn0M1%13PrU#Us=EzVCn9!sej1JIj_~BVz?T62~cR1 z=u~#N6c#dYVudhJ9V>3hU>9aODcJ6fg`(U8_!D{IY*@=yqdaglQw1W@+o{O=dVU-r z&UOM?ZQNK&_3D0P=1`N8l4gte{F{ddF3Om6v?B4?E_}JUp#<`X-@ghNSTmuj@fEOK zdAnTaFkalfGsO5w|7eL1KtYE}3(_hoIGmj1HVZ!_e)0nDYvo8`G+7Hs zMPIyp`NN}_2#G?>HF@Az+n_clD@#B4SW=Q2IGtJ&r`KJ%)n9mYoKw##ELN@e_`wWfw=YMT9t&I6!1luh@^tX(WEPL2|f zUmh;!doWj3RWqs}0=c=l2ZLP8mV5k1oAVWXr(@q27HEYRn2F+|4ENb})k z&h^`C&QpiwO~*f-P}i7@hQ>zD^+D&WL*?y)9R5|9>ywk;y53GyV&=DhRhPIPPp=@Vxx{DL2^0`TIF$l5VWDUE5Z_Q?7?TXfq?Tu>@0ZUPbu+88rL8n3gl zoD^{ZXG!gzbef*MrcYs+H+glo&4^fwpBORyQ4sza+W#aQju0Ld0#brfAglW%9SXpQbU{WD&dv@ek&=i;AT>Hjg78nplEjEt%@ew2+;R z;ECa{p-pW%Dm_)}(WERj%_cr{1jroE-*3E>mdf2uNyLLFa#7O3*CID${(CO~;b2u> z0*gM?;7}=(K)^@RdOiqibszV6xDF1ryv1OeH+7LT#611B?G?b?5IcM=j6gD7Vpi(DE|qp-)K2vT|`26TJFB2A*G z!nrCuNXKe+I1h!*7(769(=?gpmy9h}ASzP%?J=EQe~t`Zm&n6=t7jWQl&af(D+zxB zCb>x$dx@h#NFjT@Zr(@BHP?ej3>H0RS4X-d6;`)n&~AlKIrHh&LaE(;W)a!1B<}w; zF0+n?6Cc`{K6?vEiz}w;3mx_J^q(WoLQb{nj$FwZ$mATYybI-Wbf6JVRT_7=mZQ

uC3%K8k%(&(Y$ucHGsYd5s2WRy3yi3f?9!T{mpX6RwBcDUMYZFXk z^}}DR-wdEC3$VQ7wH9=xpQgJ0_Rmyl`9aj2dcUvXuhi8jx!k9>c{)YmT=qj|b%*j6 z{bz$%2Y;i{LVh5UA{R-!N08HGPXIKk^0^5`^|MIHLX$_I-GP!=b|vX=^Jlcwm_3ay zWRL0Kh$KR-wri2`mdXgsQd!QU5Q!P_s`Pl`cb|hg?v-M!A>=$FCC@IOcV7*=%ZOZ4 zDaIR_-#m9djNaQL4Eg@^n0tR`t>&VB-Ms+`wY|f{J}d-V@%MrsVhYimT5VE|8Xd$T zv9{xCtOOk%ss+8+r|y)L4r9R##Qs_dj@&)JrmsAddJ|wwA>EEHv&K7Md|x%A^yjbQ zyjUmQsBi4gEq*f_!U(r>CB$u~K_YB_WFQR#f728MKhrTl{1lm)co`;Ms)u1hCv$!t zJiO;*a&XS)RvwIMu zGuEAPqXv2?BhjyUhPypYxFt2R>51oN8Xe)|i(`=l7>()C2m7-E9V1u_!fid5E90}schwd?gUCmiv8-(QZ3})Hf&5RAUhZG z^W_9gWz`g_E)v}A@0%s@KL{?|j~Z-#3_o8<8qP4Zmc`*y4oIyaZF{ylpIsL0*~Igl zuE*+|xq)VLo)64UK6-6y2bWfU>=|M{tFa9^wB~uQXNPn|5Xa?lFd8|{?d`*|``=ez zE+fP#$#fTl*`q|`6b;GS-2cwL$fAv!EN|=GizMRH{i@5;fQuWh1e(tHc-Q3E-sa^e z^6QNSr}4aIm zkb90dGbZrnaqi7(shHgfcP;8A{+bHsF~%;h+r$S&e^Ua`6D~|C0#Zoqc;;^nsAV7D zyC)*A8x6=shNsxJX|W)qW)Se7%+GJNRy3eCID>1FvOUc`1kLuin)+$->o7qJ!@o&H zwjI`@g1**|Lwa{Mq+jQ(d`4sVvLVfDjA{T9Oyd7yvA)tA!KB!oF;|TH*5%u!+4{Vt zK#mHDiXwibu&qhwkEp$!bC%pICE~bkLW+#Wy*1Yp@BCJ>uvw~MDz6SRlS`z%VCz%| zPmVf6klwo+e6`N8DUV2lF=20=NRMoEQeSRhjlpva=eq-r#ODKoph?d4cRN;lZ;n ziA#7g#G}5i+Y0RVSMT|g9QnHU)mhN{jfL=5VB+#uZ^lGhju*xl7ie>- z>%es&5=AQc!SwV~ z79(c6SPlLOYC82aM0@F7~p=~u%; z*m6YOQD_`1OuhlpvofDVnFSIBvmim@#DlU)E~I?+yd@R9XvO8?fnm|xzll$duDHrC zzK%aGWCYn?SZ-(c#$1HPV1fh#sY(Ld8Zqacx(Kw#l9&X>nj^9viPZUWx5E}ns_7h5 zkg-Z;OB+;j|L(H^e2dclOA#t9`_k^e`^Q6=@5QMZVMxSrzdb2ntk#cm0s*W1E+)z> zgYlu9H~WNbcl4Qbc5nIyNwRf&dCak`wu7v=8h{3->krdZ2mu1(N;t{FUCa2U*Ak$? zoxKp8A|A}&d7ziWn@NJrUV@mvax4w%=QB=^P3EYpUlA^4UCj}uvg(Ykoxe&fC*LdU zeE?0q*_C?Mk+QdA+Np^*|pe>=|+oI&h?hFzp0KlqPYH#0=<7FUk6 zuafpn;Azt@gLvTER#rizv9to&l}=Z|)Vo#t+qJ}+d*H6J9sgPpv}M}g=_fJl;^VP2 zg2u>W$t0=v?q9+~JjDBqDslRyr}&*XFJ?3B%gOo%Bt~6I(t9F^8I1i(r*B(X(m7%; zL8zoBXXnq3(g(YwWP=T}uL$3Jk&ab-B4#dV>xmdQbFmOwXyc0#mEnNj@$@&@q5n1} z89$T^#v&n7flIpic=agyx3PZ9o#oc87*?3abKW=LaXf283$t0Cn=f?#`;%W>05ntz}Z+T>44Jd6?9d3l`Gz0$I zx4}pAbePH394M&SFMGC{W3|Icn2@R3+yg+I#_o~tevO~AFh}Mwiv5hy=Sm6;U!yt9 z$T)07JkSH2WC}D%QDHtgbp=1Q>F0&tovzH)wdHYv+oE$xDCUGAa7(>zVdhk#e&?Ht z{__~hDT;nTSN^sa$9_`^Pef&Id#m!e^vaAg4D3tZBt|;=cLGTU8de67hG*0N6|yZO zrWYbwO>z3&K$>H}NHH8&YL|X)<@8mg{MtL@2Nmi*xqWL}01%-^lh+nvpr5(Es4|+T zu~^y5GLry0^r6?kT98+cVz8QH^qm_$>R4jQuB@h6tQ1cOm~_kFpd%DVWy`s4d)IB_ zQ|NA&Rv($opZ)zn% zN_L$X*1pTW-_tYp6;#(7SqLajKbI&utM!V9iaCu~j4tuoFOm$7MC|H_c5Fg3ICEI7 zl-;rHtXjKrjD6FzsqIwSgC5cbUTi!gMVE+g>C2{`t9a+jxpjwOj7N_Z69yoA>cP}e zPN}veC!WD>g?rBENPk+wVvKdtkqX^t()lg2jp6Q&P2{p9kV^waPidURG$(NztM9}R z=^*)*Rh8J}SpMynkGU59ThS(y^Ji5Chl>@&`t8nocVsU`fn2=)!#<|S7haC!t6=Ac z2?_jp6*H4~l^RMOVk*iWNrcft6K<~E5*E5Atf!;0I^%j!C%-Hfw7Bp{d-$!9jz8MO zJ}6yu8`nKbM`{Ow=QFM7GuD6RBIUFcrb@Hl`5Zmm=p|1EPF;C)AL&Z!8)ltE;x23nZa1_PL?_=!QKZ06tC3(IrfAxP zDTlrr1+TPmz6Z2@{$4b=zguA#FM2V}9yAPU6+GVuHg9cw>kBqLoPaEwW2|4<KUe znl~26y2A@R!fZ!%_q zXy$7d6U>WIazhuoo(izZ()?-fTnU;{#ISdc0I&8RMIuG3> z_lv{N93Y(_>VCJo-nDh)LA(Cxy;BljF{-hF@qB`d_!k1@)?*135kYNa@~*p=7ucx} z+Ff|#McyHA9lpxHXbG1r-imhIi(>v85x>3qv(nxdL~q`OqFXhHLy2-){UH&vql2B} zm7Oc$pv|ZIDHo=!T`s?I3v_q+;E_$)B!IdB3KtMO$VZaP%;}!mOkDBo;V^EkhZ3TW zj&fa)URB07b%v@pgK1iqLx~<#EL!X=0t*BLvFB~h5L?Lo-=tpKR$pw@%MZ5t*d?8! zf9EGU?_xb;);Z8Go_9or9NBH1{uBA$hVayK93}pM733=;HBnm@JS(35MioPTP;jA1 zn!`$taEBw(J_hxP^HY(2iC)haVBZs{9y6|@)v5Z#bi_#o}ype%hPWy~UmehA!w<2@$pRS+F z;QaeKI&kEtI=ed~hNoxF4c{S_Qa=HJrRw4nM;fy(Zx8wxW=w7qz3=WR9ty%(C3yepfvY? zx&-RAhX#4i>SKej4KxsoelZ@p?$LbEh$9oyPkKEo5@^65uPuDH@*k8YOvuY<9oc|^ zkK19v#OQ`5t~v}CyBQwo;--DRby4s~`)5SR`mprv`6Ft)1BK#|xAszU+>?#}J?@Bp2CCi>itY zOZlTajzP=(I~_dqx%~P$`t0(Ua1h0aFemTdM}zWT-JjoL*(v{d;qn_SDlra&M;GsTzJ$yu*hXXm6y7ju#+O zznH9r*e8)HnrTi*cHVDVS~y>wO(>-j5T~3JIddmP1Z%%$cWz{hMY3EM%0Y&ta47UX z{?Y`tHOxc%8I`sS8OU(wq$%5Jg_Q(Gn(gsgOwjVi3$&6r+k>bHPJib#IsNFH-)7J- z21e_CQ=jEZ0@>-v_X@=&yVPJ|%{yYmz}f)+!mb-a)#H<=JV%+zU)opmWNz7>J%MCwSys;Evqtm8f`Q{SQzU z840i6$pq@ojm@Q19AWK{F0g47dMK&Ai^5ua<6X$p#ecoyU5+;yR3%Rr%@vdR=4ZXo zf;LJv*W*0?#kEqKl|<| zn};>ug_~L3*j65fKd>A*IJlvo%JIKbjMfxR&iI>BRVo_guZ`z$Idl&uHW31GUoBKP zP=T5E%!4Y%zjealI6NGFr+g>TMtaTzjbUmSPk5cffk5ER2&=EOZ@I5)9{l%h(O zXhx$axRw(q;**^RgoSaNUsIlphp}z zo;qNd@CFAx^Odta_3yNvUcO4uhq*5JY{k|)DLzuw=gl))fcC!V<5;dFw*yKX*&V7# z0w-Y$I=<7BER-W5X1DsDlHv0o#pZ;pL*QbzJp(g$65zWPYU0%Jyr;m#&dloX6`n@U z%B`s2c39$B8A^V;>hn{|j_Ea1_fAtsZ#3~>!{4U=^uo%YG!|~}ffhpG#R`M6W{wji zficKipf_fuWW}`XF#B-XFcDak2bsV?1lru8x8FVI?(Cy1P@ayf1}U^a)GDoSx%wBm zNo0K9>kMr{w$R@-L*xO`9lufVS5>>osj4!cCV+<(G}nVy_Dh#NIDujSoLy8r!eTOdw9>$LaB0VZh8TyTr}|F_*4MEAo?%QkN(|$<>7GlF z1XA%gJ5=yQn@r+v?eF9M&!!tESXLvrr#&sxw`u|Ctj5`j+gU$#&b_v$vrW~B2nbr! zgIZ4>b!z-YMBz?rK2P>OC{orMeJiN=huY3rAn52t_2X3PIDdBUTp247!xJPFb|F;e zS2eS)XUx9Fwix+)+OqdRix-WQhG~};e33;kI&;&td}TKm9_}z1^OqN*{A|Lt`dcpH z%P<|T@7oCgcE@*r1dANTeQ zy!OnH%HgbHDsaS%2Ks!ow3|EKw3>*!EZpgIZ`0J|6ls32TEGBjQ%kmLKOGZFBx=1A zvmNWgt(#*FntnKK;be~dPGwl(^L5$=)NK_Kp0gh_T4AtS<^)0r{o-fM!nN28{rs@e zMit{Dm`$&pPuZPT#;(G^B^1Uw%)s5yxcMDWBc(#nI`T<{iJ(v#UaQcgjSgKKoYs3l z{E;G7LhgnUat5?srPYPD;wesx%T7#-hbN0Bv9I_;&3lmKsm%JI&{hFOMt3A#kDg185QoFyt9quY0E3sa7vo`o5U$ z+Fj|vrp~wIZMkMf6iY7W7lg`Du>?c*6A7nCyLL~&&x!b56$Gmxa`rzm^W>+HYqv7e z=Fi6O?N=wNX7Uxnlk7ilpZ<2~`0DIp`JuMYRp#Qa)NzpT{87>2CDwScGwpRIkPLgKiC^07lJB2f6lju*U$N<`tjH6~Pe$uxl6|;0!5lpG z+vwa-N}Osih+$pjJ| z?njH|LTjlu$Hq4rE3{3S_6c0Iy8YFzs)O_(e?~Nkl_g5PE*bt3`M6mQ8NT(NquZ>K zIsM*@hU#q9xxZHlGw^yeTN6s?8ndBI(z@Y^V;$bqWyRv%|aUO)#-~=BMBM@uSvjU z-)B3BC}NEDUNY^Y*E!zNqF|iJFaSxZ!UC-ni z44@Id)_7*1qv1IgjQW7+cvtWGt^4S}#n4FG+3EQH!x}p@XFLG9BHl#4fxfUA#vRzu zIbV%`duyE~>V!=lkg06{k#KJ%T@XQPSq-~qF>@l7gj%8NVA=DnHUSNp+UUeDM84NP z1mqv9nk;S71?q9<6zDOW!wSd+_)2@NgZR0%>8l^cO<8X5gLD)3elQB-Ze?<=Oi*dH z3#aJDar#$@Wo*x*CtS{Hi0RiyI;Fnm-oCsAd;ro>QPdAIij2sXJC*lfNRH}R75|Mx zI{e}-YXK^Ti-;J1WX`VG7mrSje1>HkVSAK#D0hT4YSffg1$Qnv>)HJGL@%0*1zeB| zhd-7RyAsW5hR)pRU1%~5h7VKW!u?}P54QfGu6WLA+pv$DgwWM5i#30k0}g%505Nlt z&gmV=&89S>`fP?TE(9ETeC|=_686QDUi>kpBzMF&nEyI{y_I*+e)WWP8g?9bx9tSP zZUR@#=P%1em%GNmTZ=7%J1w5xZ8HaD>Y#Ha!3qQb(w zqM}4sKQtU!>5!RqwcviDR}uBI%|D+S-x3rDR#&mRIXJLFUN%d7b}@y|e>#>G!Tk30 z-t+l+ov%6O^OEbWCaHB`?5C3n%%SzOw9~Oa&jD6PRz16)HZ(;$0C1~WV5}2$WxE*jY8{sZobXNq*p2#3xHoxvd?3#w?vR2 z=&Dl#RsTg5uJFT1cgF&P6FwV}eE#k2(CJQZcod}KCj`Be?s@o{`Rwz)dzHDYkdM#p zOX0mgEiKtCE&iT|as^ZSbbsVONv650%xp9swpa(vi)UO~#5bL+3-rJ|pl9WUPL=Me zmXgGKOF)F*-hCEhnbZiQwqvvr`w~SaC#>$@k_R62_-y^Nya=jgc^B? z4&_4WUwv*3$;(mNGNvvs==e=}-NN@RVMmzJaVcux6?;@rdMCF!@psR|A2M!^J_ufV z_p@-7bKRNiawWZ$kTjUr$-fYFT|Wgw8E;&ew>!->mTmYv#L4IKv2|>3S@o7w|H0;b zc~AF54_B``+zD|`!#=tw!TD;!hA@e$HC|unzS?OA3*vK1%SU-yF#o&!RO*Jvv!1GV z{mW~mw(HlP#_%_)A_7rH8}CZsChx~vn!`}~-#v%|&SUI^>rcfpc@vg8WBH$sle@eZ zugW@SD5-$AiksZ`$GYQ12CK(acTO2{tTw3;J;o593=kx%%kWx-PJpfkfyq2f$ND>Q z!0{-80|~l&LHVkSKd3FiH0UNZqzzp#+6eT3U4Oa&^1NFW&18FPBt;jq8#gDM?mO=s z7Ms(#R2rTBa9)9GazpT`G35G@E6&ubbu9ny)x+MYy*_S4%B56H0EDSMnqgfBY`;E>;b=ayP-q|38ZXaZ zE6fQRsLUD9xutb-S{$EhU+bw5XWjgA&XQ9wnV1k1n5geRcQO*NXB2x^U=(_b@tXaL=0ANXvRQ9biUqC(Wbpp^X# zxSZ>|#Jcl$VvwAf$N+A{K!ZH>=LtWW_>1|QOgZzdU09r9@LpoY@=@$2jBmdD1cfv# z1*+S}$VkTjLj}ttxE~aDWlN z@aTIrg@Q#ababmi%EdGF>&Low4y$-*XQ1)lA@kFD5Bh7~PIy^$;xNYp&3o zKUKIOAG5DXRC1?7Lhv~ftxm4AnQ}|-6Bn7IY*vqonw;rqXxN66CH1tNs9`}S_@lHm z$bU+T=zQR~htT@?t}e-jEtRxlzlopb3|Pe}Kj)zz&LbGD#xo@x9FBI_C%U7*ya}Rs zogz?l(57i%G*}sdH(|pw-tJ9ZTAf-=*Gees;f4~U;Hp-?^>;b)$`rb3Jr{drgy!#d zl5Da$o!yDs-jNhyIz4qsm=UZgJ4#y>5iqgI*OC2{P zg(?1u!7UpjeSxUWBj$9$Bab%09hLI$ROT5Ie&SB5{=wtbSa8(v)v32j6DOEORT#ZnPJLwK)yx@(M+mzQ@W=lX@6RyooS)%IWjo*1^F zUH%ccX3HxTOymSw-Nj#u2M>q_EKdeb=+MLK-rb6qfQ$uAP75S+o;8JH zOe4ZDGMvH0cEk<>I-B`%l;ZM{{o-71z_P4R#Z4%_p?NQD=o_y&;&44AU*Xt8&nHE`z*^N|Vt|X1q#= zFrnUIZ-2B&u)fqWNLQ;aT+C-j)Xsvg%QSi47?}ye}^$8<(+c(+Y$j$$bXCIjp&}RW*VW*CmKjXO;NnlMy77Fs7Sm*O z!yU)rA-3-$&jpyASnp(aiSVQ6g5I_BIB(2SvgDHLgXvXRMvT|M(rQjplB2gLK_A0X zrT)oV&0y_5pTLlBDcF63FnPAOsd`3 zC9oG|yScFYoyrzQ9gLM)Rb*M47T$92qO1nFZY501ZED*0vuLp5^V_++Vw%_C_wOq$ z&1hSdzg>a8+i2G}kx%)(-+lH%B;9%bv>VU8B;~guFpDK&Pg z`s;HnSF=Z@JLi6RBGxJUE!^SHC~QPrb_6>mCxqWN0Vt1>vCC1h33)a%A(j21!NGwZFrSci5eXdP ziA(|ctwas|md`-irfL_47p|8yiB9_-n4#gx;8~(hid+06uJ!4!kv} zwYQlZ6yX_4d-@=GnV?gD33E_y^rBDdJ9Tqdt)6E7VoO8)aAuo8lNVL*jR}TYomRf7 z5}LoaeS2TR*|~Ua%US9gy4M(Ca^vFgZT=KJHNSFyVDcDQ_rZ*3?lQaVzVY#$+vn_` zL2V?~%c$t+pL$1@Kv6Xufsc2VjLBTI>2@u0l9EKY6yD(=t(TxDHSg&J?yjVUmwy%% zP=R4DKXQq3em*+qW8XnV#voR}GIhWtyVc+~JSvXiV_=WHR^W?cDs}x-+iyjkcYjkh?$J>c6|Br$LZS!)5lm+oS@U%d4sz(!PuSXYq~X?lui$^sbe2o zc@xom|38B>PpkIc$CV1X%AovWdR60q&Pn~HM(30MEnPn(Vr|ier^#CjA=TD1(rvGz z9D=dxeTg%SX?JvNSbI9xYEA1sW;j2)sZM4Wb#qA5?Nb(Z27P?L^+djWb!0|v+3NN= z?Zf0Tdcj?Y-4xvjY~@ltHrloT(=)4Cy3q1c7ch$e`|mBR68f2Um`{P0ojK)}UcfJX zsSg}+c6w_1%O85YWL~Nim5$ct!bE^ev4{=^gQ+q#M;e^a{e#fq)D)$ycl#CTu_SD!oCrlk?5kdPEy|GK4Nqgxo%+wBOFcKZ^s5f{BJx-y2CO)W;( z=!M7Hi-ts&<>RT=Pa+iAO*eG>CW76z?npBMy7F1gXIII)5aXkc?P#`qDEN z(1NZd8re)&KTls@b-1{>%n}=&Uu7XI4netj?A z&dWowCN)gbng`L{m5=Uchr)4&q@?y_?^%CR3U*<5p}c!w@;UT+5W0C97nNKa2BoJP zVJz zpTNGooT^64%F;1Is0;~VN0$cK`3H~CbEl`~HT(4l*_=SLQ6g4-D4Kl_4@x$M=qWz^ zD36A55&Bc7{~2@(IB$vErZ&%}?4>tuOs#t|^=Ym$qUfFfG%4k$lVb9>pFcX*Jq;fJ zQc>)gzOR3Tc*&ZX^F$nEcV9v~d&#%!48)12uU76CO40b!Jw!uFF+rxRfnu0s>fjZW zsUtw~@OajNzT^&451HSic^L;(Ry+sUrk`F90^Yk*Zr)&e4|OOSM!)Gsd zMwT|P9h|MAtfFFYT=n*%AhCuZ9K6X>T; z#6`{7*cc80OUkgV4VkQ{5j*tpnpoAVHlV0EiSWMr^vf3zFyBUtd#XXoDykKS!7#Ac z4E!Vz1c>~Jq-N#wRuJhF2GQ3E3*+r`F6|RTZZhY^^aldk9Kss`9RKMR!yT>qZ_vaI zeUvugN=q9P)mkaZg?ZO5;>SeL54lH46);Y^Dg8MVV z`oZ4e+dlY0!Adi#q#~6mfu0Rr(2Oh(#R?;eLWegtpJ&FJ2wftdncSPANfm}?Uxr|x zS(1h;=yayBFlp2k9iF1?M78~}gy7)XrZr&9ry|^WK>!5&~!$FXF zv()`!k3>MX>T-Md=BcGJAaVkUklOe*I^>HEv1z8~lEa@z3S{vI1a)NG1HlKuOLEXz zN6eW|=H`{FlvW*CXDg}Eg~LqwtPMXB@#1ImgeK< z2lshfT3F0f&?eD_>e;RLu1Hr5jM1<57H`V8Rj#``FcP z?ZLob0@t~7rJYJ5JO^WwwK%(4~o^@-1 zhWS-${rM#4eoF0^2qd|q=eZKo5og=eafli$+a$X0`|l{H)yqhlzK>njU_ZTQ4@R2P z-oLk@qKc5r!r}wXXe2eU9q0jph}cAb0@~VMF8{I-5#0PJMA6kHmYCZ%u6`7@(>JmS z`F6@8iqRZT(L&3OD2!U25R>-Z-^Ec{`0mF`H)6eqI>PT&hHW6hNpQ`mg*ulehyUDR z#B!b(ntJLE$P{~rG-l5kmNwi@EvJcey+(>7BzZ2NO7^-#w=r4f_M;{TS{KQNgn>I| zU?kN(F-kqBfZzL4FJ%=x`!@b4)##S&94#{fa!Dzn9b(Ay$@iqHANs(B0>`qgL_y() z5@t!{k5TW7s!^^P?63>j2HLW$L@h73#h*D=lqsm{UQ1gXTu|HC!n*Fkjh}7iAOur2M zDeQt~uX5#0MFq4!${!U_Wxei>E)YEGap{+fJ};l0bj)G2Nv-$_BWQ`^d_ya~d)~)` zBRp<+>s&cfwD+2>Qv((K?1%mWLPGjGx~(09_O$X8c|oR^RkyFjbx0*N7oERjY)g#$ zhb28&qbl6nWZTwyc_yudR!hA=A@uG{sWK!-r$?zNqG8~SGD+Sl*Ut;Q%4bV4QI-#K z_Kip%)Q48HQ3qXSdrb-}VnW&%UKZR+0tHK6d>bKsbd3v-Lj85?@ z%tTZf6RmYF_;QMke9Epv#hpi@FS*%I%TWIVD-R(r~QoPL3L`}$zsPnD&; z)eJmyD2T>aEr)5P-Pyy0^$EjL%JcDQkQ4aRB2;j%NI5Yk-Q}riL@f0!mLfK#%s5?i zr})jvmK_J8NQ!z>;b%PePsjPcG`>l>UtD8O5e3wQzWS3FH@%2x4uoTjA9n6KIhLEg zE>E4s#(DOTsu@#tFajQqXIvPFxqRsAo?O_T@_Fh~D{tJMsP%;YkMg}$mqotQui?j~ zH^WBvlQrSH#3Cz!Cf1g(2k%njW+!H_e_{b{8GsexIbY%zXf1w^#-jT22Rv8pnewn* z9znh~;boP3;!z~U%{;}AsFPnSa2H5jU|FfDV_B(b4V0~2b8U)t`6XyiKc;o0jSZb` z@6&k5zPlI~R^s3$$2(jS({z{M6-8b%<#FA-mJEttb1Tk`<0mDk_MuVZcCn|b{qFr{#+D!JOocFG{b1h63Wx2Dnz`-~}BUp}|MSI}nm$T!+WXu^Y zab9|Ci1s_c2Ne+T)FHdL?GtkLK8*rf&|IdE_-F&g@SqCx=0T?o%A zie4bH(^0BWV>VfMXsEIVPfPepJS`veEDx&A&8hyvk8;vC^oF*~Nm>}4RDo5t9JVB} zQod4d0h#eYJFX>&aa-PhyeYrp$g#G1rb3&O^5@&p5jFd7tS~_HW3n9cl_jS5k&U6< zZI4uw`|5t_;x2x0a44EveJSVwR>4l)CQ-QjjvZ!@B6-AtS>bb+@_6TfjK-NtG*od_ z`$Ga289+pUkj&ZDS`e<72QGHM$aB%A@zvEoM(ZB#kdtyFp3&k|ny$jt(V8o((|Q(q zAl$?fe9k~WjBlS{Qeo%t>JpE`zC#Mr%Ac4kLEnAkI#lX5AM%*4yd z%AO&RViPJWC z`6nK_bV>8QESKUjHT%*8wuOyiH@iajAsCJyxtEJisypv``KnH^y z5bU>IMf35!B!it4d-9l~1Ul2_Fsb5jxYJ+>a-w@&3)L{+#7t~#xt+x4tV0lXW~ymP z3GaJj2D9p{=c#FwdAVcigOK#-9hM1s3x~c6f4Il3bGm!!cXwcQYeI~|*k85}&e_AL zWz~;E`NPXyW=@P&LC(!oTj5#_roLSo>gZtM4r80Cvo~JIUX4Xaj`cebjGp8Ox;XsO zC9XUygnm}`?sR-zug)%0+vPhAt>dG=$kEoRUMj+6_n_k+=wjjFTPj8g_)njYSQ@~)b>1ARX1K_=JpSfXDosc3`t#=ISqZ!4m0azN-AX7mXdh&z`)%r4IJjqph@*P zusgB>wN_(Je9l*M(YzzdxYN?SV;K_}!cQH&1EZ^`EXw!`8Md$gxLiJ3qsFCvDlpEa zxfA^&48M&lGFVW~X!8^tQ^(+6Oc}W{tDvM&4!9?q8~t=3YDcx=z^C#$|aU9p*FmPlmz-WQi>ax#9Xj6)gGG0E&3{K%hP+{iXvZN|8^YSnXjto@i} z%|QLt4p#E=cz7X%m^D7z82pX~z3s=rpgfz0EF({2?6>04GG2Y*d}S(>n_|X4sqQ zeASn-2JSM6*xAE}>CSTJU;+lUxK=tr<7|8QL6<~rm8A2iRe2|ylqFlc3gC*8i3L7( zs-R5S&?3e#L&?O30DViXDIv}H7?-h(X3vhY+`B~94)^g}EWH;;jjbm~98Pnt9P-Ot z#W8MI8+K@_bY=hcN*qYT^j)TwQd`%ubVWIiwx z<#STbG*F@OXviog_jn^kMT+=YyfuBGs)s>mh8(S;9Fx%s-CLqxcZX9;Eb5{#a_S9F|@uf+w&21oDhHX z@H;nmRDZ&lSwk%bb&(g@WR<8Q-`e({-{Owi%-MM{D%zblk20%~d7GB5G5{QfPlKf4 z3omjxD&qDWlkcnKLxG!Ss-^~s1f#r*e@!R72=?j-vtr1!QO9hQ0x4E)v_Q>es1MPEJ67z4>P8=;~>>llWq&LJ;HS zJHD?`M?^ubDIdZf7D5Gr>jzd)aa}WgI3I}|Ah>CdU}?6mP#3?iHDFUGb25=2%CCG$%a)M8dzab{|C1w>GN9rYon)*qOcyprW3I zx|A7jFudy0_#NG3rMO5Tl598^Br$sYaBYOY6gd#z4@`#sN=dcM_f>6%!;5XZ ze%#%U2He(OKa*Yl&?6@!y&f=G=x5fPe;4#hoKd-N;_k}mX5A7+1 z|F$LaSP65I(+oY8_~;M~CuEIi>}OwTWaCE3bwFuY5Zh^wa*W=g_-HQr*8(VuQ&fu; zl7|=ig?Ftl8$V_q;P1IFkdU0O^Yb|$HoRFUyt29_R%QNRa#LAa*6EIwo^7NQb@Bx3 zJhFS!?u=WIE}C=#!*Z6SW<9;3+`lNW^sSpFGJl#B4Lz5CHlaqSDi+u?eQlEc+qm3(FcmBr<9wY>YJD2_|bWPi4vaZn$cJ9mU zb@e1S9mlAsxclg$h;`rf&PG>P%Q1l;SYsqb8UZjH0(siNZyfO@Et_2PSwiNStUPj{ zSnW_5a@QhO!*9*BNi)yg;&`>5I5l&M>Oy~a!V8FV ztS+hHFa8bTFSg$v>Epi%6#KtQlL7~kZRY5`5 zcVWdWiUe5Pr>&l-GZXap_y2734Q@o@stqauVsu5{C|k2APjUNddft1o79op?b)D-5 z4^(}$ssUM8W)xMCg$2_SVEqNibq@_4YkCjb_=%V4Q3uq^@fM%Sl|F@?~s z)tP_LddB+Yt`yCaT4f~S%@lLA2+&$67r?Uh98PpdXIk#6sHz%S3w3Fxm;&zQb>WU& z0f862@$CoO)vXV8qRW8qzNcd$XHy>Dp~kB#Ha{;ReJs9$oq}YSPWtuXMf0K)h%EY11KQo&Q+PiV4?Uca%0p}`wiu*SXBAU(N zKsBUMXfI%om>{7eSdT{Okhqhh19^164O&zfy2dr-l=~AJ`#YV0)n&9MmJ=hSAwj{* z|9WLkY@hMiaJjDh%Idqw>L%59=l#Ku_Nf<&$h5#>OF_rdk zMe7c>Iy4TKF;yyxKdTXzf%y{<7P=7DC9r!0qpUm#~7hNh(hUw8vF>H)5yjawXp##tI^CvcUW#!zR55pV)oc_Cc zZhFN|(ZfxSU=$mIkFI_K3N08qL*{>(Z`U(5{58kwwbXcBETluA15Ldv+<#|Ay&0{C zDx2Y~MD{*QZcRoQ58~g;to;AYN4?}>K-Hm4Y2h3$0nU($+GVzu)oWcF44o;|e^g%d zycy0y+J)?bq-OmS(@MNwO{ zwuJvetpTyKLt(=qzWkvU6tcrY9mJkaG^&LC?|0$08qnueH_N);`{rkozM!{;86<0lvH-Sax2OwiY_U+od~&sF*f> z$yy5>tu6I`ViUr?el7pI*j?S;GW|7l-^Wj(sQZ2Z%R4~Lh3 zYi*@8HZ~?~x~IkB13<=f>@@3&Fd#r&v_wDS)hmEl{K~Jkb=@~FKcA?vLr7V9J!i2R zu8e#$GpWiUWO(@adPf3p2C_GRyh%Vl0W(rkk&hpLY{Hw|>sGGL{1gdkjFS@?$ZGpr09Aa=#6-;nhGp_XdbB4er4G`-q{&b zF7MQy9KH>a>Hbu{41-CysuOW0M-&z9hs`b-n>UI|NGJeD`$K2wkz@?Y(?DNFpRPLc z^4MobrS1^_nViHSCwEe~ZCv;5F+ppyAOfNnwRd&k+XnpC5C}@4fqo^DHXuj0W%IFY z)N3T9ME6>_Oppe^uYX9z(*4svKt1E);&gWxfGl{u_(j>-czSwEXp0XqC=>uM`XD^= zJ6gJb$5HnW`BHD%zw2vSNv0b7*aWu(Cohn-^sZ~Zsv#>t84wb(WcRBCQ;H9r))C!^^+%TNONoh@VE{z3?kO-y9ihmY<+ zK!Y0&OMhyw*lz%9Mi^{X*d|^7Cb|(PZf(kdKT!HPsm-4nY7CbDbW&vW6=cO4?&->? zXEog~f0}!8HE0*WbPInD>2qou;`C`u(nDTyUBlyo%!B;usMZKZ=56>2cpOLS=1MAv zU1|64pjuP(-TIb!Fp%_chlmcFNM7;z-ghJ7v{ZZU7Qi5nPBU+us|nZehRZR&Tig;9 zd#3z@-ynKM=c6OIUa|<*))-pwfKv81CAhB4oU1+jgATYja><2j+;P&n#vO6+v$Tlx zFmz1fs^)8R6FFj$Dr1CJ@*C9gR`rg^cT6mEE`~?F$vbmJHiM~4VADJsc_2e#^yxB{ zFUr1{+d6@ewi}`?EfH|c1zJWPh&jyZf&AQfhM(5Ei53Ul6sRX+Ac6JObL53qhjm9J= z_T-a_;}B!}4gwLPGd0%ciT8ZKE3zNzf0LzMs8wgF4IlpPiduQw+1l3K>Exum{J7`G(iz@33MYFG~Z00$vcA0X!zbm1fwJTP$^6x3L-3?t1?;KI-P0c3j6V+Z9H-U5F*4mH}1w53Y@k4FH^?5?$kkqQmR5*%)64GMl0LPAZO>ms^vtz8(R< z?vA?dkmfyxVcTQ%xLsXco_BqDG_?0^_iM0rU4y))OoT71t2j+wO*`{EX{nI0o#_^S z=-rBtJ<#FBA^>=wYIBX?1)le$UCO^=T!EH`+J6KIb7%Ycddv2?|%m$&Rr2J z)q#EM>n5?41_GrE;~2>~8HI3q1Gdi*k_G_F-b3R~$_YXTOp0b9#PH)>=08UYGQT(w zu#nY@mp@0Tt+yRYZYJ*smB3^2fB)hLsv?_V_S(XIF45F}g7mln=ISx$hFel^h^L{h zAni{GCD^W3cHy_<)Zu%$frD?Kg+)@0r1iAFlMqpZ8ya-WB))mCQ=K#n!tY_vYjUk= zcP4C%2Gja3uQ7DK0p0S=H%tb@xy<2k96kNkQG^iq4Hexw$$vyPO8$=>IsbVlFf5i< z<>_bOx@LF|q^SckB-RGKfvQ=9oTnGm>N@C+;3iBOn}Kp7snbM9j{9 z|BuI1ty$t#FjF`tuC8xBp*^#TdZ$hI_ras1FSD9We9gNLT0n6mz{D#G!q>BicPO4lD%IoG|!}&+F5d;=nfVr+;uKpGs=FVROk9;iT;+UAIGw+8l z+&{0?y*{g|tQZzAwXNYC-~qm(zk8p0;kx=pfP+A#w8t^DP058TVH3VkYojs~NH;Hq z9^m|At8A3H{_$!3kMo%SEQiu#B#JDadpbFT!>=$Y-Q!nEhX+C-c0uQ!n)U+&lrdH2 zz=$Uh=y^qPc=;pEnNxE!4?QqO%-I#GRn!$9c31>p32QK!BLT zSeb2N&wfqas+JvvL-Xdq#6yx{X{o{bHLNVN1H=HDw<{~Y+?#SHXW1HYXQ{mbmU0Wa zfVhUbJYceG&6l|xj>N46qey99p-R_lkAue6;&hf-3oW4rTs?%jjSZY%4V z7h-;m$qUf3WJB&Vo1g7mJlb2c*+0qd#{iz`{)by zl~tikQSkXw6kNl%-TCxygOWS*k27(y=)}RUz9FUM-$-Pb$?Br?Kal7)6zvaKxtQp6 zi)fi6O*%K~IH!3F)(-tX<*W4A0Y93WK0wW;$tTKf#ho5%*KSVeGNhOEorDqy7|Hd-)UmMpma;z=1DuOqr*|x5Y-x!`;|a-jWe4Rgy~=Tj6ra zXdvBpw{Z0W1o|^fPwC@2w?+-7$cOP(s-#+DS?L^I_VzwBlqi9H3y8gfxn;K9b%^)CdJ~^91yT5#iQWfVWBw z%uhMx0wbH8UP2qL*OepYD%zeGP?JvHCy*!RqUTDEw(@XBV`groX2$2M&*@$i1c8_` z7UNSOC2U%K<`?}#DeqNX_ixkxwAWsI=vkU5U#hItU8aq9w4!xyFqW=>G*-0_S?qq0 zQ&O{6EK&<~ma2%~4wF`+k7wYz5&?m}1fgm#mwQl7wReCmKi}mqKJ3pA{upbK^3dha z=1NOEB72lE?n}8YQ(MO2z&zpj*?~VpycP!o$U4s>2|{%SSxc zX2SRhsLeV&eBbtFHxjRnrFdlv(`@NuExV&AeR?Xt>xx73QNKBcK%G)Y25v>`z4TVA zK!JQM`521eVd9&#KOUu&Q`b$|cliSDK8=x0*YOYALl*mC9qtEHdlLyyL7*q5Vut(= zsd9(YLp60WbCXl{dT5S0V2-Hn|1pL1S z7}B6G$IpP|=07q%Y;?CC)G{E*=d2cLZw~r^Kt;$oic<0YFA>69}#&Fg$=F+D`(Tgo}&&33EvsY?Pi-Or@%pZ~s(3QDz+N z!UchFH}c3eCQ0Hy(AFO^qVvVX4b6X>nXF)Tv$A^v(nnrWYiH?A8Y-;jV7_h{OCrT+ zjmX{2i65GevMyEenA6l?k&W#Ff!-H0ORuPEb!FzItg$y$u;u+kfU;LMJJq(JgFyOp z{jWiwHrJ;V!2f&*K>OcP_@V$q9$s@$xWwP47kVr+Br-h@{C;Te0s_6z&-f_0VV|>k z?1aS^x%L`or|7Z@_%(i*DDMWh+~C?Cg{$JvIGkhG<~$@2s8F4XLX9!Lz|C_3QJyzd zq1|a>sWoF!2@&)~CBN0j|9MHFBd^ja8PiGDMrf#X1+%nPt(7WsP1@2KAZl9FK;f@l zla_l4gTNhJ+{6Sfz0|`!fMq4I%0@?7M@MIOZ%+wr@I5eOsNx6kc_On4f%Gkf6>O$r z(%>D(+&5gPAW#`uoX-EzZ~v!lRpU4sd4>l9J)O7<%2GkZiU7)d|8dZkTl2rW@#4OA zB_BWH{OXa*Y^~e7dZs2fM#{L7C;meYeyalTvYcl?%|&_RLwZy`FCbw^5aPSi+|NC$ z%F6N={{i&<&TkGf*&M~%vlDGcxRjqUe&G1O?TP<72;0U%5Y_xBk9qZuS6CMQ}Vtnc@~07-BB AIRF3v diff --git a/docs/examples/vectoradd_jax/udf.py b/docs/examples/vectoradd_jax/udf.py deleted file mode 100644 index 0a1a906..0000000 --- a/docs/examples/vectoradd_jax/udf.py +++ /dev/null @@ -1,65 +0,0 @@ -import numpy as np -import plotly.graph_objects as go - - -def plot_vector_addition(inputs, outputs) -> go.Figure: - """Plot vector addition using the triangle method with Plotly. - - Adds the input vectors A and B, scaled by their associated factors. - This only works for 2D vectors. If higher dimensional vectors are - passed, only the first two components are shown. - """ - scalar_a, scalar_b = inputs["a"]["s"], inputs["b"]["s"] - vec_a = scalar_a * np.array(inputs["a"]["v"][:2]) - vec_b = scalar_b * np.array(inputs["b"]["v"][:2]) - result = outputs["vector_add"]["result"] - - fig = go.Figure() - - # Vector A: from origin to A - fig.add_trace( - go.Scatter( - x=[0, vec_a[0]], - y=[0, vec_a[1]], - mode="lines+markers+text", - name="Vector A", - text=["", "A"], - textposition="top center", - ) - ) - - # Vector B: from tip of A to A + B - fig.add_trace( - go.Scatter( - x=[vec_a[0], vec_a[0] + vec_b[0]], - y=[vec_a[1], vec_a[1] + vec_b[1]], - mode="lines+markers+text", - name="Vector B", - text=["", "B"], - textposition="top center", - ) - ) - - # Resultant vector: from origin to A + B - fig.add_trace( - go.Scatter( - x=[0, result[0]], - y=[0, result[1]], - mode="lines+markers+text", - name="A + B", - line={"dash": "dash", "color": "green"}, - text=["", "A + B"], - textposition="top center", - ) - ) - - fig.update_layout( - title="Vector Addition (Triangle Method)", - xaxis={"title": "X", "zeroline": True}, - yaxis={"title": "Y", "zeroline": True}, - showlegend=True, - width=600, - height=600, - ) - - return fig From 4112ec96cab271ac239d3ff995d6588b68a6d66b Mon Sep 17 00:00:00 2001 From: Jacan Chaplais <31956735+jacanchaplais@users.noreply.github.com> Date: Tue, 8 Jul 2025 13:43:17 +0100 Subject: [PATCH 04/12] doc: remove self-compliment from readme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Dion Hรคfner --- examples/jax_fem/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jax_fem/README.md b/examples/jax_fem/README.md index bc86b16..8abb608 100644 --- a/examples/jax_fem/README.md +++ b/examples/jax_fem/README.md @@ -1,7 +1,7 @@ # Using JAX with finite element methods (JAX-FEM) In this example, you'll generate a Streamlit app from a Tesseract which models a structure and computes its compliance with finite element methods. -This is based on the excellent example for [shape optimisation in Tesseract JAX](https://docs.pasteurlabs.ai/projects/tesseract-jax/latest/examples/fem-shapeopt/demo.html) using JAX-FEM. +This is based on the example for [shape optimisation in Tesseract-JAX](https://docs.pasteurlabs.ai/projects/tesseract-jax/latest/examples/fem-shapeopt/demo.html) using JAX-FEM. This, of course, uses `tesseract-streamlit` to automatically generate an interactive web app, this time with an interactive PyVista plot of the structure! โšก --- From 06d7849acbc875e5ca8bbebaf0ea0d1ddaf05078 Mon Sep 17 00:00:00 2001 From: Jacan Chaplais Date: Tue, 8 Jul 2025 15:41:14 +0100 Subject: [PATCH 05/12] fix: use local GitHub repo for jax-fem example --- examples/jax_fem/run.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/jax_fem/run.sh b/examples/jax_fem/run.sh index dfb1523..6b77bad 100644 --- a/examples/jax_fem/run.sh +++ b/examples/jax_fem/run.sh @@ -2,13 +2,16 @@ # the parent dir of this script: scriptdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +workdir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" # a temporary dir to store the downloads for the example: tmpdir=$(mktemp -d) -workdir="${tmpdir}/tesseract-streamlit" -# clone tesseract-core for its example subdirectory: -git clone --depth 1 --branch jacan/examples git@github.com:pasteurlabs/tesseract-streamlit.git $workdir +if [ "$(basename $workdir)" != "tesseract-streamlit" ]; then + echo "Path mismatch: please contact the developers." + echo $workdir + exit 1 +fi # install requirements for the udf.py module: pip install -r "${scriptdir}/requirements.txt" From 74ec90113ff4eaf731491eefe84280eb1362dfc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dion=20H=C3=A4fner?= Date: Wed, 9 Jul 2025 11:04:16 +0200 Subject: [PATCH 06/12] use native platform --- examples/jax_fem/tesseract_config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jax_fem/tesseract_config.yaml b/examples/jax_fem/tesseract_config.yaml index 2aa8424..75248c7 100644 --- a/examples/jax_fem/tesseract_config.yaml +++ b/examples/jax_fem/tesseract_config.yaml @@ -17,7 +17,7 @@ build_config: # Platform to build the container for. In general, images can only be executed # on the platform they were built for. - target_platform: "linux/x86_64" + target_platform: "native" base_image: "condaforge/miniforge3:latest" requirements: provider: conda From 5785a09570832cdf293e1322e1afa8c80ba1ff91 Mon Sep 17 00:00:00 2001 From: Nolan Black Date: Mon, 14 Jul 2025 16:00:07 -0400 Subject: [PATCH 07/12] updated readme instructions --- examples/jax_fem/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/jax_fem/README.md b/examples/jax_fem/README.md index 8abb608..62f44b7 100644 --- a/examples/jax_fem/README.md +++ b/examples/jax_fem/README.md @@ -29,10 +29,10 @@ pip install -r requirements.txt ## ๐Ÿ› ๏ธ Step 3: Build and Serve the Tesseract -Use the Tesseract CLI to build and serve `jax-fem`: +Use the Tesseract CLI to build and serve `jax_fem`: ```bash -tesseract build ~/Downloads/tesseract-core/examples/jax_fem +tesseract build ~/Documents/tesseract-streamlit/examples/jax_fem tesseract serve jax-fem ``` @@ -49,7 +49,7 @@ With `tesseract-streamlit` installed, generate a ready-to-run Streamlit app: tesseract-streamlit --user-code udf.py "http://localhost:" app.py ``` -`udf.py` can be found in under `tesseract-streamlit/examples/jax-fem/`. +`udf.py` can be found in under `tesseract-streamlit/examples/jax_fem/`. It contains a custom function that takes the Tesseract's inputs to render a PyVista plot of the design structure directly in the UI! โš™๏ธ Check out the [source code to see how it works](https://github.com/pasteurlabs/tesseract-streamlit/examples/jax_fem/udf.py). @@ -60,6 +60,7 @@ Check out the [source code to see how it works](https://github.com/pasteurlabs/t Run your new app with: ```bash +cd ~/Documents/tesseract-streamlit/examples/jax_fem streamlit run app.py ``` From 9d378fe8bafee8d699cb3d70ce7fa64cc4d41cd1 Mon Sep 17 00:00:00 2001 From: Nolan Black Date: Fri, 18 Jul 2025 17:40:21 -0400 Subject: [PATCH 08/12] added von Mises stress to jax_fem OutputSchema --- examples/jax_fem/tesseract_api.py | 46 ++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/examples/jax_fem/tesseract_api.py b/examples/jax_fem/tesseract_api.py index 0b66a22..923bc31 100644 --- a/examples/jax_fem/tesseract_api.py +++ b/examples/jax_fem/tesseract_api.py @@ -91,6 +91,13 @@ class OutputSchema(BaseModel): ] ] = Field(description="Compliance of the structure, a measure of stiffness") + von_mises_stress: Differentiable[ + Array[ + (None,), + Float32, + ] + ] = Field(description="The average von Mises stress in each element") + # # Helper functions @@ -224,6 +231,7 @@ def compute_compliance(self, sol): sol[self.fe.cells][boundary_inds[:, 0]][:, None, :, :] * self.fe.face_shape_vals[boundary_inds[:, 1]][:, :, :, None] ) + u_face = jnp.sum(u_face, axis=2) subset_quad_points = self.physical_surface_quad_points[0] neumann_fn = self.get_surface_maps()[0] @@ -231,6 +239,41 @@ def compute_compliance(self, sol): val = jnp.sum(traction * u_face * nanson_scale[:, :, None]) return val + def get_von_mises_stress_fn(self): + def vm_stress_fn_helper(sigma): + dim = 2 + s_dev = sigma - 1.0 / dim * jnp.trace(sigma) * np.eye(dim) + vm_s = jnp.sqrt(3.0 / 2.0 * np.sum(s_dev * s_dev)) + return vm_s + + def vm_stress_fn(u_grad, theta): + sigma = self.get_tensor_map()(u_grad, theta) + return vm_stress_fn_helper(sigma) + + return vm_stress_fn + + def compute_von_mises_stress(self, sol, density): + """Compute element-average von Mises stress.""" + # (num_cells, 1, num_nodes, vec, 1) * (num_cells, num_quads, num_nodes, 1, dim) + # -> (num_cells, num_quads, num_nodes, vec, dim) + u_grads = ( + jnp.take(sol, self.fe.cells, axis=0)[:, None, :, :, None] + * self.shape_grads[:, :, :, None, :] + ) + u_grads = np.sum(u_grads, axis=2) # (num_cells, num_quads, vec, dim) + density_at_ips = density[:, None] + for i in range(1, 3): + density_at_ips = np.repeat(density_at_ips, u_grads.shape[i], i) + vm_stress_fn = self.get_von_mises_stress_fn() + vm_stress = jax.vmap(jax.vmap(vm_stress_fn))( + u_grads, *self.internal_vars + ) # (num_cells, num_quads) + cells_JxW = self.JxW[:, 0, :] # (num_cells, num_quads) + volume_avg_vm_stress = np.sum(vm_stress * cells_JxW, axis=1) / np.sum( + cells_JxW, axis=1 + ) # (num_cells,) + return volume_avg_vm_stress + # Memoize the setup function to avoid expensive recomputation @lru_cache(maxsize=1) @@ -317,7 +360,8 @@ def apply(inputs: InputSchema) -> OutputSchema: ) sol_list = fwd_pred(density) compliance = problem.compute_compliance(sol_list[0]) - return OutputSchema(compliance=compliance) + vm = problem.compute_von_mises_stress(sol_list[0], density) + return OutputSchema(compliance=compliance, von_mises_stress=vm) # From 8cfbace18aff1a147ae287b26be9e924a4416db0 Mon Sep 17 00:00:00 2001 From: Nolan Black Date: Fri, 18 Jul 2025 17:54:18 -0400 Subject: [PATCH 09/12] minor readme fix --- examples/jax_fem/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jax_fem/README.md b/examples/jax_fem/README.md index 62f44b7..3b38c9a 100644 --- a/examples/jax_fem/README.md +++ b/examples/jax_fem/README.md @@ -33,7 +33,7 @@ Use the Tesseract CLI to build and serve `jax_fem`: ```bash tesseract build ~/Documents/tesseract-streamlit/examples/jax_fem -tesseract serve jax-fem +tesseract serve jax_fem ``` > [!NOTE] From bfda5bf2267c7c67bad04a65c9c558a303c28920 Mon Sep 17 00:00:00 2001 From: Nolan Black Date: Fri, 18 Jul 2025 17:54:40 -0400 Subject: [PATCH 10/12] used a cleaner way to calculate ugrad --- examples/jax_fem/tesseract_api.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/examples/jax_fem/tesseract_api.py b/examples/jax_fem/tesseract_api.py index 923bc31..f707a93 100644 --- a/examples/jax_fem/tesseract_api.py +++ b/examples/jax_fem/tesseract_api.py @@ -254,20 +254,14 @@ def vm_stress_fn(u_grad, theta): def compute_von_mises_stress(self, sol, density): """Compute element-average von Mises stress.""" - # (num_cells, 1, num_nodes, vec, 1) * (num_cells, num_quads, num_nodes, 1, dim) - # -> (num_cells, num_quads, num_nodes, vec, dim) - u_grads = ( - jnp.take(sol, self.fe.cells, axis=0)[:, None, :, :, None] - * self.shape_grads[:, :, :, None, :] - ) - u_grads = np.sum(u_grads, axis=2) # (num_cells, num_quads, vec, dim) - density_at_ips = density[:, None] - for i in range(1, 3): - density_at_ips = np.repeat(density_at_ips, u_grads.shape[i], i) + # (num_cells, num_quads, num_nodes, vec, dim) + u_grads = self.fe.sol_to_grad(sol) + vm_stress_fn = self.get_von_mises_stress_fn() vm_stress = jax.vmap(jax.vmap(vm_stress_fn))( u_grads, *self.internal_vars ) # (num_cells, num_quads) + cells_JxW = self.JxW[:, 0, :] # (num_cells, num_quads) volume_avg_vm_stress = np.sum(vm_stress * cells_JxW, axis=1) / np.sum( cells_JxW, axis=1 From 62771317656cb9fe8a7c1f45038f4ec7cfe429bc Mon Sep 17 00:00:00 2001 From: Nolan Black Date: Fri, 18 Jul 2025 17:55:54 -0400 Subject: [PATCH 11/12] added some useful references --- examples/jax_fem/tesseract_api.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/jax_fem/tesseract_api.py b/examples/jax_fem/tesseract_api.py index f707a93..5233e8f 100644 --- a/examples/jax_fem/tesseract_api.py +++ b/examples/jax_fem/tesseract_api.py @@ -252,6 +252,9 @@ def vm_stress_fn(u_grad, theta): return vm_stress_fn + # reference: + # https://github.com/deepmodeling/jax-fem/blob/ac0aace6537cfd3f44183d760fdfa201cee8ab46/docs/source/learn/linear_elasticity.ipynb#L300 + # https://github.com/deepmodeling/jax-fem/blob/ac0aace6537cfd3f44183d760fdfa201cee8ab46/applications/outdated/top_opt/fem_model.py#L121 def compute_von_mises_stress(self, sol, density): """Compute element-average von Mises stress.""" # (num_cells, num_quads, num_nodes, vec, dim) From 2d359c55b212d6121462c5afcf2ca67a23665bf4 Mon Sep 17 00:00:00 2001 From: Jacan Chaplais Date: Wed, 23 Jul 2025 18:38:49 +0100 Subject: [PATCH 12/12] doc: add jax_fem readme to docs --- docs/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.md b/docs/index.md index 7a4acfa..f912567 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,4 +18,5 @@ api :hidden: examples/vectoradd_jax/README.md +examples/jax_fem/README.md ```