libra
A grammar for generating structural topologies
Science Score: 75.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 11 DOI reference(s) in README -
✓Academic publication links
Links to: zenodo.org -
○Academic email domains
-
✓Institutional organization owner
Organization structuralxplorationlab has institutional domain (sxl.epfl.ch) -
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (10.5%) to scientific vocabulary
Repository
A grammar for generating structural topologies
Basic Info
Statistics
- Stars: 39
- Watchers: 3
- Forks: 1
- Open Issues: 0
- Releases: 7
Metadata Files
README.md
Table of contents
- General info
- Installation
- Tutorials
- Concept
- Usage
- Background theory
- Known issues
- Version history
- Related publications
- Citation
- License
- Collaborations
- Acknowledgements
General info
Libra is a Grasshopper plug-in operating in Rhinoceros 3D by McNeel. It has been developed by Ioannis Mirtsopoulos as part of his doctoral research at Structural Xploration Lab (SXL) at EPFL and his postdoctoral stay at Digital Structures research group at Massachusetts Institute of Technology (MIT), in USA. Libra is a conceptual structural design tool that operates on a topology grammar, inspired by Noam's Chomsky "Syntactic Structures" and many others.
Installation
Operating System: Windows (preferred); Mac (at your own risk)
Version: Rhinoceros 8
- Run the PackageManager command.
- Look for Libra.
- Click install.
- Restart Rhino to load the plugin.
Check the video tutorial here
Tutorials
Concept
Libra describes an incremental transformative process that allows the transition from an incomplete network (Fig. 1, stage 00) to a complete one (Fig. 1, stage 13). In other words, the incremental elimination of interim forces in the network. At every intermediate step the network is in static equilibrium (interim when interim forces—vectors in cyan—are still present, or global when no interim forces exist).

Fig. 1: Incremental transformative process.
Usage
You can find Libra's detailed manual here. Alternatively, below you have a brief to start with...
A primitive setup of the transformative design process with Libra is demonstrated below in Fig. 6. Each of the circled component groups accomplishes a certain task. Groups 1 and 2, provide the permanent input parameters and groups 3-6 describe the transformation policy through transient parameters. Group 7 applies the transformation in compliance with the built policy.
- Construct design domain
- Construct model
- Select forces
- Place new node
- Set force indeterminacies
- Construct policy
- Apply transformation
Groups 3-6 describe design decisions that can be applied once or for the course of multiple transformations. The number of transformations is defined at group 7. If different decisions need to be made, groups 3-6 need to be redefined (the respective components must be introduced again on Grasshopper canvas) and the transformed model (output from group 7) should be provided as input for the upcoming transformations, if more interim forces exist.

Fig. 2: Grasshopper canvas overview of a complete trnasformation setup that transforms the interim network according to a policy defined via rules.
Background theory
Structural design describes forms that synthesize structural behaviors—they ‘tell’ how a structure withstands and/or deforms under the application of loads. Structural behaviors are subject to various laws, among which static equilibrium of forces plays a central role. The concept of static equilibrium in structures is one that can be reduced to minimal, abstract equilibrium configurations that consist of vectors, nodes, and bars in compression or tension.
For given loading and boundary conditions, the number of arrangements of tension and compression elements in static equilibrium is theoretically infinite. In practice, only a small, finite subset of equilibrium configurations are explored and/or employed. Design space exploration (DSE) is a creative process that consists of incremental generation of multiple design variants (design options) and is chronologically framed in the early design stage. DSE helps designers to find high quality design alternatives and fights against premature design fixation, which notoriously results in the generation of resembling design variants.
Transformation step
Each step describes a transformation that consists of the introduction of:
- a new node (P)
- one, two (or three) new bars
- one, two or three new interim forces imposed by the static equilibrium condition
Fig. 3 illustrates a simple example of a transformation step.

Fig. 3: Before/After transformation in space. Black arrows represent force actions that are applied externally to the (sub)system. Cyan arrows represent interim forces. Bars in compression are thick lines. Bars in tension are thin lines.
Design input
Each transformation is controlled by four design decisions:
- The transformation impact—the numerical difference of interim forces in the network before and after the transformation, described as the entropy rate. As a designer, you express your intention through a ternary decision among:
- convergence; decrease the number of interim forces
- stagnation; stagnate the number of interim forces
- divergence; increase the number of interim forces
Hint: This decision directly affects the speed of the transition to a complete network.
- The interim forces to eliminate—the selection of the interim forces as the starting point of each transformation and the topology of the new sub-network, described as force(s) selection. According to Fig. 4, the possible topologies are:
- in-between
- peripheral
- central

Fig. 4: The possible connectivity topologies.
The available force(s) selection options are:
- monomial; only one force vector is selected
- binomial; two force vectors are selected
- trinomial; three force vectors are selected (feature currently not activated)
Attention: Until v1.1.0, trinomials are not activated. Subsequently, the possible topological configurations are two: in-between and peripheral/central. The latter result in the same transformation result.
As a designer, you make the selection implicitly or explicitly.
- explicitly; manual selection of the interim forces and the topology
- implicitly; automated selection of forces and topology through a designer-chosen rule (there is a list of rules, additional parameters might be required)
- The transformation geometry—the position of the new node P, described as node placement. As a designer, you do the placement implicitly or explicitly.
- explicitly; manual placement of the node
- implicitly; automated placement through a designer-chosen rule (there is a list of rules; additional parameters might be required)
- The structural behavior of the transformation—the type (compression/tension) and magnitude of the axial forces developed along the introduced bars, described as force indeterminacies. As a designer, you make the selection implicitly or explicitly.
- explicitly; manual provision of axial forces (N1, N2, N3) for all two (or three) new bars (Attention: N3 is only necessary when working with trinomials.)
- implicitly; automated definition of axial forces (there is a list of self-explanatory rules; additional parameters might be required)
Fig. 5 illustrates all possible transformations in compliance with the design decisions made. The provided force diagram confirms the static equilibrium condition after the transformation.
Hint: Consider drafting the force diagram of each transformation while designing! It will give you a better understanding of the transformation final geometry.

Fig. 5: Transformation step for all combinations of entropy rates, numbers of interim forces and topological configurations. Black arrows represent force actions that are applied externally to the (sub)system; cyan arrows represent interim forces, all circumscribed within a primitive design domain (grey). Bars in compression are thick lines. Bars in tension are thin lines.
Libra provides a design workflow that ensures static equilibrium of the generated network. This condition is satisfied by constraining the placement of the new node within a specific geometric domain, named entropy rate domain (Fig. 6). In other words, the entropy rate domain describes all possible locations that node P can take, while the network retains static equilibrium. The size of this domain varies, from a single point in space to a volume. Do not worry, as a designer, you do not have to compute this domain. If you manually request the placement of node P at a location outside of the entropy rate domain, the algorithm will consider the closest projected location on the entropy rate domain, ensuring static equilibrium.
Between node P and the existing nodes of the network, new bars are introduced. Their construction implies that the bars are not interrupted by voids or non-convexities of the design domain. This condition is satisfied when certain visibilities between nodes are satisfied. The geometric domain that describes all possible locations that node P can have, while ensuring that the necessary bars can be constructed uninterrupted is named constructability domain (Fig. 6). Do not worry, as a designer, you do not have to compute this domain. The algorithm will check that. Be aware though that the geometric domain where node P can be safely introduced during each transformation is the intersection of the two domains and is named feasibility domain.

Fig. 6: Typologies of entropy rate and constructability domains. Black arrows represent force actions that are applied externally to the (sub)system; cyan arrows represent interim forces, all circumscribed within a primitive design domain (grey). Magenta regions on the left are the intersections of the design domain (a non-convex solid with a void) with the entropy rate domain. Magenta regions on the right are the intersections of the design domain with the constructability domain.
Known issues
The Construct Force Selection Rule complonent (and some others) have dynamic number of inputs, which means that the number of input slots varies based on the desired rule ID. When shifting from force selection rule Random or ProximityToUserSelectedPoint to an other rule, the rule might not be constructed. Try to toggle some of the other input parameters and use a label component to make sure ForseS outputs a rule.
The Construct domain component does not support multiple voids. If more than one are provided, only the first one will be considered.
In the Design Space Exploration component the population of each generation is clustered to 12 representative designs. The clustering is genotype-based and therefore the 12 representatives can be misleading, aka "hiding" designs that have different phenotype. For extensive design exploration it is highly recommended to browse through the entire population of each generation.
Version history
https://github.com/StructuralXplorationLab/Libra/releases
Related publications
Mirtsopoulos, I., Fivet, C., 2023. “Structural Topology Exploration through Policy-Based Generation of Equilibrium Representations.” Computer-Aided Design 160 (July 1, 2023): 103518. https://doi.org/10.1016/j.cad.2023.103518
Mirtsopoulos, I., Fivet, C., 2022. "Exploration of static equilibrium representations; policies and genetic algorithms", in: Structures and Architecture A Viable Urban Perspective? pp. 1137–1144. https://doi.org/10.1201/9781003023555-136
Mirtsopoulos, I., Fivet, C., 2021. "Grammar-based generation of bar networks in static equilibrium with bounded bar lengths", in: Proceedings of International Association for Shell and Spatial Structures (IASS) Symposium 2020/21. 23-27 August, Guilford, UK. https://doi.org/10.15126/900337
Mirtsopoulos, I., Fivet, C., 2020. "Design space exploration through force-based grammar rule". archiDOCT 8, 50–64.
Citation
@software{Mirtsopoulos_Libra_A_grammar_2024,
author = {Mirtsopoulos, Ioannis},
doi = {10.5281/zenodo.14292161},
month = dec,
title = {{Libra: A grammar for generating structural topologies}},
url = {https://doi.org/10.5281/zenodo.14292161},
version = {1.4.5},
year = {2024}
}
License
Collaborations
Collaborations and/or contributions are always welcome. Plus I am always curious to see how creative you have gone with Libra. Drop me a line at ioannis@mirtsopoulos.xyz if you want to brainstorm about generative design, to share your designs or just to say hi!
Acknowledgements
Special thanks to Dr. John Harding for sharing the beauty of Biomorpher; a Grasshopper implementation of Interactive Genetic Algorithms. The components in the Xploration tab (until v1.1.0) are taken by Biomorpher and have been adjusted accordingly.
Owner
- Name: Structural Xploration Lab, EPFL
- Login: StructuralXplorationLab
- Kind: organization
- Location: Switzerland
- Website: http://sxl.epfl.ch
- Repositories: 2
- Profile: https://github.com/StructuralXplorationLab
Citation (CITATION.cff)
cff-version: 1.4.5 message: "If you use this software, please cite it as below." authors: - family-names: "Mirtsopoulos" given-names: "Ioannis" orcid: "https://orcid.org/0000-0002-3726-8807" title: "Libra: A grammar for generating structural topologies" version: 1.4.5 doi: 10.5281/zenodo.14292161 date-released: 2024-12-07 url: "https://doi.org/10.5281/zenodo.14292161"
GitHub Events
Total
- Release event: 2
- Watch event: 7
- Push event: 13
- Fork event: 1
- Create event: 2
Last Year
- Release event: 2
- Watch event: 7
- Push event: 13
- Fork event: 1
- Create event: 2
