odis 2026.3.0

Formal Concept Analysis algorithms and data structures
Documentation

odis — Formal Concept Analysis in Rust

odis is a Rust library for Formal Concept Analysis. It works on formal contexts (objects × attributes incidence tables) and currently provides concept enumeration, implication bases, lattice drawing, and attribute exploration.

Installation

[dependencies]
odis = "2026.3.0"

Quick start

use odis::{FormalContext, algorithms::NextClosure};
use odis::traits::ConceptEnumerator;

// Parse a Burmeister (.cxt) file
let bytes = std::fs::read("context.cxt").unwrap();
let ctx = FormalContext::<String>::from(&bytes).unwrap();

// Enumerate all formal concepts
for (extent, intent) in NextClosure.enumerate_concepts(&ctx) {
    println!("extent: {:?}  intent: {:?}", extent, intent);
}

// Or use the built-in shortcut (defaults to NextClosure)
let concepts: Vec<_> = ctx.concepts().collect();

Algorithms

Concept enumeration

ConceptEnumerator is implemented by:

Struct Algorithm
NextClosure Lectic-order enumeration
Fcbo Fast Close-by-One

Implication basis

use odis::algorithms::CanonicalBasis;
use odis::traits::ImplicationEngine;

let basis = CanonicalBasis.compute_named_basis(&ctx);
for (premise, conclusion) in &basis {
    println!("{:?}{:?}", premise, conclusion);
}

Lattice drawing

DrawingAlgorithm is implemented by:

Struct Algorithm
DimDraw { timeout_ms } Realizer-based drawing algorithm; timeout_ms = 0 for unbounded
Sugiyama Hierarchical layout via rust-sugiyama
use odis::algorithms::{DimDraw, NextClosure};
use odis::traits::{ConceptEnumerator, DrawingAlgorithm};

let lattice = ctx.concept_lattice().unwrap();
let drawing = DimDraw { timeout_ms: 500 }.draw(&lattice).unwrap();

Iceberg concept lattices

use odis::algorithms::Titanic;
use odis::traits::IcebergConceptEnumerator;

// Concepts whose extent has at least 3 objects
let iceberg = Titanic.enumerate_named_concepts(&ctx, 3);

Attribute exploration

ExplorationMachine drives interactive attribute exploration over a growing context. The state machine separates exploration logic from I/O.

Formal context format

Contexts are parsed from the Burmeister .cxt format:

B

2
2

bird
fish
flies
lives_in_water
X.
.X

API documentation

cargo doc -p odis --no-deps --open

License

AGPL-3.0-only