module dtree.traits;

import dtree.decision : DecisionInfo;

enum hasDecisionInfo(P) = is(typeof(P.init.left) == DecisionInfo) && is(typeof(P.init.right) == DecisionInfo);

enum isRegressionPolicy(P) = hasDecisionInfo!P && is(typeof({
            import numir : zeros;
            auto xs = zeros(3, 3);
            auto ys = zeros(3, 1);
            size_t[] id = [0, 2];
            P p;
            p.fit(xs[0], xs, ys, id, 0, 1);
        }));

enum isClassificationPolicy(P) = hasDecisionInfo!P && is(typeof({
            import numir : zeros;
            auto xs = zeros(3, 3);
            auto ys = zeros!int(3);
            size_t[] id = [0, 2];
            P p;
            p.fit(xs[0], xs, ys, id, 0, 1);
        }));

enum isDecisionPolicy(P) = isRegressionPolicy!P || isClassificationPolicy!P;

@safe @nogc
unittest {
    import dtree.decision;
    import dtree.impurity;

    static assert(isRegressionPolicy!Regression);
    static assert(isClassificationPolicy!(Classification!entropy));
    static assert(isClassificationPolicy!(Classification!gini));
}