Thank you for your interest in contributing to the GEO-INFER framework! This document provides guidelines for contributing to the project.
- Code of Conduct
- Getting Started
- Development Setup
- Making Contributions
- Coding Standards
- Documentation Standards
- Testing Requirements
- Pull Request Process
We are committed to providing a welcoming and inclusive environment. Please be respectful in all interactions.
- Python 3.11 or higher
- Git
- uv (recommended) or pip for package management
GEO-INFER/
├── GEO-INFER-ACT/ # Active Inference module
├── GEO-INFER-AGENT/ # Autonomous agents module
├── GEO-INFER-SPACE/ # Spatial methods module
├── GEO-INFER-TIME/ # Temporal analysis module
├── ... (44 total modules)
├── README.md # Main documentation
├── AGENTS.md # Agent architecture documentation
└── CONTRIBUTING.md # This file
git clone https://github.com/ActiveInferenceInstitute/GEO-INFER.git
cd GEO-INFER# Using uv (recommended)
uv venv
source .venv/bin/activate
# Or using standard Python
python -m venv .venv
source .venv/bin/activate# Install a specific module in development mode
uv pip install -e ./GEO-INFER-ACT
# Or install multiple modules
uv pip install -e ./GEO-INFER-ACT -e ./GEO-INFER-AGENT -e ./GEO-INFER-SPACE# Run tests for a specific module
pytest GEO-INFER-ACT/tests/
# Run all tests
pytest- Bug Fixes: Fix issues in existing code
- New Features: Add new functionality to modules
- Documentation: Improve or add documentation
- Tests: Add or improve test coverage
- Examples: Add usage examples and tutorials
- Fork the repository
- Create a branch for your feature/fix:
git checkout -b feature/my-feature - Make changes following our coding standards
- Add tests for new functionality
- Update documentation as needed
- Commit with clear messages:
git commit -m "Add feature X to module Y" - Push to your fork:
git push origin feature/my-feature - Create a Pull Request
- Follow PEP 8 style guidelines
- Use type hints for function signatures
- Maximum line length: 88 characters (Black default)
- Use docstrings for all public functions and classes
from typing import List, Optional
import numpy as np
def process_spatial_data(
data: np.ndarray,
resolution: int = 9,
method: str = "h3"
) -> List[str]:
"""
Process spatial data and return cell identifiers.
Args:
data: Input spatial coordinates as numpy array
resolution: H3 resolution level (0-15)
method: Indexing method to use
Returns:
List of cell identifiers
Raises:
ValueError: If resolution is out of valid range
"""
if not 0 <= resolution <= 15:
raise ValueError(f"Resolution must be 0-15, got {resolution}")
# Implementation here
return []- Modules:
geo_infer_<name>(lowercase with underscores) - Classes:
PascalCase - Functions:
snake_case - Constants:
UPPER_SNAKE_CASE
Each module should have a README.md with:
- YAML Frontmatter: Title, description, status, dependencies
- Overview: Brief description of the module
- Installation: How to install the module
- Usage: Basic usage examples
- API Reference: Key classes and functions
- Contributing: Link to this document
Each module should have an AGENTS.md describing:
- Agent Capabilities: What agents can do with this module
- Implementation Status: ✅ Implemented vs 🔮 Planned features
- Integration Patterns: How to use with other modules
- Code Examples: Working code snippets
Use Google-style docstrings:
def function_name(param1: str, param2: int) -> bool:
"""Brief description of function.
Longer description if needed.
Args:
param1: Description of param1
param2: Description of param2
Returns:
Description of return value
Raises:
ValueError: When something is wrong
Example:
>>> function_name("test", 42)
True
"""GEO-INFER-<MODULE>/
├── tests/
│ ├── __init__.py
│ ├── test_core.py
│ ├── test_models.py
│ └── conftest.py # Shared fixtures
import pytest
from geo_infer_act import ActiveInferenceModel
class TestActiveInferenceModel:
"""Tests for ActiveInferenceModel class."""
def test_initialization(self):
"""Test model initialization with default parameters."""
model = ActiveInferenceModel()
assert model is not None
def test_perceive_updates_beliefs(self):
"""Test that perceive() updates internal beliefs."""
model = ActiveInferenceModel()
initial_beliefs = model.get_beliefs()
model.perceive(observation=[0.5, 0.5])
updated_beliefs = model.get_beliefs()
assert not np.array_equal(initial_beliefs, updated_beliefs)- Aim for 80%+ test coverage
- All public APIs must have tests
- Include both unit and integration tests
- Ensure all tests pass:
uv run python -m pytest - Check code style:
ruff check .andblack --check . - Check types:
mypy GEO-INFER-MODULE/src/ - Update documentation if needed
- Add yourself to CONTRIBUTORS.md (if applicable)
## Description
Brief description of changes
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Documentation update
- [ ] Test improvement
## Testing
Describe how you tested the changes
## Checklist
- [ ] Tests pass locally
- [ ] Documentation updated
- [ ] Code follows style guidelines- Maintainers will review within 1-2 weeks
- Address any feedback in additional commits
- Once approved, a maintainer will merge
Some modules have additional contribution guidelines:
- GEO-INFER-ACT: See
GEO-INFER-ACT/docs/CONTRIBUTING_ACT.md - GEO-INFER-SPACE: See
GEO-INFER-SPACE/docs/CONTRIBUTING_SPACE.md - GEO-INFER-PEP: See
GEO-INFER-PEP/docs/CONTRIBUTING_PEP.md
The following modules were renamed from uppercase to lowercase package naming in Feb 2026:
- GEO-INFER-FOREST →
geo_infer_forest - GEO-INFER-MARINE →
geo_infer_marine - GEO-INFER-ENERGY →
geo_infer_energy - GEO-INFER-WATER →
geo_infer_water
Ensure all imports use the new lowercase package names.
- Issues: Open a GitHub issue for bugs or feature requests
- Discussions: Use GitHub Discussions for questions
- Community: Join the Active Inference Institute community
By contributing, you agree that your contributions will be licensed under the CC BY-NC-SA 4.0 license.
Thank you for contributing to GEO-INFER!
Last Updated: 2026-02-24