- [x] Split the controller into single_sourcing and dual_sourcing
    - [x] Implement the base-stock in single-sourcing model
    - [x] Implement the CDI and DP in dual-sourcing model
    - [x] Reimplement the interfaces. Separate the policy and environment interface and use .solve/.fit/.predict to find the optimal policy
    - [x] Set up a super class
- [x] Only controller has cost functions
- [x] Align parameters used in multiple documentation
- [x] Unify predict to accept list and tensor
- [x] Allow predict to fill past_orders with 0
- [x] Save and load the controllers
- [x] Documentation for new controllers
- [x] Documentation for utilities
- [x] Improve unit tests
- [x] Improve doc tests
- [x] Improve code reduntancy
- [x] Coverage reports: 100% files, 87% lines
- [x] Test CUDA compatibility and performance
- [x] Produce Docker image 
- [x] Produce Streamlit app with Docker
- [x] Streamlit xuda
- [x] Logging
- [x] Logs
- [x] Remove exceptions handling for CUDA compatibility
- [ ] Streamlit app
- [ ] Documentation refinements
- [ ] Type annotation: check again some methods seem to have no type and docs.
- [ ] Style check and mypy check: black, isort, flake8, mypy
- [ ] CI