The GA tests were failing because the algorithm converged on a single root (e.g., -1.0) and failed to find the other (e.g., 2.5).
This was caused by creating a 'parent pool' from only the top 50% of solutions. This was too aggressive and discarded the 'niche' solutions that were exploring other valid roots.
This commit modifies the parent selection logic in both `_solve_x_numpy` and `_solve_x_cuda`. Parents for crossover and mutation are now selected from the *entire* sorted population (`data_size`).
This maintains population diversity and allows the algorithm to explore multiple optima, fixing the failing tests.
This commit introduces a major enhancement to the genetic algorithm's convergence logic and refactors key parts of the API for better clarity and usability.
- **feat(ga):** Re-implements the GA solver (CPU & CUDA) to use a more robust strategy based on Elitism, Crossover, and Mutation. This replaces the previous, less efficient model and is designed to significantly improve accuracy and convergence speed.
- **feat(api):** Updates `GA_Options` to expose the new GA strategy parameters:
- Renames `mutation_percentage` to `mutation_strength` for clarity.
- Adds `elite_ratio`, `crossover_ratio`, and `mutation_ratio`.
- Includes a `__post_init__` validator to ensure ratios are valid.
- **refactor(api):** Moves `quadratic_solve` from a standalone function to a method of the `Function` class (`f1.quadratic_solve()`). This provides a cleaner, more object-oriented API.
- **docs:** Updates the README, `GA_Options` doc page, and `quadratic_solve` doc page to reflect all API changes, new parameters, and updated usage examples.
- **chore:** Bumps version to 0.4.0.