tensorlogic-adapters
Adapter utilities for the Tensorlogic ecosystem: symbol tables, axis metadata, domain management, and schema validation.
The tensorlogic-adapters crate provides the bridge between logical expressions and tensor execution by managing:
- Symbol tables (predicates, domains, variables)
- Axis metadata (variable-to-axis mappings)
- Domain information (cardinalities, elements, hierarchies)
- Domain masks (filtering, constraints)
- Parametric types (generic domains like List, Option)
- Predicate composition (define predicates in terms of others)
- Rich metadata (provenance tracking, documentation, tagging)
- Schema validation (completeness, consistency, semantic checks)
- Incremental validation (efficient revalidation with change tracking)
- Query planning (optimized predicate lookups with cost-based strategies)
- Schema evolution (breaking change detection, migration planning)
Features
Core Symbol Management
- SymbolTable: Central registry for domains, predicates, and variables
- DomainInfo: Domain definitions with cardinality, elements, and metadata
- PredicateInfo: Predicate metadata including arity and domain types
- AxisMetadata: Variable-to-axis mappings for einsum notation
Product Domains (NEW)
- ProductDomain: Cartesian product types for cross-domain reasoning
- Binary/Ternary products: Convenient constructors for common cases
- Product cardinality: Automatic computation from components
- Projection and slicing: Extract components from products
Domain Hierarchy
- Subtype relationships: Define type hierarchies (e.g.,
Person <: Agent) - Transitive checking: Automatic subtype resolution through inheritance chains
- Cycle detection: Prevent circular type definitions
- Least common supertype: Find common ancestors in type hierarchies
Predicate Constraints
- Logical properties: Symmetric, transitive, reflexive, antisymmetric, functional
- Value ranges: Min/max constraints with inclusive/exclusive bounds
- Functional dependencies: Define relationships between predicate arguments
Parametric Types
- Generic domains: List, Option, Pair<A, B>, Map<K, V>
- Type parameters: Support for nested parametric types
- Type bounds: Constrain type parameters (e.g.,
T: Comparable) - Type substitution: Instantiate generic types with concrete arguments
Predicate Composition
- Composite predicates: Define predicates in terms of other predicates
- Macro expansion: Automatic expansion with parameter substitution
- Predicate templates: Create parameterized predicate families
- Composition operators: AND, OR, NOT for building complex predicates
Rich Metadata System
- Provenance tracking: Who created/modified, when, from where
- Version history: Track changes over time with changelog
- Documentation: Long-form docs with examples and usage notes
- Tagging system: Categorize and filter symbols with tags
- Custom attributes: Extensible key-value metadata
Schema Validation
- Completeness checks: Ensure all referenced domains exist
- Consistency validation: Check for duplicates and well-formedness
- Semantic validation: Detect unused domains, suggest missing predicates
- Validation reports: Detailed reports with errors, warnings, and hints
Computed Domains (NEW)
- ComputedDomain: Virtual domains derived from operations
- DomainComputation: Filter, union, intersection, difference, product operations
- Lazy evaluation: Compute domains on-demand
- Cardinality bounds: Automatic bound computation
- ComputedDomainRegistry: Manage computed domain dependencies
Lazy Loading (NEW)
- LazySymbolTable: On-demand loading for huge schemas
- SchemaLoader: Pluggable loader trait (file, database, remote)
- FileSchemaLoader: Built-in file-based loader
- Load strategies: Eager, OnDemand, Predictive, Batched
- Caching: LRU cache with statistics
Import/Export
- JSON support: Serialize/deserialize symbol tables to JSON
- YAML support: Human-readable schema definitions
Performance Optimizations
- Signature matcher: O(1) predicate lookups by arity/signature
- String interning: Reduce memory usage of repeated strings
- Lookup caching: LRU cache for frequently accessed data
- Compact representation: Binary serialization with compression
Schema Analysis
- Statistics: Comprehensive metrics about schema structure
- Complexity scoring: Automated complexity analysis
- Recommendations: Detect issues and suggest improvements
- Usage patterns: Track domain usage frequency
Incremental Validation (NEW)
- ChangeTracker: Record schema modifications for efficient revalidation
- DependencyGraph: Track relationships between components
- IncrementalValidator: Validate only affected components (10-100x speedup)
- ValidationCache: Cache validation results for unchanged components
- Batch operations: Group changes for atomic validation
Query Planning (NEW)
- QueryPlanner: Cost-based query optimization for predicate lookups
- IndexStrategy: Multiple index types (hash, range, composite, inverted)
- PredicateQuery: Rich query language (by name, arity, signature, pattern)
- QueryStatistics: Track access patterns and selectivity
- Plan caching: Reuse execution plans for repeated queries
Schema Evolution (NEW)
- EvolutionAnalyzer: Detect breaking changes between schema versions
- BreakingChange: Categorize changes by severity and impact
- MigrationPlan: Generate executable migration steps
- CompatibilityReport: Detailed backward/forward compatibility analysis
- VersionBump: Semantic versioning guidance (major/minor/patch)
CLI Tools
- schema_validate: Validate schemas with detailed reports
- schema_migrate: Convert, merge, diff schemas
Schema Builder
- Fluent API: Build schemas programmatically with method chaining
- Type safety: Validation during construction
- Convenience: Simplified schema creation
Installation
Add to your Cargo.toml:
[]
= "0.1.0-alpha.2"
Quick Start
Basic Symbol Table
use ;
// Create a symbol table
let mut table = new;
// Add a domain
table.add_domain?;
// Add a predicate
let knows = new;
table.add_predicate?;
// Bind a variable
table.bind_variable?;
Using Schema Builder (Recommended)
use SchemaBuilder;
// Build a schema with fluent API
let table = new
.domain
.domain
.predicate
.predicate
.variable
.build?;
Domain Hierarchy
use DomainHierarchy;
let mut hierarchy = new;
// Define a type hierarchy
hierarchy.add_subtype;
hierarchy.add_subtype;
hierarchy.add_subtype;
// Check relationships
assert!; // Transitive
assert!;
// Find common supertype
let common = hierarchy.least_common_supertype;
assert_eq!;
Parametric Types
use ;
// Create List<Person>
let list_person = list;
println!; // "List<Person>"
// Create Map<String, Int>
let map_type = map;
println!; // "Map<String, Int>"
// Nested types: List<Option<Person>>
let nested = list;
println!; // "List<Option<Person>>"
Predicate Composition
use ;
// Define a composite predicate
let friend = new;
// Register in a registry
let mut registry = new;
registry.register?;
// Expand with concrete arguments
let expanded = registry.expand?;
Rich Metadata
use ;
// Create domain with rich metadata
let mut meta = new;
// Add provenance
meta.provenance = Some;
// Add tags
meta.add_tag;
meta.add_tag;
// Add custom attributes
meta.set_attribute;
// Add documentation
let mut doc = new;
doc.add_note;
meta.documentation = Some;
// Attach to domain
let domain = new
.with_metadata;
Schema Validation
use ;
let mut table = new;
// ... populate table ...
// Validate schema
let validator = new;
let report = validator.validate?;
// Check for issues
if !report.errors.is_empty
if !report.warnings.is_empty
JSON/YAML Import/Export
use SymbolTable;
// Export to JSON
let json = table.to_json?;
write?;
// Import from JSON
let json = read_to_string?;
let table = from_json?;
// Export to YAML
let yaml = table.to_yaml?;
write?;
// Import from YAML
let yaml = read_to_string?;
let table = from_yaml?;
Integration with Compiler
The adapters integrate seamlessly with tensorlogic-compiler:
use SymbolTable;
use CompilerContext;
use symbol_integration;
let mut table = new;
// ... define schema ...
// Sync with compiler context
let mut ctx = new;
sync_context_with_symbol_table?;
// Build signature registry for type checking
let registry = build_signature_registry;
Architecture
Module Structure
tensorlogic-adapters/
├── axis.rs # Axis metadata for einsum notation
├── compact.rs # Compact schema representation
├── compiler_integration.rs # Export/import for compiler
├── composition.rs # Predicate composition system
├── constraint.rs # Predicate constraints and properties
├── diff.rs # Schema diff and compatibility
├── domain.rs # Domain information and management
├── error.rs # Error types
├── hierarchy.rs # Domain hierarchy and subtyping
├── mask.rs # Domain masks for filtering
├── metadata.rs # Rich metadata with provenance/tags
├── parametric.rs # Parametric types (List<T>, etc.)
├── performance.rs # String interning and caching
├── predicate.rs # Predicate metadata
├── schema_analysis.rs # Schema statistics and analysis
├── signature_matcher.rs # Fast predicate lookups
├── symbol_table.rs # Central symbol table
├── validation.rs # Schema validation
└── bin/
├── schema_validate.rs # CLI validation tool
└── schema_migrate.rs # CLI migration tool
Design Principles
- Separation of concerns: Each module has a single, well-defined responsibility
- Composability: Features can be used independently or combined
- Type safety: Rich type system with validation at construction time
- Extensibility: Metadata and attributes allow domain-specific extensions
- Performance: Efficient data structures with minimal overhead
Use Cases
Knowledge Graph Integration
Use domain hierarchies and predicate constraints to model ontologies and validate RDF*/SHACL schemas.
Machine Learning Pipelines
Parametric types and composition enable defining complex feature transformations and model architectures.
Symbolic Reasoning
Rich metadata and provenance tracking support explainable AI and audit trails.
Type-Safe DSLs
Schema validation ensures logical expressions are well-typed before compilation.
CLI Tools
The crate includes two command-line tools:
Schema Validator
Validate, analyze, and get statistics for schema files:
# Basic validation
# With analysis and statistics
# Validate JSON schema
Schema Migration Tool
Convert, merge, diff, and check compatibility:
# Convert JSON to YAML
# Merge multiple schemas
# Show diff between versions
# Check compatibility
Incremental Validation Example
use ;
let mut table = new;
let mut tracker = new;
// Add domain and track change
table.add_domain?;
tracker.record_domain_addition;
// Incremental validation (only validates changed components)
let mut validator = new;
let report = validator.validate_incremental?;
println!;
Query Planning Example
use ;
let mut planner = new;
// Query with automatic optimization
let query = by_signature;
let results = planner.execute?;
// View statistics
println!;
Schema Evolution Example
use EvolutionAnalyzer;
let analyzer = new;
let report = analyzer.analyze?;
if report.has_breaking_changes
println!;
println!;
Testing
Run the test suite:
Current Test Stats: 447 tests (all passing, zero warnings) ⬆️ +18 new tests
Lines of Code: ~23,000 (production code)
Examples: 13 complete examples in examples/
Benchmarks: 6 comprehensive benchmark suites
Recent Enhancements v0.1.0-alpha.2:
- ✨ Semantic Subtyping - Practical SMT-based implication checking (+8 tests)
- ✨ Database Property Tests - 10 comprehensive proptest validations
- ✨ Refinement Benchmarks - 6 benchmark suites measuring type checking performance
- ✨ Modular Database - Refactored for maintainability (<2000 lines/file)
- Incremental validation with change tracking (10-100x speedup)
- Cost-based query planning and optimization
- Schema evolution with breaking change detection
- Product domains, computed domains, lazy loading
- CLI integration tests for schema tools
Performance Considerations
- IndexMap used for domains/predicates to preserve insertion order while maintaining O(1) lookup
- HashSet used for tags and hierarchy tracking for O(1) membership tests
- Validation performed eagerly at construction time to catch errors early
- Serialization uses efficient binary formats (JSON/YAML) with serde
Future Enhancements
See TODO.md for the complete roadmap. Upcoming features include:
- Computed domains: Domains derived from operations
- Enhanced composition: Predicate calculus operators
- Property-based testing: QuickCheck-style validation
- Performance optimization: Caching, lazy evaluation, memory pooling
- CLI tools: Schema validation, migration, and diff tools
Contributing
Contributions are welcome! See CONTRIBUTING.md for guidelines.
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.
References
- Tensorlogic Project: https://github.com/cool-japan/tensorlogic
- SciRS2 (Scientific Computing): https://github.com/cool-japan/scirs
- OxiRS (RDF/SPARQL): https://github.com/cool-japan/oxirs
- Tensor Logic Paper: https://arxiv.org/abs/2510.12269
Status: 🎉 Production Ready (v0.1.0-alpha.2) Last Updated: 2025-12-16 (Alpha.2 Release) Tests: 447/447 passing (100%) ⬆️ +18 new tests (8 subtyping + 10 database property tests) Lines of Code: ~23,000 (production code) Examples: 13 comprehensive examples Benchmarks: 6 comprehensive benchmark suites (250+ benchmark functions) Completion: ~99% (Advanced production features) CLI Tools: 2 production-ready binaries with integration tests Code Quality: Zero warnings, zero clippy issues New in 0.1.0-alpha.2:
- ✨ Semantic Subtyping - Practical SMT-based subtyping check for refinement types (+8 tests)
- ✨ Database Property Tests - 10 comprehensive proptest validations for database operations
- ✨ Refinement Benchmarks - 6 benchmark groups measuring type checking, subtyping, and scaling
- ✨ Modular Database - Refactored database.rs for better maintainability (<2000 lines/file)
- ✨ Incremental Validation - 10-100x faster revalidation
- ✨ Query Planner - Cost-based query optimization
- ✨ Schema Evolution - Breaking change detection & migration planning Part of: TensorLogic Ecosystem