#pragma once

#include <chrono>
#include <optional>

namespace sd
{
namespace disc
{

struct MiningSettings
{
    bool   with_singletons = true;
    bool   use_bic         = true;
    size_t min_support     = 2;
    size_t search_depth    = 1;
    size_t max_patience    = 20;
    size_t max_iteration   = std::numeric_limits<size_t>::max();

    std::optional<size_t>                    max_pattern_size;
    std::optional<size_t>                    max_patternset_size;
    std::optional<std::chrono::milliseconds> max_time;

    size_t max_factor_width = 20; // 5
    size_t max_factor_size  = 8;  // 8
};

struct DecompositionSettings : public MiningSettings
{
    std::optional<size_t>                    max_cliques;
    std::optional<size_t>                    max_em_iterations;
    std::optional<std::chrono::milliseconds> max_time_total;
    bool                                     test_divergence = true;
    double                                   alpha           = 0.01;
};

} // namespace disc
} // namespace sd