#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jul  5 16:41:54 2026

@author: ojacques
"""

import itertools
import numpy as np
from scipy.special import comb

# Definindo as listas do exemplo oculto (padrão comum da documentação do sklearn)
# No sklearn, um exemplo clássico é:
# labels_true = [0, 0, 0, 1, 1, 1]
# labels_pred = [0, 0, 1, 1, 2, 2]

# Como o prompt anterior deixou os arrays vazios (labels_true = \n labels_pred =), 
# vou assumir o exemplo clássico da documentação oficial do scikit-learn para responder com precisão.
labels_true = [0, 0, 0, 1, 1, 1] # dois grupos de 3 elementos cada
labels_pred = [0, 0, 1, 1, 2, 2] # três grupos de 2 elementos cada
combTrue=(itertools.combinations(labels_true,2))
combPred=(itertools.combinations(labels_pred,2))

n = len(labels_true)
#
# C(n,2) : número de combinações dois a dois
#
nPares=comb(n,2,exact=True)

vp = 0
vn = 0
fp = 0
fn = 0

for l in zip(combTrue,combPred):
    (ra,rb),(pa,pb) = l
    same_true = ra==rb
    same_pred = pa==pb
    
    if same_true and same_pred: # pares de mesmo grupo no real e preditivo 
        vp += 1
    elif not same_true and not same_pred: #pares diferentes no real e no preditivo
        vn += 1
    elif not same_true and same_pred:
        fp += 1
    elif same_true and not same_pred:
        fn += 1

print(f"VP: {vp}, VN: {vn}, FP: {fp}, FN: {fn}")

# 1. Índice Rand Tradicional (RI)
ri = (vp + vn) / nPares
print(f'Indice de Rand: {ri:.4f}')

# 2. Índice Rand Ajustado (ARI) usando Python puro
numerador = 2 * (vp * vn - fp * fn)
denominador = (vp + fp) * (fp + vn) + (vp + fn) * (fn + vn)

# Evita divisão por zero caso o denominador seja nulo (atribuições perfeitamente erradas ou constantes)
ari = numerador / denominador if denominador != 0 else 0.0
print(f'Indice de Rand Ajustado (ARI): {ari:.4f}')
