Program Listing for File README.md

Return to documentation for file (examples/README.md)

# diffeq Examples

This directory contains comprehensive examples demonstrating how to use the diffeq library for solving differential equations.

## Example Programs

### Core Integration Examples

- **`working_integrators_demo.cpp`** - Demonstrates all working ODE integrators (RK4, RK23, RK45, BDF, LSODA)
- **`rk4_integrator_usage.cpp`** - Basic RK4 integrator usage with various ODE systems
- **`advanced_integrators_usage.cpp`** - Advanced integrator features and configurations
- **`state_concept_usage.cpp`** - Shows how to use different state types (vectors, arrays, custom types)
- **`std_async_integration_demo.cpp`** - Direct use of C++ standard library async facilities without unnecessary abstractions
- **`coroutine_integration_demo.cpp`** - C++20 coroutines integration for fine-grained execution control and cooperative multitasking
- **`timeout_integration_demo.cpp`** - Timeout-protected integration for robust applications
- **`seamless_parallel_timeout_demo.cpp`** - Seamless integration of timeout + async + parallel execution

### Parallelism Examples

- **`parallelism_usage_demo.cpp`** - Comprehensive parallelism features including:
  - Quick start parallel interface
  - Robotics control systems with real-time parallelism
  - Stochastic process research with GPU-accelerated Monte Carlo
  - Multi-hardware target benchmarking
- **`standard_parallelism_demo.cpp`** - Standard library parallelism integration:
  - C++17/20 std::execution policies
  - OpenMP parallel loops
  - Intel TBB integration
  - Task-based async dispatchers
- **`simple_standard_parallelism.cpp`** - Simplified parallel usage patterns
- **`standard_parallelism_demo.cpp`** - Advanced standard parallelism features
- **`simplified_parallel_usage.cpp`** - Easy-to-use parallel interfaces
- **`test_advanced_parallelism.cpp`** - Testing advanced parallelism features

### Advanced Features

- **`interface_usage_demo.cpp`** - Integration interface examples:
  - Financial portfolio modeling with signal processing
  - Robotics control with real-time feedback
  - Scientific simulations with parameter updates
- **`sde_usage_demo.cpp`** - Stochastic Differential Equation examples:
  - Black-Scholes financial models
  - Heston stochastic volatility
  - Noisy oscillator control systems
  - Stochastic Lotka-Volterra ecosystem models
- **`coroutine_integration_demo.cpp`** - C++20 Coroutines integration:
  - Fine-grained execution control with pause/resume
  - Cooperative multitasking for multiple integrations
  - Zero-overhead state preservation between yields
  - Progress monitoring with minimal overhead
  - Interruptible long-running computations
- **`advanced_gpu_async_demo.cpp`** - GPU acceleration with async processing
- **`realtime_signal_processing.cpp`** - Real-time signal processing integration
- **`composable_facilities_demo.cpp`** 🎯 **NEW: Solves Combinatorial Explosion** - Composable architecture demonstration:
  - High cohesion, low coupling design principles
  - Independent facilities: Timeout, Parallel, Async, Signals, Output
  - Flexible composition using decorator pattern
  - Order-independent facility stacking
  - Linear scaling (N classes for N facilities, not 2^N)
  - Extensibility without modifying existing code
  - Real-world usage scenarios and performance analysis

### Testing and Validation

- **`quick_test.cpp`** - Quick validation tests
- **`test_dop853.cpp`** - DOP853 integrator testing
- **`test_rk4_only.cpp`** - RK4 integrator testing
- **`sde_demo.cpp`** - Basic SDE demonstration

## Building and Running Examples

### Prerequisites

- C++17 or later compiler
- xmake build system
- Optional: OpenMP, Intel TBB, CUDA for advanced parallelism examples

### Building

```bash
# Using xmake
xmake
```

### Running Examples

```bash
# Run a specific example
./examples/working_integrators_demo

# Run parallelism examples
./examples/parallelism_usage_demo
./examples/standard_parallelism_demo

# Run SDE examples
./examples/sde_usage_demo

# Run interface examples
./examples/interface_usage_demo
```

## Example Categories

### 1. Basic Usage
Start with these examples to understand the fundamentals:
- `working_integrators_demo.cpp`
- `rk4_integrator_usage.cpp`
- `state_concept_usage.cpp`

### 2. Parallelism
For performance-critical applications:
- `parallelism_usage_demo.cpp` - Full-featured parallelism
- `standard_parallelism_demo.cpp` - Standard library integration
- `simple_standard_parallelism.cpp` - Easy parallel usage

### 3. Advanced Features
For complex applications:
- `interface_usage_demo.cpp` - Signal processing and real-time integration
- `sde_usage_demo.cpp` - Stochastic differential equations
- `advanced_gpu_async_demo.cpp` - GPU acceleration

### 4. Modern C++ Features
- **C++20 Coroutines**: Fine-grained control and cooperative multitasking in `coroutine_integration_demo.cpp`
- **Standard Library Async**: Direct use of std::async without abstractions in `std_async_integration_demo.cpp`
- **Parallel Execution**: Hardware-optimized parallel processing in `parallelism_usage_demo.cpp`

### 5. Domain-Specific Examples
- **Finance**: Black-Scholes, Heston models in `sde_usage_demo.cpp`
- **Robotics**: Control systems in `parallelism_usage_demo.cpp`
- **Scientific**: Chemical reactions, ecosystem models in `sde_usage_demo.cpp`

## Key Features Demonstrated

### Integration Methods
- **ODE Solvers**: RK4, RK23, RK45, BDF, LSODA, DOP853
- **SDE Solvers**: Euler-Maruyama, Milstein, SRA1, SOSRA, SRIW1, SOSRI
- **Adaptive Methods**: Automatic step size control
- **Stiff Systems**: BDF and LSODA for stiff problems

### Modern C++ Features
- **C++20 Coroutines**:
  - Pausable/resumable integration with `co_yield`
  - Fine-grained CPU control for real-time systems
  - Zero-overhead state preservation
  - Cooperative multitasking between multiple integrations
  - Progress monitoring without blocking the main thread

### Parallelism
- **CPU Parallelism**: std::execution, OpenMP, Intel TBB
- **GPU Acceleration**: CUDA, Thrust integration
- **Async Processing**: Task-based parallel execution
- **Real-time Control**: Low-latency parallel integration

### Advanced Features
- **Signal Processing**: Real-time event handling
- **Parameter Sweeps**: Parallel parameter studies
- **Multi-physics**: Coupled system integration
- **Hardware Optimization**: Automatic backend selection
- **Timeout Protection**: Prevents hanging integrations with configurable timeouts
- **Progress Monitoring**: Real-time integration progress tracking and cancellation
- **Seamless Parallelization**: Automatic hardware utilization without configuration
- **Execution Strategy Selection**: Auto-chooses optimal approach based on problem and hardware

## Best Practices

1. **Start Simple**: Begin with `working_integrators_demo.cpp` to understand basic usage
2. **Choose the Right Integrator**: Use RK45 for general problems, BDF for stiff systems
3. **Leverage Auto-Optimization**: Use `diffeq::integrate_auto()` for automatic hardware utilization
4. **Handle Real-time Requirements**: Use interface examples for systems with external signals
5. **Use Timeout Protection**: Add timeout protection for production applications
6. **Scale Seamlessly**: From single integration to batch processing with `seamless_parallel_timeout_demo.cpp`
7. **Compose Facilities**: Use the composable architecture for flexible combinations of capabilities
   - Start with `make_builder(base_integrator)`
   - Add only the facilities you need: `.with_timeout()`, `.with_parallel()`, etc.
   - Avoid combinatorial explosion - compose instead of inheriting
   - Order doesn't matter - decorators work in any sequence
8. **Validate Results**: Compare with analytical solutions when available

## Troubleshooting

### Common Issues
- **Compilation Errors**: Ensure C++17 support and required libraries
- **Performance Issues**: Check parallel backend availability
- **Accuracy Problems**: Verify integrator choice and tolerances
- **Memory Issues**: Use appropriate state types and batch sizes
- **Hanging Integration**: Use timeout protection for robust applications

### Getting Help
- Check the main library documentation
- Review the test suite for usage patterns
- Examine the source code for implementation details

## Contributing

When adding new examples:
1. Follow the existing naming convention
2. Include comprehensive comments
3. Demonstrate realistic use cases
4. Add to this README if appropriate
5. Ensure the example compiles and runs correctly