# leiverkus/itinera architecture

> Architecture diagram of the GitHub repository leiverkus/itinera, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-01). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/leiverkus/itinera
- Repository: https://github.com/leiverkus/itinera

## Overview

Itinera is a QGIS movement-modelling plugin: users provide a DEM, point layers and optional friction rasters, run Processing tools, and receive path, cost, connectivity or validation outputs. Its principal workflow maps inputs to raster cells, builds a directional cost graph, solves movement analyses, and writes georeferenced results. The README also describes complementary uncertainty, sensitivity, composite-friction and DEM-preparation tools. Edges below follow sampled calls, the SOURCE INDEX, or README statements; unsampled feature wiring is omitted where it cannot be supported.

Main entry points: [`provider.py`](https://github.com/leiverkus/itinera/blob/main/provider.py) (Processing provider), [`core/conductance.py`](https://github.com/leiverkus/itinera/blob/main/core/conductance.py) (Conductance graph), [`core`](https://github.com/leiverkus/itinera/tree/main/core) (Movement solvers), [`algorithms/lcp_algorithm.py`](https://github.com/leiverkus/itinera/blob/main/algorithms/lcp_algorithm.py) (Least-cost path)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_interface["QGIS interface"]
  node_plugin["Plugin lifecycle<br/>[plugin.py]"]
  node_provider["Processing provider<br/>[provider.py]"]
  node_interactive["Two-click LCP<br/>[point_pick_tool.py]"]
  node_settings["Cost settings<br/>[settings_dialog.py]"]
end

subgraph group_inputs["Input preparation"]
  node_raster["Raster grid I/O<br/>[raster_io.py]"]
  node_points["Point mapping<br/>[_points.py]"]
  node_input_helpers["Raster and cost parameters"]
end

subgraph group_analysis["Movement analysis"]
  node_slope_friction["Slope and friction surfaces"]
  node_lcp["Least-cost path<br/>[lcp_algorithm.py]"]
  node_accessibility["Accessibility catchment"]
  node_stochastic["Stochastic paths"]
  node_corridor["Least-cost corridor<br/>[lcc_algorithm.py]"]
  node_fete["FETE movement<br/>[fete_algorithm.py]"]
  node_rsp["Randomized paths<br/>[rsp_algorithm.py]"]
  node_circuit["Circuit connectivity"]
  node_multicriteria["Composite friction"]
end

subgraph group_assessment["Assessment tools"]
  node_sensitivity["Sensitivity sweep"]
  node_validation["Route validation"]
  node_dem_tools["DEM preparation and error"]
end

subgraph group_engine["Numerical engine"]
  node_cost_functions["Directional cost models<br/>[cost_functions.py]"]
  node_conductance["Conductance graph<br/>[conductance.py]"]
  node_lcp_engine["Shortest-path solver<br/>[lcp.py]"]
  node_analysis_engines["Movement solvers"]
  node_validation_engine["Validation metrics<br/>[validation.py]"]
end

node_user(("QGIS user"))
node_external_data["Project raster and vectors"]

node_user -->|"opens plugin"| node_plugin
node_plugin -->|"registers provider"| node_provider
node_plugin -->|"creates tool"| node_interactive
node_plugin -->|"opens settings"| node_settings
node_provider -->|"registers algorithms"| node_slope_friction
node_provider -->|"registers algorithms"| node_lcp
node_provider -->|"registers algorithms"| node_accessibility
node_provider -->|"registers algorithms"| node_stochastic
node_provider -->|"registers algorithms"| node_corridor
node_provider -->|"registers algorithms"| node_fete
node_provider -->|"registers algorithms"| node_rsp
node_provider -->|"registers algorithms"| node_circuit
node_provider -->|"registers algorithms"| node_multicriteria
node_provider -->|"registers algorithms"| node_sensitivity
node_provider -->|"registers algorithms"| node_validation
node_provider -->|"registers algorithms"| node_dem_tools
node_external_data -->|"loads raster"| node_raster
node_lcp -->|"loads and writes"| node_raster
node_lcp -->|"maps endpoints"| node_points
node_lcp -->|"uses parameters"| node_input_helpers
node_lcp -->|"builds graph"| node_conductance
node_lcp -->|"selects cost model"| node_cost_functions
node_lcp -->|"solves route"| node_lcp_engine
node_slope_friction -->|"builds graph"| node_conductance
node_slope_friction -->|"selects cost model"| node_cost_functions
node_accessibility -->|"builds graph"| node_conductance
node_accessibility -->|"computes catchment"| node_analysis_engines
node_stochastic -->|"runs simulations"| node_analysis_engines
node_stochastic -->|"selects cost models"| node_cost_functions
node_corridor -->|"builds graph"| node_conductance
node_corridor -->|"computes corridor"| node_analysis_engines
node_fete -->|"builds graph"| node_conductance
node_fete -->|"computes traversal frequency"| node_analysis_engines
node_rsp -->|"builds graph"| node_conductance
node_rsp -->|"solves randomized paths"| node_analysis_engines
node_circuit -->|"builds graph"| node_conductance
node_circuit -->|"computes current"| node_analysis_engines
node_multicriteria -->|"combines rasters"| node_analysis_engines
node_sensitivity -->|"builds graph"| node_conductance
node_sensitivity -->|"sweeps routes"| node_lcp_engine
node_sensitivity -->|"measures stability"| node_validation_engine
node_validation -->|"computes metrics"| node_validation_engine
node_dem_tools -->|"reads and writes"| node_raster
node_dem_tools -->|"models DEM error"| node_analysis_engines
node_conductance -->|"evaluates edge costs"| node_cost_functions
node_analysis_engines -->|"uses path solver"| node_lcp_engine
node_validation -->|"maps reference line"| node_points

click node_plugin "https://github.com/leiverkus/itinera/blob/main/plugin.py"
click node_provider "https://github.com/leiverkus/itinera/blob/main/provider.py"
click node_interactive "https://github.com/leiverkus/itinera/blob/main/gui/point_pick_tool.py"
click node_settings "https://github.com/leiverkus/itinera/blob/main/gui/settings_dialog.py"
click node_raster "https://github.com/leiverkus/itinera/blob/main/core/raster_io.py"
click node_points "https://github.com/leiverkus/itinera/blob/main/algorithms/_points.py"
click node_input_helpers "https://github.com/leiverkus/itinera/tree/main/algorithms"
click node_slope_friction "https://github.com/leiverkus/itinera/blob/main/algorithms/slope_cs_algorithm.py"
click node_lcp "https://github.com/leiverkus/itinera/blob/main/algorithms/lcp_algorithm.py"
click node_accessibility "https://github.com/leiverkus/itinera/blob/main/algorithms/accessibility_algorithm.py"
click node_stochastic "https://github.com/leiverkus/itinera/blob/main/algorithms/stochastic_lcp_algorithm.py"
click node_corridor "https://github.com/leiverkus/itinera/blob/main/algorithms/lcc_algorithm.py"
click node_fete "https://github.com/leiverkus/itinera/blob/main/algorithms/fete_algorithm.py"
click node_rsp "https://github.com/leiverkus/itinera/blob/main/algorithms/rsp_algorithm.py"
click node_circuit "https://github.com/leiverkus/itinera/blob/main/algorithms/circuit_algorithm.py"
click node_multicriteria "https://github.com/leiverkus/itinera/blob/main/algorithms/multicriteria_algorithm.py"
click node_sensitivity "https://github.com/leiverkus/itinera/blob/main/algorithms/sensitivity_algorithm.py"
click node_validation "https://github.com/leiverkus/itinera/blob/main/algorithms/validation_algorithm.py"
click node_dem_tools "https://github.com/leiverkus/itinera/tree/main/algorithms"
click node_cost_functions "https://github.com/leiverkus/itinera/blob/main/core/cost_functions.py"
click node_conductance "https://github.com/leiverkus/itinera/blob/main/core/conductance.py"
click node_lcp_engine "https://github.com/leiverkus/itinera/blob/main/core/lcp.py"
click node_analysis_engines "https://github.com/leiverkus/itinera/tree/main/core"
click node_validation_engine "https://github.com/leiverkus/itinera/blob/main/core/validation.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_plugin,node_provider,node_interactive,node_settings,node_user toneBlue
class node_raster,node_points,node_input_helpers toneAmber
class node_slope_friction,node_lcp,node_accessibility,node_stochastic,node_corridor,node_fete,node_rsp,node_circuit,node_multicriteria toneMint
class node_sensitivity,node_validation,node_dem_tools toneRose
class node_cost_functions,node_conductance,node_lcp_engine,node_analysis_engines,node_validation_engine,node_external_data toneIndigo
```

## Components

### QGIS interface

- [Plugin lifecycle](https://github.com/leiverkus/itinera/blob/main/plugin.py): `plugin.py`
- [Processing provider](https://github.com/leiverkus/itinera/blob/main/provider.py): `provider.py`
- [Two-click LCP](https://github.com/leiverkus/itinera/blob/main/gui/point_pick_tool.py): `gui/point_pick_tool.py`
- [Cost settings](https://github.com/leiverkus/itinera/blob/main/gui/settings_dialog.py): `gui/settings_dialog.py`

### Input preparation

- [Raster grid I/O](https://github.com/leiverkus/itinera/blob/main/core/raster_io.py): `core/raster_io.py`
- [Point mapping](https://github.com/leiverkus/itinera/blob/main/algorithms/_points.py): `algorithms/_points.py`
- [Raster and cost parameters](https://github.com/leiverkus/itinera/tree/main/algorithms): `algorithms`

### Movement analysis

- [Slope and friction surfaces](https://github.com/leiverkus/itinera/blob/main/algorithms/slope_cs_algorithm.py): `algorithms/slope_cs_algorithm.py`
- [Least-cost path](https://github.com/leiverkus/itinera/blob/main/algorithms/lcp_algorithm.py): `algorithms/lcp_algorithm.py`
- [Accessibility catchment](https://github.com/leiverkus/itinera/blob/main/algorithms/accessibility_algorithm.py): `algorithms/accessibility_algorithm.py`
- [Stochastic paths](https://github.com/leiverkus/itinera/blob/main/algorithms/stochastic_lcp_algorithm.py): `algorithms/stochastic_lcp_algorithm.py`
- [Least-cost corridor](https://github.com/leiverkus/itinera/blob/main/algorithms/lcc_algorithm.py): `algorithms/lcc_algorithm.py`
- [FETE movement](https://github.com/leiverkus/itinera/blob/main/algorithms/fete_algorithm.py): `algorithms/fete_algorithm.py`
- [Randomized paths](https://github.com/leiverkus/itinera/blob/main/algorithms/rsp_algorithm.py): `algorithms/rsp_algorithm.py`
- [Circuit connectivity](https://github.com/leiverkus/itinera/blob/main/algorithms/circuit_algorithm.py): `algorithms/circuit_algorithm.py`
- [Composite friction](https://github.com/leiverkus/itinera/blob/main/algorithms/multicriteria_algorithm.py): `algorithms/multicriteria_algorithm.py`

### Assessment tools

- [Sensitivity sweep](https://github.com/leiverkus/itinera/blob/main/algorithms/sensitivity_algorithm.py): `algorithms/sensitivity_algorithm.py`
- [Route validation](https://github.com/leiverkus/itinera/blob/main/algorithms/validation_algorithm.py): `algorithms/validation_algorithm.py`
- [DEM preparation and error](https://github.com/leiverkus/itinera/tree/main/algorithms): `algorithms`

### Numerical engine

- [Directional cost models](https://github.com/leiverkus/itinera/blob/main/core/cost_functions.py): `core/cost_functions.py`
- [Conductance graph](https://github.com/leiverkus/itinera/blob/main/core/conductance.py): `core/conductance.py`
- [Shortest-path solver](https://github.com/leiverkus/itinera/blob/main/core/lcp.py): `core/lcp.py`
- [Movement solvers](https://github.com/leiverkus/itinera/tree/main/core): `core`
- [Validation metrics](https://github.com/leiverkus/itinera/blob/main/core/validation.py): `core/validation.py`

### Other components

- **QGIS user**
- **Project raster and vectors**

## Connections

- QGIS user → Plugin lifecycle: opens plugin (evidence: `plugin.py`)
- Plugin lifecycle → Processing provider: registers provider (evidence: `plugin.py`)
- Plugin lifecycle → Two-click LCP: creates tool (evidence: `plugin.py`)
- Plugin lifecycle → Cost settings: opens settings (evidence: `plugin.py`)
- Processing provider → Slope and friction surfaces: registers algorithms (evidence: `provider.py`)
- Processing provider → Least-cost path: registers algorithms (evidence: `provider.py`)
- Processing provider → Accessibility catchment: registers algorithms (evidence: `provider.py`)
- Processing provider → Stochastic paths: registers algorithms (evidence: `provider.py`)
- Processing provider → Least-cost corridor: registers algorithms (evidence: `provider.py`)
- Processing provider → FETE movement: registers algorithms (evidence: `provider.py`)
- Processing provider → Randomized paths: registers algorithms (evidence: `provider.py`)
- Processing provider → Circuit connectivity: registers algorithms (evidence: `provider.py`)
- Processing provider → Composite friction: registers algorithms (evidence: `provider.py`)
- Processing provider → Sensitivity sweep: registers algorithms (evidence: `provider.py`)
- Processing provider → Route validation: registers algorithms (evidence: `provider.py`)
- Processing provider → DEM preparation and error: registers algorithms (evidence: `provider.py`)
- Project raster and vectors → Raster grid I/O: loads raster (evidence: `core/raster_io.py`)
- Least-cost path → Raster grid I/O: loads and writes (evidence: `algorithms/lcp_algorithm.py`)
- Least-cost path → Point mapping: maps endpoints (evidence: `algorithms/lcp_algorithm.py`)
- Least-cost path → Raster and cost parameters: uses parameters (evidence: `algorithms/lcp_algorithm.py`)
- Least-cost path → Conductance graph: builds graph (evidence: `algorithms/lcp_algorithm.py`)
- Least-cost path → Directional cost models: selects cost model (evidence: `algorithms/lcp_algorithm.py`)
- Least-cost path → Shortest-path solver: solves route (evidence: `algorithms/lcp_algorithm.py`)
- Slope and friction surfaces → Conductance graph: builds graph (evidence: `algorithms/slope_cs_algorithm.py`)
- Slope and friction surfaces → Directional cost models: selects cost model (evidence: `algorithms/slope_cs_algorithm.py`)
- Accessibility catchment → Conductance graph: builds graph (evidence: `algorithms/accessibility_algorithm.py`)
- Accessibility catchment → Movement solvers: computes catchment (evidence: `algorithms/accessibility_algorithm.py`)
- Stochastic paths → Movement solvers: runs simulations (evidence: `algorithms/stochastic_lcp_algorithm.py`)
- Stochastic paths → Directional cost models: selects cost models (evidence: `algorithms/stochastic_lcp_algorithm.py`)
- Least-cost corridor → Conductance graph: builds graph (evidence: `algorithms/lcc_algorithm.py`)
- Least-cost corridor → Movement solvers: computes corridor (evidence: `algorithms/lcc_algorithm.py`)
- FETE movement → Conductance graph: builds graph (evidence: `algorithms/fete_algorithm.py`)
- FETE movement → Movement solvers: computes traversal frequency (evidence: `algorithms/fete_algorithm.py`)
- Randomized paths → Conductance graph: builds graph (evidence: `algorithms/rsp_algorithm.py`)
- Randomized paths → Movement solvers: solves randomized paths (evidence: `algorithms/rsp_algorithm.py`)
- Circuit connectivity → Conductance graph: builds graph (evidence: `algorithms/circuit_algorithm.py`)
- Circuit connectivity → Movement solvers: computes current (evidence: `algorithms/circuit_algorithm.py`)
- Composite friction → Movement solvers: combines rasters (evidence: `algorithms/multicriteria_algorithm.py`)
- Sensitivity sweep → Conductance graph: builds graph (evidence: `algorithms/sensitivity_algorithm.py`)
- Sensitivity sweep → Shortest-path solver: sweeps routes (evidence: `algorithms/sensitivity_algorithm.py`)
- Sensitivity sweep → Validation metrics: measures stability (evidence: `algorithms/sensitivity_algorithm.py`)
- Route validation → Validation metrics: computes metrics (evidence: `algorithms/validation_algorithm.py`)
- DEM preparation and error → Raster grid I/O: reads and writes (evidence: `algorithms/dem_error_algorithm.py`)
- DEM preparation and error → Movement solvers: models DEM error (evidence: `algorithms/dem_error_algorithm.py`)
- Conductance graph → Directional cost models: evaluates edge costs (evidence: `core/conductance.py`)
- Movement solvers → Shortest-path solver: uses path solver (evidence: `core/accessibility.py`)
- Route validation → Point mapping: maps reference line (evidence: `algorithms/validation_algorithm.py`)
