from evolib.core.individual import Indiv as Individual
from evolib.core.population import Pop as Population
from evolib.interfaces.types import FitnessFunction
from evolib.io.checkpoint import (
    load_best_indiv,
    resume_from_checkpoint,
    resume_or_create,
    save_best_indiv,
    save_checkpoint,
)
from evolib.representation.evonet import EvoNet
from evolib.representation.netvector import NetVector
from evolib.representation.vector import Vector
from evolib.utils.benchmarks import (
    ackley,
    ackley_2d,
    ackley_3d,
    griewank,
    griewank_2d,
    griewank_3d,
    rastrigin,
    rastrigin_2d,
    rastrigin_3d,
    rosenbrock,
    rosenbrock_2d,
    rosenbrock_3d,
    schwefel,
    schwefel_2d,
    schwefel_3d,
    simple_quadratic,
    sphere,
    sphere_2d,
    sphere_3d,
)
from evolib.utils.history_logger import HistoryLogger
from evolib.utils.loss_functions import (
    bce_loss,
    cce_loss,
    huber_loss,
    mae_loss,
    mse_loss,
)
from evolib.utils.plotting import (
    plot_approximation,
    plot_diversity,
    plot_fitness,
    plot_fitness_comparison,
    plot_history,
    plot_mutation_trends,
    save_combined_net_plot,
)

__all__ = [
    "Population",
    "Individual",
    "Vector",
    "EvoNet",
    "NetVector",
    "HistoryLogger",
    "plot_fitness",
    "plot_approximation",
    "save_combined_net_plot",
    "plot_history",
    "plot_diversity",
    "plot_mutation_trends",
    "plot_fitness_comparison",
    "mse_loss",
    "mae_loss",
    "huber_loss",
    "bce_loss",
    "cce_loss",
    "simple_quadratic",
    "rastrigin",
    "sphere",
    "rosenbrock",
    "ackley",
    "griewank",
    "schwefel",
    "ackley_2d",
    "rosenbrock_2d",
    "rastrigin_2d",
    "griewank_2d",
    "sphere_2d",
    "schwefel_2d",
    "ackley_3d",
    "rastrigin_3d",
    "griewank_3d",
    "sphere_3d",
    "rosenbrock_3d",
    "schwefel_3d",
    "save_checkpoint",
    "resume_from_checkpoint",
    "save_best_indiv",
    "load_best_indiv",
    "resume_or_create",
    "FitnessFunction",
]

Pop = Population
Indiv = Individual
