from .auto import (
    AutoClassifier,
    AutoRegressor,
)
from .clustering import (
    DBSCAN,
    KMeans,
)
from .linear_models import (
    RANSAC,
    Bayesian,
    Lasso,
    LinearDiscriminantAnalysis,
    LogisticRegression,
    OrdinaryLeastSquares,
    PassiveAggressiveRegressor,
    Perceptron,
    QuadraticDiscriminantAnalysis,
    Ridge,
    make_sample_data,
)
from .nearest_neighbors import (
    KNeighborsClassifier,
    KNeighborsRegressor,
)
from .neural_networks import (
    Activation,
    AdadeltaOptimizer,
    AdamOptimizer,
    BaseBackendNeuralNetwork,
    BCEWithLogitsLoss,
    ConvLayer,
    CrossEntropyLoss,
    DenseLayer,
    FlattenLayer,
    HuberLoss,
    MeanAbsoluteErrorLoss,
    MeanSquaredErrorLoss,
    NeuralNetworkBase,
    RNNLayer,
    SGDOptimizer,
    lr_scheduler_exp,
    lr_scheduler_plateau,
    lr_scheduler_step,
)
from .pipelines import ForecastingPipeline, Pipeline
from .svm import (
    BaseSVM,
    GeneralizedSVC,
    GeneralizedSVR,
    LinearSVC,
    LinearSVR,
    OneClassSVM,
)
from .time_series import (
    ARIMA,
    SARIMA,
    SARIMAX,
    AdditiveDecomposition,
    DoubleExponentialSmoothing,
    ExponentialMovingAverage,
    MultiplicativeDecomposition,
    SimpleExponentialSmoothing,
    SimpleMovingAverage,
    TripleExponentialSmoothing,
    WeightedMovingAverage,
)
from .trees import (
    AdaBoostClassifier,
    AdaBoostRegressor,
    ClassifierTree,
    ClassifierTreeUtility,
    GradientBoostedClassifier,
    GradientBoostedRegressor,
    IsolationForest,
    IsolationTree,
    IsolationUtils,
    RandomForestClassifier,
    RandomForestRegressor,
    RegressorTree,
    RegressorTreeUtility,
)
from .utils import (
    PCA,
    SMOTE,
    SVD,
    AnimationBase,
    Augmenter,
    ClassificationAnimation,
    DataPrep,
    ForcastingAnimation,
    ForecastRegressor,
    GridSearchCV,
    Metrics,
    ModelSelectionUtility,
    PolynomialTransform,
    RandomOverSampler,
    RandomSearchCV,
    RandomUnderSampler,
    RegressionAnimation,
    Scaler,
    VotingClassifier,
    VotingRegressor,
    check_is_fitted,
    check_X_y,
    make_blobs,
    make_classification,
    make_regression,
    make_time_series,
    normalize,
    one_hot_encode,
    train_test_split,
)

__all__ = [
    # Utils
    "AnimationBase",
    "RegressionAnimation",
    "ForcastingAnimation",
    "ClassificationAnimation",
    "PolynomialTransform",
    "DataPrep",
    "VotingRegressor",
    "VotingClassifier",
    "ForecastRegressor",
    "ModelSelectionUtility",
    "GridSearchCV",
    "RandomSearchCV",
    "Metrics",
    "PCA",
    "SVD",
    "RandomOverSampler",
    "RandomUnderSampler",
    "SMOTE",
    "Augmenter",
    "make_blobs",
    "make_regression",
    "make_time_series",
    "make_classification",
    "train_test_split",
    "one_hot_encode",
    "normalize",
    "Scaler",
    "check_is_fitted",
    "check_X_y",
    # Clustering
    "KMeans",
    "DBSCAN",
    # Linear Models
    "OrdinaryLeastSquares",
    "Ridge",
    "Lasso",
    "Bayesian",
    "RANSAC",
    "PassiveAggressiveRegressor",
    "LinearDiscriminantAnalysis",
    "QuadraticDiscriminantAnalysis",
    "LogisticRegression",
    "Perceptron",
    "make_sample_data",
    # Trees
    "ClassifierTreeUtility",
    "ClassifierTree",
    "RegressorTreeUtility",
    "RegressorTree",
    "RandomForestClassifier",
    "RandomForestRegressor",
    "GradientBoostedClassifier",
    "GradientBoostedRegressor",
    "IsolationTree",
    "IsolationForest",
    "IsolationUtils",
    "AdaBoostClassifier",
    "AdaBoostRegressor",
    # Neural Networks
    "Activation",
    "AdadeltaOptimizer",
    "AdamOptimizer",
    "BaseBackendNeuralNetwork",
    "BCEWithLogitsLoss",
    "ConvLayer",
    "CrossEntropyLoss",
    "DenseLayer",
    "FlattenLayer",
    "HuberLoss",
    "MeanAbsoluteErrorLoss",
    "MeanSquaredErrorLoss",
    "NeuralNetworkBase",
    "RNNLayer",
    "SGDOptimizer",
    "lr_scheduler_exp",
    "lr_scheduler_plateau",
    "lr_scheduler_step",
    # Nearest Neighbors
    "KNeighborsClassifier",
    "KNeighborsRegressor",
    # SVM
    "BaseSVM",
    "LinearSVC",
    "LinearSVR",
    "OneClassSVM",
    "GeneralizedSVR",
    "GeneralizedSVC",
    # Auto
    "AutoRegressor",
    "AutoClassifier",
    # Time Series
    "ARIMA",
    "SARIMA",
    "SARIMAX",
    "DoubleExponentialSmoothing",
    "SimpleExponentialSmoothing",
    "TripleExponentialSmoothing",
    "SimpleMovingAverage",
    "WeightedMovingAverage",
    "ExponentialMovingAverage",
    "AdditiveDecomposition",
    "MultiplicativeDecomposition",
    # Pipelines
    "Pipeline",
    "ForecastingPipeline",
]

try:
    from .neural_networks.layers_jit import (
        JITConvLayer,
        JITDenseLayer,
        JITFlattenLayer,
        JITRNNLayer,
    )
    from .neural_networks.loss_jit import (
        JITBCEWithLogitsLoss,
        JITCrossEntropyLoss,
        JITHuberLoss,
        JITMeanAbsoluteErrorLoss,
        JITMeanSquaredErrorLoss,
    )
    from .neural_networks.neuralNetworkNumbaBackend import NumbaBackendNeuralNetwork
    from .neural_networks.numba_utils import *
    from .neural_networks.optimizers_jit import (
        JITAdadeltaOptimizer,
        JITAdamOptimizer,
        JITSGDOptimizer,
    )

    __all__.extend(
        [
            "JITAdamOptimizer",
            "JITSGDOptimizer",
            "JITAdadeltaOptimizer",
            "JITBCEWithLogitsLoss",
            "JITCrossEntropyLoss",
            "JITMeanSquaredErrorLoss",
            "JITMeanAbsoluteErrorLoss",
            "JITHuberLoss",
            "JITDenseLayer",
            "JITFlattenLayer",
            "JITConvLayer",
            "JITRNNLayer",
            "NumbaBackendNeuralNetwork",
        ]
    )
except ImportError:
    pass
