Contributing
We welcome contributions to CausalBoundingEngine!
Quick Start
Fork & Clone
Fork the repository on GitHub and clone your fork:
git clone https://github.com/tmaringgele/CausalBoundingEngine.git cd CausalBoundingEngine
Install for Development
pip install -e . pip install pytest # For running tests
Make Your Changes
Create a new branch:
git checkout -b feature-nameMake your changes
Add tests if needed
Run tests:
pytest
Submit Pull Request
Push your branch:
git push origin feature-nameOpen a Pull Request on GitHub
Describe your changes clearly
That’s it! We’ll review your PR and provide feedback.
Development Guidelines
- Code Style
Follow existing code patterns
Add docstrings to new functions/classes
Keep changes focused and minimal
- Testing
Add tests for new functionality
Ensure existing tests pass:
pytestTest with different scenarios when possible
- Documentation
Update relevant documentation
Add examples for new features
Update algorithm references if adding new methods
Types of Contributions
- Bug Fixes
Report bugs via GitHub issues
Include minimal reproduction example
Fix and submit PR with test case
- New Algorithms
Inherit from
Algorithmbase classImplement
_compute_ATEand/or_compute_PNSAdd to appropriate scenario’s
AVAILABLE_ALGORITHMSInclude proper citations and references
- New Scenarios
Inherit from
Scenariobase classDefine
AVAILABLE_ALGORITHMSmappingAdd to scenarios module
Update documentation
- Documentation
Fix typos, improve clarity
Add examples and use cases
Update references and citations
Questions?
Open a GitHub issue for bugs or feature requests
Check existing issues before creating new ones
Be clear and provide examples when possible
Thanks for contributing! 🎉
Areas needing optimization & feature ideas:
Killing dependencies: Get rid of dependencies (especially R/Java) or at least make everything use the same solver.
Custom DAG: Causaloptim, Zaffalonbounds and Autobound are able to use a custom DAG as input, but this is not yet implemented in the Python interface.
Mediation: Causaloptim, Zaffalonbounds and Autobound may be applicable to mediation scenarios.
Cool New Algorithms: Implement new algorithms that are not yet supported.
More Symbolic bounds: Low hanging fruit: implement more symbolic bounds (like tianpearl or manski) for other scenarios.
Extract symbols from causaloptim: Currently, causaloptim does not expose the symbols used in the bounds (but rather directly evaluates them), so it is not possible to use them in the Python interface. This would be a great addition.
Getting Help
Where to Get Help
GitHub Issues: Bug reports and feature requests
Documentation: Check existing docs first
Code Review: Ask for feedback during PR process
E-Mail: For a mortal emergency, you can contact me via email at tobias.maringgele@tum.de
Communication Guidelines
Be respectful and constructive
Provide minimal reproducible examples for bugs
Search existing issues before creating new ones
Use descriptive titles and clear descriptions
Follow up on your contributions
Recognition
Contributors are recognized in:
AUTHORS.md: All contributors listed
CHANGELOG: Major contributions noted in releases
Documentation: Algorithm implementers credited in docs
Citations: Academic contributors cited in papers
Thank you for contributing to CausalBoundingEngine! Your efforts help make causal inference more accessible to researchers and practitioners worldwide.