I’ve been building an end-to-end differentiable pipeline that designs kirigami — a variant of origami with cuts instead of folds — by gradient descent in JAX.
It works very well, but it had a blind spot. Every hinge (the part connecting the faces), where all the stress and failure typically live — was modeled as a simple energetic model with stiffnesses I picked by hand. No geometry.
To fix that I needed real continuum mechanics for soft materials (SOFA), but SOFA is slow, non-differentiable, and operates within an incompatible runtime. This is where Tesseract turned out to be the perfect bridge: wrap its /apply + /jacobian, and the black-box FEM solver becomes a differentiable function.
Using Tesseract, I optimized a hinge’s actual cross-section against a fatigue objective — yielding a TPU flexure that folds a full 90° for ~2,000 cycles. Better still, I could measure the hinge’s true spring law and feed it back to the fast JAX model.
Finally, I explore how the macro and micro-level simulators can enable the co-design of kirigami structures perfectly tuned to a target physical behavior and geometry. This unlocks a whole new dimension of design where we can now precisely tune either the structural stiffness or the final geometry at every level based on our needs.
Hey, welcome Julien. Thanks for sharing your project with the community (and for the impressive writeup). Looks really interesting! A couple of maintainers are in the process of digging in to your code to give some more substantive feedback. As you were building with Tesseract, did you run into any particular challenges, or were there any tips/tricks you figured out along the way that you wish you’d known earlier on?
Thanks Samali ! Really glad it resonated, and I appreciate the team digging in.
Please note it’s still an ongoing project for my master’s thesis. I still have a few weeks left to wrap it up. A few things I wish I’d known earlier:
The biggest challenge was that going from a tessellation to the actual mesh is a coupled geometry problem. The hinges change the geometry of the faces. To open a hinge gap when two faces meet perfectly at their corner, I need to trim the border of both faces. And reciprocally, I also want to be able to mesh faces that aren’t perfectly aligned.
Regarding the Tesseract setup, all 9 of my hinge parameters change the geometry, so every finite diff. step has to rebuild the mesh and run SOFA. Keeping the schema small is what made it tractable. The client is just a numpy Adam loop with no autodiff. I was originally a lot more ambitious about the number of parameters. And if I’m honest, I assumed finite differences on SOFA would be fast enough, and that’s the assumption I’d most like to revisit.
I guess the natural fix is to run the sims in parallel. It could distribute across multiple Tesseract containers. I just haven’t tried that yet. Otherwise, a differentiable solver would replace all of this with one solve plus one adjoint. I went with SOFA because I wanted to be sure about contact between faces and large deformations on soft materials, but I really should look harder at JAX-FEM (Tianjue Xue, also Form Finding Lab Princeton!). Maybe the right move is a surrogate trained on SOFA runs. I would really appreciate your expertise on this.
In addition to the irregularity of the loss, the optimization also turned out to be sensitive to the initial condition. The best runs had to start from an already thin, concave hinge. So I’m questioning whether I’m really finding the global optimum. I ran a random parameter search to check, but it’s an expensive process.
This design is simple as a proof of concept. I’d love to experiment with others next: the actual inverse design of metal cut-sheets would be the grand finale of my master’s thesis. The same setup could also do a stiffness-to-hinge-geometry mapping. Given a target shear, axial, and rotational stiffness, what hinge shape matches those values so you can go and fabricate it? Food for thought for the future.