Baloto-AI/baloto_ai.py
2025-05-10 15:22:42 -05:00

154 lines
5.5 KiB
Python

from tensorflow import keras
from keras import layers
from art import text2art
import tensorflow as tf
import numpy as np
import socket
import sys
# Bloquear el acceso a Internet
socket.socket = lambda *args, **kwargs: (_ for _ in ()).throw(Exception("Internet access is disabled"))
# === Callback Personalizado para Salida Estilizada de Entrenamiento ===
class CustomTrainingCallback(tf.keras.callbacks.Callback):
def __init__(self):
super().__init__()
self.total_epochs = None
self.bar_length = 40
def on_train_begin(self, logs=None):
self.total_epochs = self.params['epochs']
print("\033[1;36m" + "=" * 60 + "\033[0m")
print("\033[1;35mTraining Progress:\033[0m")
def on_epoch_end(self, epoch, logs=None):
current = epoch + 1
percent = current / self.total_epochs
filled_len = int(self.bar_length * percent)
bar = '' * filled_len + '·' * (self.bar_length - filled_len)
sys.stdout.write(f"\r\033[1;34m[Epoch {current}/{self.total_epochs}] [{bar}] {percent*100:.1f}%\033[0m")
sys.stdout.flush()
if current == self.total_epochs:
print("\n\033[1;36m" + "=" * 60 + "\033[0m\n")
# === Funciones de Interfaz ===
def print_banner():
print("\033[1;34m" + text2art("Baloto AI", font="block"))
print("\033[1;33m" + "Lottery Prediction Artificial Intelligence".center(60) + "\033[0m")
print("\033[1;36m" + "=" * 60 + "\033[0m")
def print_status(message):
print(f"\033[1;34m[•]\033[0m \033[1;37m{message}\033[0m")
def print_intro():
print_banner()
print_status("Starting LotteryAI Prediction System...")
print("\033[1;36m" + "=" * 60 + "\033[0m")
# === Funciones de Entrenamiento ===
def load_data():
print_status("Loading training data...")
if not tf.io.gfile.exists('data.txt'):
raise FileNotFoundError("data.txt not found")
data = np.genfromtxt('data.txt', delimiter=',', dtype=int)
if data.shape[1] != 6:
raise ValueError("Each row in data.txt must have exactly 6 numbers (5 regular + 1 bonus)")
regular_numbers = data[:, :5]
bonus_numbers = data[:, 5]
train_size = int(0.8 * len(data))
x_train = regular_numbers[:train_size]
y_train_main = [regular_numbers[:train_size][:, i] for i in range(5)]
y_train_bonus = bonus_numbers[:train_size]
x_val = regular_numbers[train_size:]
y_val_main = [regular_numbers[train_size:][:, i] for i in range(5)]
y_val_bonus = bonus_numbers[train_size:]
return (x_train, y_train_main, y_train_bonus), (x_val, y_val_main, y_val_bonus)
def create_model():
print_status("Building neural network model...")
input_layer = layers.Input(shape=(5,))
x = layers.Embedding(input_dim=44, output_dim=32)(input_layer)
x = layers.LSTM(64)(x)
output_main = [layers.Dense(44, activation='softmax', name=f'main_output_{i}')(x) for i in range(5)]
output_bonus = layers.Dense(44, activation='softmax', name='bonus_output')(x)
model = keras.Model(inputs=input_layer, outputs=output_main + [output_bonus])
loss_dict = {f'main_output_{i}': 'sparse_categorical_crossentropy' for i in range(5)}
loss_dict['bonus_output'] = 'sparse_categorical_crossentropy'
metrics_dict = {f'main_output_{i}': 'accuracy' for i in range(5)}
metrics_dict['bonus_output'] = 'accuracy'
model.compile(
optimizer='adam',
loss=loss_dict,
metrics=metrics_dict
)
return model
def train_model(model, x_train, y_train_main, y_train_bonus, x_val, y_val_main, y_val_bonus):
print_status("Training model (100 epochs)...\n")
train_targets = {f'main_output_{i}': y_train_main[i] for i in range(5)}
train_targets['bonus_output'] = y_train_bonus
val_targets = {f'main_output_{i}': y_val_main[i] for i in range(5)}
val_targets['bonus_output'] = y_val_bonus
callback = CustomTrainingCallback()
return model.fit(
x_train, train_targets,
validation_data=(x_val, val_targets),
epochs=100,
verbose=0, # Desactiva la salida estándar
callbacks=[callback]
)
def predict_numbers(model, x_val):
predictions = model.predict(x_val)
pred_main = np.array([np.argmax(p, axis=1) for p in predictions[:-1]]).T
pred_bonus = np.argmax(predictions[-1], axis=1)
return pred_main, pred_bonus
def print_results(pred_main, pred_bonus):
print_status("Generating predictions...")
print("\033[1;36m" + "=" * 60 + "\033[0m")
print("\033[1;32m" + "🎯 PREDICTED NUMBERS 🎯".center(60) + "\033[0m")
print("\033[1;36m" + "-" * 60 + "\033[0m")
if pred_main.shape[0] > 0:
main_nums = ', '.join(map(str, np.sort(pred_main[0])))
print(f"\033[1;33mMain Numbers:\033[0m \033[1;37m{main_nums}\033[0m")
print(f"\033[1;33mBonus Number:\033[0m \033[1;37m{pred_bonus[0]}\033[0m")
else:
print("\033[1;31mNo predictions available\033[0m")
print("\033[1;36m" + "=" * 60 + "\033[0m")
# === Ejecución Principal ===
def main():
print("\x1b[H\x1b[2J\x1b[3J") # Limpia la consola
print_intro()
try:
(x_train, y_train_main, y_train_bonus), (x_val, y_val_main, y_val_bonus) = load_data()
model = create_model()
train_model(model, x_train, y_train_main, y_train_bonus, x_val, y_val_main, y_val_bonus)
pred_main, pred_bonus = predict_numbers(model, x_val)
print_results(pred_main, pred_bonus)
except Exception as e:
print("\033[1;31m[!] Error:\033[0m", str(e))
sys.exit(1)
if __name__ == "__main__":
main()