Skip to main content

🧬 FiberNet v4

Python Toolkit for Fiber Network Design, Simulation & Intelligent Optimization

PyPI Python License CI Downloads

中文文档 · PyPI · Tutorial · API Docs

Developed by ML-BioMat Lab @ BMG-FDU


Overview

FiberNet is a research-grade Python toolkit for computational design of fiber network metamaterials. It provides a complete closed-loop workflow:

Generation → Simulation (Mass-Spring / FEM) → Feature Extraction → Machine Learning → Reinforcement Learning
Feature Description
26 Unit Types 12 2D + 14 3D: honeycomb, kagome, reentrant, octet, diamond_3d, fcc, bcc, gyroid, TPMS…
Parametric Control Internal point displacements for RL-ready continuous action spaces
Dual Simulation Taichi mass-spring (GPU) + Beam Frame FEM (Euler–Bernoulli)
94-Dim Features Structural + pore + contact feature extraction
One-Line ML predict_from_csv() → train, evaluate, visualize, save
One-Line RL run_bayesian_optimization() or CEM optimization

🖼️ Showcase

2D Structure Gallery

12 2D unit types: square, triangle, hexagon, honeycomb, kagome, voronoi, chiral, reentrant, star, cross, diamond, missing_rib.

FEM Deformation Showcase

Beam Frame FEM analysis: uniaxial stretch (2×) and compression (0.5×) across multiple topologies and fiber radii. Bright color = high von Mises stress. Structures modeled as welded frames with radius-dependent bending stiffness.

Voronoi Stretch

Voronoi structure under 1.5× uniaxial stretch — deformation and stress distribution.

Deformation Trajectory

8-frame deformation trajectory: honeycomb under stretch, colored by edge stretch ratio.

ML Analysis

ML analysis: confusion matrix, ROC curves, and learning curves.

RL Reward

CEM reinforcement learning: reward per episode and monotonically increasing best reward.


🚀 Quick Start

One-Line API

import fibernet as fn

g = fn.pattern_2d(unit="honeycomb", box=(10, 10), grid=(4, 4))
fn.show(g)  # one-line visualization
r = fn.simulate(g, mode="stretch", strain=1.5, backend="spring")
print(f"max_force={r.max_force:.0f} N, max_stretch={r.max_stretch:.3f}")

FEM in 3 Lines

from fibernet.ml.beam_frame_fem_v6 import BeamFrameFEM_v6

solver = BeamFrameFEM_v6(E=1e9, nu=0.3)
g = fn.pattern_2d(unit="honeycomb", box=(10, 10), grid=(4, 4), radius=0.05)
result = solver.stretch_test(g, target_stretch=2.0)

print(f"Max stress: {result['sigma_total'].max()/1e6:.1f} MPa")
print(f"Max displacement: {result['max_displacement']:.4f} m")

Complete Pipeline

import fibernet as fn
import numpy as np

# 1. Parametric structure (20 displacement params for RL)
displacements = [(np.random.uniform(-0.3, 0.3), np.random.uniform(-0.3, 0.3))
                 for _ in range(20)]
g = fn.pattern_2d(unit="square", box=(10, 10), grid=(3, 3),
                  n_pts_per_side=5, point_displacements=displacements)

# 2a. Taichi mass-spring simulation
engine = fn.TaichiEngine()
r = engine.stretch_test(g, target_stretch=1.5, stiffness=1e5,
                        damping=0.3, num_steps=1000, save_interval=200)

# 2b. Or Beam Frame FEM (Euler-Bernoulli, welded joints)
fem = BeamFrameFEM_v6(E=1e9, nu=0.3)
fem_result = fem.stretch_test(g, target_stretch=1.5)
sim_r = fem.to_sim_result(fem_result, graph=g)

# 3. Visualization
fig = fn.render_trajectory(g, r.positions_trajectory, r.edge_stretches,
                           n_frames=6, title="Stretch Process")
fig.savefig("deformation.png", dpi=150)

# 4. Feature extraction (94-dim vector)
ext = fn.GraphFeatureExtractor()
features = ext.extract(g)

# 5. Node manipulation (for RL action space)
internal = g.get_internal_nodes()
g.displace_node(internal[0], [0.1, 0.2])

📦 Installation

pip install fibernet          # core
pip install fibernet[full]    # ML + RL + viz + simulation
pip install fibernet[ml]      # ML only
pip install fibernet[rl]      # RL only
Optional Group Packages
ml scikit-learn, pandas, tqdm
rl gymnasium, scikit-optimize, stable-baselines3
accel taichi (GPU simulation)
viz pyvista (3D visualization)
full all of the above

🔬 Beam Frame FEM

FiberNet v4.1 introduces a production-grade Beam Frame Finite Element Method solver based on Euler–Bernoulli beam theory, providing physically accurate mechanical analysis beyond the mass-spring model.

Physics Model

Unlike mass-spring models where fiber diameter is cosmetic, the FEM solver treats the structure as a welded frame — joints are rigidly connected and fiber radius directly determines bending and axial stiffness:

EI = E × πr⁴ / 4          (bending rigidity)
EA = E × πr²              (axial rigidity)
σ_axial = N / A            (axial stress)
σ_bending = M·r / I        (bending stress)
σ_total = σ_axial + σ_bending

Doubling the fiber radius increases bending stiffness by 16× (r⁴ dependence), correctly capturing the physics of fiber network metamaterials.

Verification Results

Validated across 152 simulations (8 2D + 6 3D topologies × 4 radii × 4 stretch targets):

Radius Max Stress (2× stretch, honeycomb) Dominant Mode
r = 0.02 2,967 MPa Bending-dominated
r = 0.05 7,418 MPa Bending-dominated
r = 0.10 14,835 MPa Bending-dominated
r = 0.20 20,997 MPa Bending-dominated

All structures show full deformation propagation — boundary displacement transmits through the entire structure, not just the first few layers.

API

from fibernet.ml.beam_frame_fem_v6 import BeamFrameFEM_v6
import fibernet as fn

solver = BeamFrameFEM_v6(E=1e9, nu=0.3)

# Generate structure (radius matters for FEM!)
g = fn.pattern_2d(unit="honeycomb", box=(10, 10), grid=(4, 4), radius=0.05)

# One-liner stretch test (auto-selects linear/nonlinear solver)
result = solver.stretch_test(g, target_stretch=2.0)

# Access results
u = result['u']                      # nodal displacements
sigma = result['sigma_total']        # per-element total stress
sigma_axial = result['sigma_axial']  # axial component
sigma_bend = result['sigma_bending'] # bending component
reactions = result['reactions']      # boundary reaction forces

# Low-level API for custom analysis
fem_input = solver.graph_to_fem_input(g, dim=2, pct=0.1)
result = solver.solve_2d(**fem_input)              # linear
result = solver.solve_2d_nonlinear(**fem_input)    # geometrically nonlinear
result = solver.solve_3d(**fem_input)              # 3D analysis

# Convert to SimResult for viz/ML compatibility
sim_result = solver.to_sim_result(result, graph=g)

Supported Solvers

Solver Use Case
solve_2d() Linear 2D — small deformations, fast
solve_2d_nonlinear() Nonlinear 2D — large deformations (co-rotational)
solve_3d() 3D beam frame analysis
stretch_test() Convenience wrapper — auto-selects solver

📚 API Reference

Structure Generation

import numpy as np
disps = [(np.random.uniform(-0.3, 0.3), np.random.uniform(-0.3, 0.3))
         for _ in range(20)]

g = fn.pattern_2d(
    unit="square",              # 12 2D unit types
    box=(10, 10),               # cell size
    grid=(3, 3),                # tiling grid
    n_pts_per_side=5,           # internal points per edge
    point_displacements=disps,  # parametric control
    radius=0.05,                # fiber radius (for FEM)
    seed=42,
)

# 3D structures
g3d = fn.pattern_3d(unit="octet", box=(5, 5, 5), grid=(2, 2, 2))

Available unit types:

  • 2D: chiral, cross, diamond, hexagon, honeycomb, kagome, missing_rib, reentrant, square, star, triangle, voronoi
  • 3D: bcc, chiral_3d, cubic, diamond_3d, fcc, gyroid, hcp, iwp, lidinoid, neovius, octet, reentrant_3d, schwarz_d, schwarz_p

Node Manipulation

g.displace_node(node_id, [dx, dy])
g.set_node_position(node_id, [x, y])
g.set_node_positions({1: [2.5, 0.5], 3: [7.5, 1.0]})

internal = g.get_internal_nodes()
boundary = g.get_boundary_nodes()

Simulation (Mass-Spring)

engine = fn.TaichiEngine()
r = engine.stretch_test(g,
    target_stretch=1.5,
    stiffness=1e5,
    damping=0.3,
    num_steps=5000,
    ramp_fraction=0.2,
    save_interval=1000)

r.max_force           # max edge force (N)
r.edge_forces         # per-edge forces
r.edge_stretches      # per-edge stretch ratios
r.positions_trajectory # list of (N,3) position arrays

r.save("result.json", detailed=True)
r2 = fn.SimResult.load("result.json")

Visualization

fig = fn.render_graph(g, theme="dark")       # dark purple
fig = fn.render_graph(g, theme="light")      # white background
fig = fn.render_graph(g, theme="blueprint")  # blueprint style

fig = fn.render_deformation(g_original, g_deformed, color_by="stress")
fig = fn.render_trajectory(g, r.positions_trajectory, r.edge_stretches,
                           n_frames=6, title="Stretch Process")

Machine Learning

from fibernet.ml import (
    train_predictor, cross_validate, compare_models,
    predict_from_csv, plot_predictions, plot_feature_importance,
)

result = predict_from_csv("sim_results.csv", target="max_force",
                          model_type="rf", output_dir="ml_out/")

model, metrics = train_predictor(X, y, model_type="rf")
print(f"R² = {metrics['r2']:.3f}")

cv = cross_validate(X, y, model_type="ridge", cv=5)

Reinforcement Learning

from fibernet.rl import (
    plot_reward_curve, plot_convergence, plot_action_distribution,
    run_bayesian_optimization, save_agent, load_agent,
)

result = run_bayesian_optimization(
    objective_fn,
    param_space={"grid_x": (2, 5), "stiffness": (1e4, 1e6)},
    n_iter=50)

plot_reward_curve(rewards, window=20, save_path="reward.png")
plot_convergence(objectives, minimize=True, save_path="conv.png")

🎯 RL Parametric Control

FiberNet exposes (dx, dy) displacement parameters for each internal point on every edge — a continuous action space for RL.

# 40-dim action vector → 20 (dx,dy) pairs
action = agent.act(obs)  # shape: (40,), range: [-0.3, 0.3]
displacements = [(action[2*i], action[2*i+1]) for i in range(20)]
g = fn.pattern_2d(unit="square", grid=(3,3), n_pts_per_side=5,
                  point_displacements=displacements)

🎓 Tutorial

A complete end-to-end Jupyter notebook:

tutorials/complete_tutorial_v4.ipynb

Standalone runner with checkpoint support:

python3 tutorials/run_pipeline.py                        # full pipeline
python3 tutorials/run_pipeline.py --num-structures 100   # quick test
python3 tutorials/run_pipeline.py --skip-rl              # skip RL section

Covers: structure generation → batch simulation → deformation visualization → feature extraction → ML → CEM reinforcement learning.


🔬 How It Works

Mass-Spring Model (Taichi)

GPU-accelerated mass-spring dynamics:

  1. Nodes = point masses with position and velocity
  2. Edges = linear springs (configurable stiffness, rest length)
  3. Boundary = fixed nodes (Dirichlet BC) during stretch
  4. Relaxation = initial energy minimization before loading
  5. Loading = controlled displacement to target stretch ratio
F_spring = k × (L − L₀) / L₀ × direction
F_damping = −c × v_rel · direction × direction × L₀
F_drag = −γ × v

Beam Frame FEM

Euler–Bernoulli beam elements with welded joints:

  1. Nodes = welded joints (rigid connection, moment transfer)
  2. Elements = beam elements with axial + bending stiffness
  3. Radius = fiber radius determines EA and EI (physical cross-section)
  4. Boundary = 10% each side fixed (Dirichlet BC)
  5. Solver = linear (small deformation) or co-rotational nonlinear (large deformation)
K_global × U = F    →    σ = E × B × U_element

Parametric Structure Control (for RL)

Each edge can have n_pts_per_side internal nodes with programmable (dx, dy) displacement:

Action = [dx₁, dy₁, dx₂, dy₂, ..., dxₙ, dyₙ] ∈ [−0.3, 0.3]^(2n)

For square with n_pts_per_side=5: 40 continuous parameters (20 displacement pairs).


📁 Project Structure

fibernet/
├── fibernet/
│   ├── core/         # StructureGraph, Material, transforms
│   ├── gen/          # pattern_2d/3d, unit factories (26 types)
│   ├── sim/          # TaichiEngine (mass-spring), SimResult
│   ├── ml/           # BeamFrameFEM_v6, train_predictor, cross_validate
│   ├── viz/          # render_graph, render_trajectory, themes
│   ├── analysis/     # GraphFeatureExtractor (94-dim)
│   ├── rl/           # CEM env, Bayesian opt, reward curves
│   └── easy.py       # show(), simulate(), batch_simulate()
├── tutorials/        # Jupyter notebook + standalone runner
├── tests/            # 312 tests (pytest)
├── examples/         # 19 example scripts
├── docs/             # Sphinx documentation + images
└── pyproject.toml    # build configuration

📊 Performance

Task Time Hardware
Generation (square 3×3) ~0.1 s CPU
Stretch — Mass-Spring (5000 steps) ~6 s Taichi x64
Stretch — FEM (honeycomb 4×4) ~2 s CPU (scipy sparse)
Feature extraction (94-dim) ~0.5 s CPU
ML training (RF, 100 samples) ~1 s CPU
CEM optimization (200 episodes) ~6 min CPU

📝 Citation

@software{fibernet2026,
  title = {FiberNet: Python Toolkit for Fiber Network Design and Optimization},
  author = {ML-BioMat Lab, BMG-FDU},
  year = {2026},
  url = {https://github.com/GellmanSparrowS/fibernet},
  version = {4.1.3},
}

📄 License

MIT License. See LICENSE.


Metadata

Release files for fibernet 4.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fibernet 4.1.3
File Size Uploaded
fibernet-4.1.3.tar.gz 16.5 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for fibernet 4.1.3
File Interpreter ABI Platform
fibernet-4.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 17.1 MB

Release files / fibernet-4.1.3.tar.gz

Download URL fibernet-4.1.3.tar.gz
Size 16.5 MB
Tags Source
SHA-256 checksum
How to use checksums
b0061aba3d1866040199359c28e4a054ac3557b8df5feac2d453d361bca5e955
BLAKE2b-256 checksum
How to use checksums
d15478ddc923e074ffca0c5192548e56fc80d5c619bd7e556d8be6ad7f1051e1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release files / fibernet-4.1.3-py3-none-any.whl

Download URL fibernet-4.1.3-py3-none-any.whl
Size 653.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a085e4778f8db7b56dbadd678c2613c3565ecfd33212642cad725bcffd65e35a
BLAKE2b-256 checksum
How to use checksums
adb82d474a7f5e97313026515a8b896bc43bd1e95e764e2435fd83546c2c2832
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release history Release notifications | RSS feed

4.2.0

2 release files

4.1.7

2 release files

4.1.6

2 release files

4.1.5

2 release files

4.1.4

2 release files

This release

4.1.3 This release

2 release files

4.1.2

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.5

2 release files

4.0.4

2 release files

4.0.3

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page