Commit 0016bff
### **User description**
## Summary
- Add comprehensive test infrastructure for Python batch API validation
- Establish performance benchmarking framework for <5% overhead
requirement
- Add SoA memory layout validation tests
- Extend golden record system for batch operations
## Test Infrastructure Added
### Core Test Suite (`test/python/test_batch_api.py`)
- SoA memory layout validation with zero-copy access verification
- Performance measurement framework for overhead calculation
- Golden record framework for batch vs individual result comparison
- OpenMP threading safety preparation
- Scalability testing infrastructure (up to 1M particles)
### Performance Benchmarking (`test/python/performance_benchmark.py`)
- High-precision timing utilities for <5% overhead validation
- Particle batch initialization benchmarking
- Memory access pattern performance analysis
- Scalability profiling across particle counts
- Automated performance report generation
### Golden Record Extension
- New `batch_operations` test case for 1000 particle validation
- CMake integration for automated golden record comparison
- Batch API vs Fortran baseline validation framework
### CMake Integration
- `test_batch_api`: Core API validation tests
- `test_batch_api_performance`: Performance and overhead tests (slow)
- `test_batch_api_scalability`: Large-scale validation tests (slow)
- `golden_record_batch_api`: Batch vs baseline comparison
## Testing Requirements Addressed
✅ **SoA Memory Layout**: Tests verify zero-copy access to `zstart(5,
ntestpart)` arrays
✅ **Performance Validation**: Framework for <5% overhead requirement
validation
✅ **Golden Records**: Batch operations must match individual processing
results
✅ **Scalability**: Testing framework supports up to 1M particles
✅ **Thread Safety**: OpenMP compatibility preparation and validation
## Next Steps
This test infrastructure enables safe implementation of the Python batch
API with:
- Automated validation of critical performance requirements
- Comprehensive regression testing against Fortran baseline
- Scalability validation for HPC use cases
🤖 Generated with [Claude Code](https://claude.ai/code)
___
### **PR Type**
Enhancement, Tests, Documentation
___
### **Description**
• **Complete Python batch API implementation** with zero-copy SoA memory
access and <5% performance overhead
• **Comprehensive test infrastructure** including performance
benchmarking, golden record validation, and scalability testing up to 1M
particles
• **Scientific computing integration** with samplers for surface/volume
particle initialization and streaming utilities for large-scale
processing
• **Extensive documentation** including API reference, user guide, and
practical examples for HPC workflows
• **Backend architecture** with f90wrap integration providing direct
access to existing Fortran implementation
• **Memory-efficient processing** with `ParticleBatchStream` for
constant memory usage and HDF5-based large dataset handling
• **Performance validation framework** with automated benchmarking and
overhead measurement capabilities
• **Golden record system extension** for batch operations validation
against Fortran baseline
___
### Diagram Walkthrough
```mermaid
flowchart LR
A["Python API Entry Point"] --> B["ParticleBatch Class"]
B --> C["Zero-Copy SoA Arrays"]
C --> D["Fortran Backend"]
D --> E["OpenMP Execution"]
B --> F["Samplers Module"]
F --> G["Surface/Volume Sampling"]
E --> H["BatchResults"]
H --> I["Scientific Analysis"]
J["Test Infrastructure"] --> K["Performance Benchmarks"]
J --> L["Golden Record Validation"]
J --> M["Scalability Tests"]
N["Streaming Utils"] --> O["Large-Scale Processing"]
O --> P["HDF5 Export"]
```
<details> <summary><h3> File Walkthrough</h3></summary>
<table><thead><tr><th></th><th align="left">Relevant
files</th></tr></thead><tbody><tr><td><strong>Enhancement</strong></td><td><details><summary>16
files</summary><table>
<tr>
<td>
<details>
<summary><strong>scientific_analysis.py</strong><dd><code>Add
comprehensive scientific analysis example for physics
research</code></dd></summary>
<hr>
python/examples/scientific_analysis.py
• New comprehensive scientific analysis example demonstrating
<br>physics-focused capabilities<br> • Implements orbit classification
<br>analysis (trapped vs passing particles)<br> • Adds confinement
analysis by <br>flux surface and statistical analysis of particle
behavior<br> • Includes <br>parameter sweep analysis and physics-focused
visualization with <br>matplotlib
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-7382489f08069c8208ed6bc331e8e02b200c25ffa1df29f0096be040a6273fc0">+547/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>performance_comparison.py</strong><dd><code>Add
performance comparison and validation example</code>
</dd></summary>
<hr>
python/examples/performance_comparison.py
• New performance validation example comparing Python API against
<br>Fortran baseline<br> • Implements golden record validation for
numerical <br>accuracy verification<br> • Adds API overhead benchmarking
and SoA memory <br>layout optimization verification<br> • Includes
OpenMP scaling analysis <br>and integrator performance comparison
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-ae1f3b7f5910608e8ebd05a65d2751f99e9535dfa2f9f3600e181c51ac8511f0">+503/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>memory.py</strong><dd><code>Add memory-efficient
streaming utilities for large-scale simulations</code></dd></summary>
<hr>
python/simple/utils/memory.py
• New memory-efficient streaming utilities for processing millions of
<br>particles<br> • Implements <code>ParticleBatchStream</code> class
for constant memory <br>usage iteration<br> • Adds
<code>StreamResults</code> container for HDF5-based large <br>dataset
handling<br> • Includes memory monitoring, batch size <br>optimization,
and performance estimation functions
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-308814371fbf9241f5041204e351a91320670ce545c019fdd983cfea60d30550">+536/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>large_scale_streaming.py</strong><dd><code>Add
large-scale streaming example for memory-efficient
processing</code></dd></summary>
<hr>
python/examples/large_scale_streaming.py
• New large-scale streaming example demonstrating memory-efficient
<br>particle processing<br> • Shows processing of millions of particles
with <br>constant memory usage<br> • Implements HDF5 streaming for large
dataset <br>handling and memory usage optimization<br> • Includes
performance scaling <br>analysis and complete streaming workflow
examples
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-bac182d3204f71d9e5e28b61fd4ac9ff4674bcdae1703ef41f910a8c923b031b">+451/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>results.py</strong><dd><code>Add performance-optimized
BatchResults class for simulation analysis</code></dd></summary>
<hr>
python/simple/core/results.py
• New <code>BatchResults</code> class providing zero-copy access to
simulation <br>result arrays<br> • Implements vectorized analysis
capabilities with <br><code>ConfinementStats</code> dataclass<br> • Adds
HDF5 export capabilities and result <br>comparison utilities for golden
record validation<br> • Includes <br>surface-based analysis methods and
batch result combination <br>functionality
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-d6d2294bac3c8e7fc158551f72e59fccb38bdcc6f23a6b1c397a7ea540892c96">+497/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>file.py</strong><dd><code>Add file-based particle
initialization with multiple format support</code></dd></summary>
<hr>
python/simple/samplers/file.py
• New <code>FileSampler</code> class supporting multiple file formats
for particle <br>initialization<br> • Implements support for SIMPLE
native format, NumPy <br>arrays, HDF5, and ASCII text files<br> • Adds
file validation and format <br>detection capabilities<br> • Includes
save/load functionality with format <br>conversion between AoS and SoA
layouts
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-b378685ca651fb248176abc5a9a52cf487efc49a9059579cb2829157a9e7f4b2">+454/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>surface.py</strong><dd><code>Add surface sampling for
flux surface particle initialization</code></dd></summary>
<hr>
python/simple/samplers/surface.py
• New <code>SurfaceSampler</code> class for particle initialization on
magnetic <br>flux surfaces<br> • Implements uniform poloidal
distribution, flux surface <br>grid, and banana orbit sampling<br> •
Adds energy-pitch angle parameter <br>scan capabilities<br> • Includes
VMEC equilibrium integration and surface <br>geometry information
methods
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-e09d9b036f3987d9eceda81dee745ecd2ccfd4c5bd59f6c4ace0b0ba41a1cfe0">+272/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>__init__.py</strong><dd><code>Add samplers module
initialization and exports</code>
</dd></summary>
<hr>
python/simple/samplers/__init__.py
• New samplers module initialization file<br> • Exports
<code>SurfaceSampler</code>, <br><code>VolumeSampler</code>, and
<code>FileSampler</code> classes<br> • Provides unified interface
<br>for particle sampling functionality
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-19ac2b7d4eac1a9fe12173a9aaab8abafc7e7db6040d42dee61e86e31bd3fc71">+18/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>volume.py</strong><dd><code>Volume sampling
implementation for particle initialization</code></dd></summary>
<hr>
python/simple/samplers/volume.py
• Implements comprehensive volume sampling methods for particle
<br>initialization between flux surfaces<br> • Provides uniform,
<br>volume-weighted, radial profile, energy distribution, and layered
<br>sampling strategies<br> • Includes specialized sampling algorithms
for <br>parabolic, exponential, and linear density profiles<br> • Adds
volume <br>geometry information extraction from VMEC equilibrium files
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-b676e3c7cbdf1be6e028d203b99b8796f8e25fb725e524811b5b839a8a6ff2a6">+367/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>batch.py</strong><dd><code>Core ParticleBatch class
with zero-copy SoA access</code>
</dd></summary>
<hr>
python/simple/core/batch.py
• Implements <code>ParticleBatch</code> class providing zero-copy access
to Fortran <br>SoA arrays<br> • Adds structured coordinate access
through <code>Coordinates</code> <br>dataclass<br> • Provides particle
initialization methods for surface and <br>volume sampling<br> •
Includes SoA memory layout validation and <br>performance measurement
utilities
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-7bc7a4aa2306c42794ea6bc3a6d14c44f0cf6fb0565ae574ee10a8fa258f6424">+374/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>simulation.py</strong><dd><code>High-level simulation
interface for batch processing</code>
</dd></summary>
<hr>
python/simple/core/simulation.py
• Implements high-level <code>trace_orbits()</code> function for batch
orbit <br>tracing<br> • Adds configuration management and integrator
mapping <br>functionality<br> • Provides performance benchmarking and
golden record <br>validation utilities<br> • Includes convenience
functions for quick <br>simulations and parameter sweeps
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-16277448f8c7b023f82b708f0e7dc07bc2162edd5a6be3cf9604e3fa08b47d79">+410/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>fortran.py</strong><dd><code>f90wrap integration
backend for zero-copy array access</code>
</dd></summary>
<hr>
python/simple/backends/fortran.py
• f90wrap integration layer providing zero-copy access to existing
<br>pysimple module<br> • Implements <code>FortranBackend</code>,
<code>FortranArrayWrapper</code>, and
<br><code>FortranResultWrapper</code> classes<br> • Provides direct
memory access to <br>Fortran SoA arrays with proper validation<br> •
Handles simulation <br>execution through existing OpenMP parallelized
implementation
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-c4a8e95a52826cfb55b636c312280c35fca7c1567fa65d379be10e06f34702ec">+266/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>__init__.py</strong><dd><code>Main Python API module
initialization</code>
</dd></summary>
<hr>
python/simple/__init__.py
• Main module initialization exposing batch-oriented HPC interface<br> •
<br>Imports core classes <code>ParticleBatch</code>,
<code>BatchResults</code>, and <code>trace_orbits</code>
<br>function<br> • Provides comprehensive API documentation and
performance <br>guarantees<br> • Defines public interface for samplers,
utilities, and <br>memory management
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-395e79efd2c9d5d4b9182f067906d1a2c1b43d838ae12a5ba3b7ce028fad09c9">+50/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>__init__.py</strong><dd><code>Core API components
module initialization</code>
</dd></summary>
<hr>
python/simple/core/__init__.py
• Core API components initialization for batch-oriented particle
<br>processing<br> • Exports <code>ParticleBatch</code>,
<code>BatchResults</code>, and simulation <br>interface classes<br> •
Provides clean module structure for batch <br>processing functionality
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-b42f3d445a4905637a46d127b30aed45a7181d43e3a902cdb8f5538fcd6f7847">+21/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>__init__.py</strong><dd><code>Backend implementations
module initialization</code>
</dd></summary>
<hr>
python/simple/backends/__init__.py
• Backend implementations module initialization<br> • Exports Fortran
<br>backend classes for f90wrap integration<br> • Provides foundation
for <br>future native backend implementations
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-575cebea36847fc48bcac5cdae556bc70e6acfccf6c6a015120c0c76bb516a2b">+15/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>__init__.py</strong><dd><code>Utility modules
initialization</code>
</dd></summary>
<hr>
python/simple/utils/__init__.py
• Utility modules initialization for memory-efficient processing<br> •
<br>Exports streaming classes for large dataset handling<br> • Provides
<br>foundation for visualization and analysis utilities
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-503667ef4b813e2e3c4f1443680bcecd1f6ac2314d1d122d653e88ffa388b6e6">+15/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Documentation</strong></td><td><details><summary>6
files</summary><table>
<tr>
<td>
<details>
<summary><strong>basic_batch_processing.py</strong><dd><code>Complete
batch processing example and tutorial</code>
</dd></summary>
<hr>
python/examples/basic_batch_processing.py
• Comprehensive example demonstrating fundamental batch API usage<br> •
<br>Shows surface simulation, SoA performance validation, and data
access <br>patterns<br> • Includes integrator comparison, batch
operations, and <br>results export examples<br> • Provides complete
workflow from <br>initialization to analysis and visualization
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-0639f2cb52dcb449b1ab08217de8f2a30113e4fd708181cb9ab78b080f8415b5">+342/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>DESIGN.md</strong><dd><code>Comprehensive Python API
design documentation expansion</code> </dd></summary>
<hr>
DESIGN.md
• Extensive expansion of Phase 1 Python API design with batch-oriented
<br>HPC architecture<br> • Detailed class hierarchy, zero-copy SoA
wrappers, <br>and performance validation framework<br> • Comprehensive
risk assessment, <br>mitigation strategies, and opportunity analysis<br>
• GPU-ready <br>architecture preparation and scientific computing
ecosystem <br>integration
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-3dc5dd454e080eb849ee5efaf79df2585fbe0a06804d69249b4c81da05a63875">+556/-5</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>README.md</strong><dd><code>Golden record test
documentation for batch operations</code>
</dd></summary>
<hr>
test/golden_record/batch_operations/README.md
• Documentation for batch operations golden record test case<br> •
Defines <br>validation criteria for batch vs individual particle
processing<br> • <br>Specifies performance requirements and expected
outputs<br> • Provides <br>usage instructions for golden record
comparison system
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-efe0e7ac1031a19395dd7e74089969346e95fb90298898893d0bba5ecf9f7cd6">+39/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>api_reference.md</strong><dd><code>Complete Python API
Reference Documentation</code>
</dd></summary>
<hr>
python/docs/api_reference.md
• Complete API documentation for the SIMPLE Python batch-oriented HPC
<br>interface<br> • Comprehensive documentation for ParticleBatch,
<br>BatchResults, and simulation functions<br> • Detailed examples,
parameter <br>descriptions, and integration guides for scientific Python
ecosystem<br> • <br>Performance specifications and memory management
utilities <br>documentation
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-8a4d1586d272824c643a77f81b2c0b847008e766cf8082b10bc3e55fcff765ad">+1298/-0</a></td>
</tr>
<tr>
<td>
<details>
<summary><strong>user_guide.md</strong><dd><code>Python API User Guide
and Tutorial</code>
</dd></summary>
<hr>
python/docs/user_guide.md
• User guide for high-performance Python interface with batch-oriented
<br>HPC capabilities<br> • Installation instructions, core concepts, and
<br>particle initialization methods<br> • Simulation execution, results
<br>analysis, and large-scale processing workflows<br> • Performance
<br>optimization, data export, and troubleshooting guidance
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-d84c8a5b5230d5a04f933495c69aa65570fdc43b9952f3887b4d05a40a844774">+523/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>README.md</strong><dd><code>Python API Examples
Documentation and Guide</code>
</dd></summary>
<hr>
python/examples/README.md
• Comprehensive examples overview for SIMPLE Python API capabilities<br>
• <br>Four main example categories: basic processing, streaming,
<br>performance, and scientific analysis<br> • Installation
prerequisites, <br>troubleshooting guides, and advanced usage
patterns<br> • Integration <br>examples with NumPy, matplotlib, and HDF5
for scientific workflows
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-8d4fef6e9e7bad3f3fdfea5f7bd6bf913624d2578d46b62b1e683b7c81d9c25c">+330/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Tests</strong></td><td><details><summary>4
files</summary><table>
<tr>
<td>
<details>
<summary><strong>test_batch_api.py</strong><dd><code>Comprehensive batch
API test infrastructure</code>
</dd></summary>
<hr>
test/python/test_batch_api.py
• Comprehensive test suite for Python batch API validation<br> • Tests
SoA <br>memory layout, performance overhead measurement framework<br> •
Validates <br>golden record comparison and OpenMP threading safety
preparation<br> • <br>Includes scalability testing framework for large
particle counts
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-d587a733df19bdbd50952c3594781158653db9b2ded12489fa7fb4a26b97344c">+309/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>performance_benchmark.py</strong><dd><code>Performance
benchmarking framework for API validation</code>
</dd></summary>
<hr>
test/python/performance_benchmark.py
• High-precision performance benchmarking utilities for API
validation<br> <br>• Implements statistical timing analysis and overhead
calculation <br>framework<br> • Provides specialized particle batch
benchmarking and <br>scalability testing<br> • Includes automated
performance report generation <br>capabilities
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-e75c35d5da3d195e866bad9b761c813eb9ff97f5ada3870597167f12bb3aefdd">+322/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>CMakeLists.txt</strong><dd><code>CMake Integration for
Batch API Golden Record Tests</code>
</dd></summary>
<hr>
test/tests/CMakeLists.txt
• Add <code>batch_operations</code> golden record test case directory to
CMake file <br>copying<br> • Add new
<code>golden_record_batch_api</code> test for Python batch API
<br>validation against Fortran baseline
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-d4def2b0d5e31d605182011bbbbba821f19e58be523325d4f54368225d15d8e4">+17/-0</a>
</td>
</tr>
<tr>
<td>
<details>
<summary><strong>simple.in</strong><dd><code>Golden Record Configuration
for Batch Operations Testing</code> </dd></summary>
<hr>
test/golden_record/batch_operations/simple.in
• New golden record test configuration for 1000 particle batch
<br>operations validation<br> • Standard SIMPLE parameters with
<code>ntestpart = </code><br><code>1000</code> for batch API comparison
testing
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-dd344d2092f2e375c4e5d78925787b86bc81eee83baee013d4c78a4c8db4757d">+25/-0</a>
</td>
</tr>
</table></details></td></tr><tr><td><strong>Configuration
changes</strong></td><td><details><summary>1 files</summary><table>
<tr>
<td>
<details>
<summary><strong>CMakeLists.txt</strong><dd><code>CMake integration for
Python batch API tests</code>
</dd></summary>
<hr>
test/python/CMakeLists.txt
• Adds CMake test targets for Python batch API validation<br> • Includes
<br>performance benchmarking and scalability test configurations<br> •
Sets up <br>proper test environment and labeling for different test
categories<br> • <br>Integrates batch API tests into existing CMake test
framework
</details>
</td>
<td><a
href="https://github.com/itpplasma/SIMPLE/pull/172/files#diff-d5f3f2406c84339b51a25105ba36a2d2fe8997c23581beb0d2583d9cf49ba26a">+30/-0</a>
</td>
</tr>
</table></details></td></tr></tr></tbody></table>
</details>
___
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 63899ff commit 0016bff
38 files changed
Lines changed: 2648 additions & 415 deletions
File tree
- .github/workflows
- .vscode
- app
- examples
- python
- src
- diag
- field
- test
- golden_record/batch_operations
- python
- tests
- magfie
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | 18 | | |
34 | 19 | | |
35 | 20 | | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
44 | 24 | | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
| 25 | + | |
| 26 | + | |
53 | 27 | | |
54 | 28 | | |
55 | 29 | | |
| |||
69 | 43 | | |
70 | 44 | | |
71 | 45 | | |
72 | | - | |
| 46 | + | |
73 | 47 | | |
74 | 48 | | |
75 | 49 | | |
76 | | - | |
| 50 | + | |
77 | 51 | | |
78 | 52 | | |
79 | 53 | | |
80 | | - | |
| 54 | + | |
81 | 55 | | |
82 | 56 | | |
83 | | - | |
84 | | - | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
85 | 60 | | |
86 | 61 | | |
87 | 62 | | |
| |||
100 | 75 | | |
101 | 76 | | |
102 | 77 | | |
103 | | - | |
| 78 | + | |
104 | 79 | | |
105 | 80 | | |
106 | 81 | | |
| |||
143 | 118 | | |
144 | 119 | | |
145 | 120 | | |
146 | | - | |
| 121 | + | |
147 | 122 | | |
148 | 123 | | |
149 | 124 | | |
150 | | - | |
| 125 | + | |
151 | 126 | | |
152 | 127 | | |
153 | 128 | | |
| |||
161 | 136 | | |
162 | 137 | | |
163 | 138 | | |
164 | | - | |
| 139 | + | |
165 | 140 | | |
166 | 141 | | |
167 | 142 | | |
168 | 143 | | |
169 | | - | |
| 144 | + | |
170 | 145 | | |
171 | | - | |
| 146 | + | |
172 | 147 | | |
173 | 148 | | |
174 | | - | |
| 149 | + | |
175 | 150 | | |
176 | 151 | | |
177 | 152 | | |
| |||
183 | 158 | | |
184 | 159 | | |
185 | 160 | | |
186 | | - | |
| 161 | + | |
187 | 162 | | |
188 | 163 | | |
189 | 164 | | |
190 | | - | |
| 165 | + | |
191 | 166 | | |
192 | 167 | | |
193 | | - | |
| 168 | + | |
194 | 169 | | |
195 | 170 | | |
196 | | - | |
| 171 | + | |
197 | 172 | | |
198 | 173 | | |
199 | 174 | | |
| |||
205 | 180 | | |
206 | 181 | | |
207 | 182 | | |
208 | | - | |
| 183 | + | |
209 | 184 | | |
210 | 185 | | |
211 | 186 | | |
212 | 187 | | |
213 | 188 | | |
214 | | - | |
215 | | - | |
| 189 | + | |
| 190 | + | |
216 | 191 | | |
217 | 192 | | |
218 | 193 | | |
| |||
222 | 197 | | |
223 | 198 | | |
224 | 199 | | |
225 | | - | |
| 200 | + | |
226 | 201 | | |
227 | 202 | | |
228 | 203 | | |
229 | 204 | | |
230 | 205 | | |
231 | | - | |
| 206 | + | |
232 | 207 | | |
233 | 208 | | |
234 | 209 | | |
| |||
249 | 224 | | |
250 | 225 | | |
251 | 226 | | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
257 | | - | |
258 | | - | |
259 | | - | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
260 | 230 | | |
261 | | - | |
262 | | - | |
263 | | - | |
264 | | - | |
265 | | - | |
266 | | - | |
267 | | - | |
268 | | - | |
| 231 | + | |
| 232 | + | |
269 | 233 | | |
270 | 234 | | |
271 | 235 | | |
| |||
286 | 250 | | |
287 | 251 | | |
288 | 252 | | |
289 | | - | |
290 | 253 | | |
291 | 254 | | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
298 | | - | |
299 | | - | |
300 | | - | |
301 | | - | |
302 | | - | |
303 | | - | |
304 | | - | |
| 255 | + | |
305 | 256 | | |
306 | 257 | | |
307 | 258 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
| 29 | + | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
| |||
61 | 62 | | |
62 | 63 | | |
63 | 64 | | |
| 65 | + | |
| 66 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | | - | |
| 35 | + | |
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
97 | | - | |
98 | | - | |
| 96 | + | |
| 97 | + | |
99 | 98 | | |
100 | 99 | | |
101 | 100 | | |
| |||
0 commit comments