Skip to main content

Dynamic Leadership Vitality Theory: A dynamical systems model of executive sustainability

Project description

Dynamic Leadership Vitality Theory (DLVT) — Python Package

Python 3.8+ Tests MIT License

Author: William Bendinelli
Paper: Dynamic Leadership Vitality Theory: A Formal Model of the Zombie-Leader Equilibrium
Target Journal: The Leadership Quarterly (2026)


Overview

This package implements the Dynamic Leadership Vitality Theory (DLVT) model — a two-dimensional autonomous dynamical system that formalizes how leaders who accumulate career capital simultaneously generate the organizational complexity that drains the vitality they need to deploy it.

The model predicts a single robust attractor: a zombie-leader equilibrium at (V* ≈ 4.7, C* ≈ 32) in which the leader retains authority and reputation but permanently lacks the energetic bandwidth for strategic work. The zombie equilibrium is globally asymptotically stable (proved via Bendixson–Dulac + Poincaré–Bendixson on a trapping rectangle).

Three outcome regimes emerge from the parameter space:

  • Sustainable — the leader reaches equilibrium with V* > V_strategic
  • Zombie — the leader converges to V* < V_strategic (the default attractor)
  • Collapse-Prone — unsustainable trajectory where burnout is inevitable

Quick Start

Installation

git clone https://github.com/wbendinelli/dlvt.git
cd dlvt
pip install -e .

Requirements: Python ≥ 3.8, NumPy ≥ 1.24, SciPy ≥ 1.10, Matplotlib ≥ 3.7

Basic Usage

from dlvt import make_params, simulate
from dlvt.analysis import find_interior_equilibria, carrying_capacity

# Create parameter set (defaults match Table 1 of the paper)
p = make_params()

# Simulate from initial state (V0=8.0, C0=5.0) over T=120 time units
t, V, C, O, I, G = simulate(p, V0=8.0, C0=5.0, T=120)
# V — vitality, C — career capital, O — complexity, I — impact, G — depletion ratio

# Find equilibria and classify stability
equilibria = find_interior_equilibria(p)
for eq in equilibria:
    status = "stable" if eq['stable'] else "unstable"
    print(f"V*={eq['V']:.2f}, C*={eq['C']:.2f} ({status})")

# Maximum sustainable career capital (Proposition 3)
C_max = carrying_capacity(p)
print(f"Carrying capacity: C*_max = {C_max:.2f}")

Scenario Analysis

from dlvt import make_params, simulate
from dlvt.analysis import classify_regime

# What happens if we increase recovery support?
p_high_R = make_params(R=5.0)
regime = classify_regime(p_high_R)
print(f"Regime with R=5.0: {regime}")

# What if complexity coupling is halved?
p_low_beta = make_params(beta=0.125)
t, V, C, O, I, G = simulate(p_low_beta, V0=8.0, C0=5.0, T=200)
print(f"Final V={V[-1]:.2f}, C={C[-1]:.2f}")

The Dynamical System

The DLVT model is governed by two coupled ODEs:

$$\frac{dV}{dt} = R \left(1 - \frac{V}{V_{\max}}\right) - \delta \cdot O^{\gamma} \cdot \frac{V}{V + \varepsilon}$$

$$\frac{dC}{dt} = \alpha \cdot I - \mu \cdot C$$

with derived quantities:

  • Organisational Complexity: O(t) = O_0 + β · C(t)^η
  • Leadership Impact: I(t) = C · V / (1 + φ · O) — energy-gated effectiveness
  • Depletion Ratio: Γ(t) = δ · O^γ / R — net drain when Γ > 1

The first equation balances bounded vitality recovery against complexity-driven drain. The second models career capital accumulation through impact feedback minus depreciation. The smooth barrier V/(V+ε) ensures positive invariance of the state space.

Parameter Table

All parameters from Table 1 of the paper (baseline calibration, C₀ = 5.0):

Symbol Key Default Description
R R 3.0 Vitality recovery rate
V_max Vmax 10.0 Maximum vitality capacity
δ delta 0.02 Energetic cost coefficient
γ gamma 2.0 Complexity exponent in drain
O₀ O0 1.0 Baseline organisational complexity
β beta 0.25 Capital–complexity coupling
η eta 1.0 Capital scaling exponent
α alpha 0.1 Capital accumulation rate
φ phi 0.15 Complexity–impact suppression
μ mu 0.2 Capital depreciation rate
ε eps 0.1 Smooth barrier regularisation

Key Theoretical Results

Theorem 1 (Finite-Time Depletion): Under exogenous complexity growth that creates a persistent deficit (Γ > 1), vitality reaches the ε-neighborhood of zero in finite time.

Theorem 2 (Global Asymptotic Stability): The zombie equilibrium (V*, C*) is the unique interior attractor. Proved via Bendixson–Dulac (no closed orbits), trapping rectangle [0, V_max] × [0, C_max], and Poincaré–Bendixson.

Lemma 2 (Scope Absorption): V*(β) ≡ V*₀ for all β in the structurally interior region; the invariant β · C* ≈ 8.008 is preserved. Scope reduction alone does not raise equilibrium vitality.

Proposition 3 (Carrying Capacity):

$$C^{*}_{\max} = \left[\left(\frac{R}{\delta}\right)^{1/\gamma} - O_0\right]^{1/\eta} \Bigg/ \beta$$

API Reference

dlvt.model — Core ODE System

from dlvt import make_params, simulate, complexity, impact
Function Description
make_params(**overrides) Create parameter dict with keyword overrides
complexity(C, p) Computes O = O_0 + β·C^η
impact(V, C, O, p) Computes I = C·V / (1 + φ·O)
dlvt_system(t, y, p) ODE right-hand side for scipy.integrate.solve_ivp
dlvt_exogenous(t, y, p, C_func) Variant with exogenous career capital path
simulate(p, V0, C0, T, max_step) Integrate ODE; returns (t, V, C, O, I, G)

dlvt.analysis — Equilibrium Theory & Stability

from dlvt.analysis import (
    find_interior_equilibria, carrying_capacity,
    jacobian_eigenvalues, is_zombie, classify_regime, regime_map
)
Function Description
find_interior_equilibria(p) Find all (V*, C*) > 0 fixed points
carrying_capacity(p) Maximum sustainable capital C*_max
jacobian_eigenvalues(V, C, p) Eigenvalue structure and stability class
is_zombie(V, p) Check V* < V_strategic
classify_regime(p) Returns 'sustainable', 'zombie', or 'collapse-prone'
regime_map(betas, deltas) (β, δ) regime classification grid

dlvt.figures — Publication Figure Generation

from dlvt.figures import fig1, fig2, fig3, fig4, fig5, fig6, fig7

fig3(output_dir='figures/')  # Phase portrait
Figure Content
Fig 1 Temporal evolution of V(t), C(t), O(t), Γ(t)
Fig 2 Three outcome scenarios (sustainable, zombie, collapse)
Fig 3 Phase portrait with nullclines and equilibria
Fig 4 Bifurcation diagrams: C* and V* vs β, R
Fig 5 Impact comparison: DLVT vs Human Capital Theory (Becker)
Fig 6 Carrying capacity heatmap C*_max(β, R)
Fig 7 Regime map in (β, δ) space

Reproducing All Paper Figures

python3 scripts/run_all_figures.py             # All 10 figures (PDF + PNG)
python3 scripts/run_all_figures.py --fig 1-7   # Core only
python3 scripts/run_all_figures.py --fig 8-10  # Extended analysis only

Extended figures (standalone scripts):

python3 scripts/fig8_bifurcation_hysteresis.py    # Hysteresis detection
python3 scripts/fig9_robustness.py                # Structural robustness
python3 scripts/fig10_intervention_comparison.py   # Recovery vs redesign

Running the Tests

pytest tests/ -q          # 38 tests, all must pass
pytest tests/ -v --tb=short  # verbose with tracebacks

The test suite pins every numerical claim in the paper (equilibrium values, carrying capacity, scope-absorption invariant, eigenvalue signs, basin-of-attraction convergence) so that any code change that breaks paper–code consistency is caught immediately.

Project Structure

dlvt/
├── dlvt/                     # Core package
│   ├── __init__.py           # Public API exports
│   ├── model.py              # ODE system, parameters, integration
│   ├── analysis.py           # Equilibria, stability, bifurcation, regimes
│   └── figures.py            # Publication figures 1–7
├── tests/                    # 38 pinning tests
│   ├── test_model.py         # Model numerics, simulation, positive invariance
│   └── test_analysis.py      # Equilibria, carrying capacity, regimes
├── scripts/                  # Figure generation (8–10) and robustness grid
├── figures/                  # Generated output (PDF + PNG)
├── pyproject.toml            # Package metadata and dependencies
├── setup.py                  # Legacy installer
└── LICENSE                   # MIT

Citation

@article{bendinelli2026dlvt,
  title   = {Dynamic Leadership Vitality Theory:
             A Formal Model of the Zombie-Leader Equilibrium},
  author  = {Bendinelli, William},
  year    = {2026},
  note    = {Manuscript submitted to The Leadership Quarterly}
}

License

MIT License — see LICENSE for details.

Copyright 2026 William Bendinelli

Contributing

See CONTRIBUTING.md. Issues, feature requests, and pull requests are welcome.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dlvt-2.0.2.tar.gz (39.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dlvt-2.0.2-py3-none-any.whl (30.8 kB view details)

Uploaded Python 3

File details

Details for the file dlvt-2.0.2.tar.gz.

File metadata

  • Download URL: dlvt-2.0.2.tar.gz
  • Upload date:
  • Size: 39.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for dlvt-2.0.2.tar.gz
Algorithm Hash digest
SHA256 861d0a56978ea0d8600aefc9ea96d1c9e2bf07ebb3223d28e58e2aa0ce9d8b9c
MD5 6d91184bc3e18d2106e2392a65b32e22
BLAKE2b-256 5ea2f24a336339a2f41a25baa905533d40987ed46571a2f3a0ebdfa0d9aeca73

See more details on using hashes here.

File details

Details for the file dlvt-2.0.2-py3-none-any.whl.

File metadata

  • Download URL: dlvt-2.0.2-py3-none-any.whl
  • Upload date:
  • Size: 30.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for dlvt-2.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 90eec3e213a9ad4426158e9a830616eac184fcc681eaf40da29987b7e0360502
MD5 a1d9cd2f0891b9ccd953fff6c38884d4
BLAKE2b-256 a977d0b0a535af1bdf24edb4128d5599cd5ece16b97329e13f53ac2fd61eb88a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page