"""Jalankan holdout, K-fold, dan leave-one-out."""

from holdout import holdout
from kfold import kfold
from knn import load, percent
from leave_one_out import leave_one_out


def main():
    rows = load()
    train, test, hold_wrong, hold_ties = holdout(rows)
    folds, fold_ties = kfold(rows)
    loo_wrong, loo_ties = leave_one_out(rows)
    fold_wrong = [no for _, wrong in folds for no in wrong]

    assert len(rows) == 150 and len(train) == 120 and len(test) == 30
    assert hold_wrong == [] and hold_ties == 0
    assert fold_wrong == [69, 71, 73, 78, 84, 107, 120, 127, 128, 134]
    assert fold_ties == 0 and loo_ties == 0
    assert loo_wrong == [71, 73, 84, 107, 120]

    print(f"{'Holdout':<16} salah {len(hold_wrong):2} / {len(test):<3}  error {percent(hold_wrong, len(test)):6.2f}%")
    print(f"{'K-fold K=10':<16} salah {len(fold_wrong):2} / {len(rows):<3}  error {percent(fold_wrong, len(rows)):6.2f}%")
    print(f"{'Leave-one-out':<16} salah {len(loo_wrong):2} / {len(rows):<3}  error {percent(loo_wrong, len(rows)):6.2f}%")
    print()
    print("Fold | baris   | salah | Ei")
    for i, (test_f, wrong) in enumerate(folds, start=1):
        ei = percent(wrong, len(test_f))
        print(f"{i:4} | {test_f[0][0]:3}-{test_f[-1][0]:<3} | {len(wrong):5} | {ei:6.2f}%")


if __name__ == "__main__":
    main()
