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

@author: ojacques
"""

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 = np.array([0, 0, 0, 1, 1, 1])
labels_pred = np.array([0, 0, 1, 1, 2, 2])

n = len(labels_true)
nPares=comb(n,2,exact=True)

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

for i in range(n):
    for j in range(i + 1, n):
        #pares reais de mesmo grupo?
        same_true = (labels_true[i] == labels_true[j])
        #pares preditivos de mesmo grupo?
        same_pred = (labels_pred[i] == labels_pred[j])
        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}')