Spaces:
Sleeping
Sleeping
import gradio as gr | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import matplotlib.patches as patches | |
from matplotlib.animation import FuncAnimation | |
import networkx as nx | |
import time | |
import random | |
import json | |
from datetime import datetime | |
import threading | |
import queue | |
class Neuron: | |
def __init__(self, neuron_id, x, y, z=0): | |
self.id = neuron_id | |
self.x = x | |
self.y = y | |
self.z = z | |
self.activation = random.random() * 0.1 | |
self.specialization = random.choice([ | |
"visual", "semantic", "temporal", "spatial", "abstract", | |
"linguistic", "logical", "creative", "memory", "learning" | |
]) | |
self.knowledge = set() | |
self.connections = [] | |
self.quantum_state = [random.random() for _ in range(4)] | |
self.learning_rate = 0.1 + random.random() * 0.9 | |
self.age = 0 | |
self.experience = 0 | |
self.fitness = 0 | |
self.energy = random.random() | |
self.bias = random.uniform(-0.1, 0.1) | |
self.weights = {} | |
self.memory = [] | |
class AdvancedNeuralNetwork: | |
def __init__(self): | |
self.neurons = [] | |
self.connections = [] | |
self.metrics = { | |
'loss': 1.0, | |
'efficiency': 0, | |
'convergence': 0, | |
'global_fitness': 0, | |
'learning_rate': 0.1, | |
'knowledge_growth': 0, | |
'reasoning_capability': 0 | |
} | |
self.specializations = [ | |
"visual", "semantic", "temporal", "spatial", "abstract", | |
"linguistic", "logical", "creative", "memory", "learning" | |
] | |
self.initialize_network() | |
def initialize_network(self, num_neurons=30): | |
"""Inicializar la red neuronal con neuronas distribuidas""" | |
self.neurons = [] | |
self.connections = [] | |
# Crear neuronas especializadas | |
for i in range(num_neurons): | |
x = random.uniform(0.1, 0.9) | |
y = random.uniform(0.1, 0.9) | |
neuron = Neuron(i, x, y) | |
self.neurons.append(neuron) | |
# Crear conexiones iniciales | |
self.create_initial_connections() | |
def create_initial_connections(self): | |
"""Crear conexiones iniciales entre neuronas""" | |
for i, neuron1 in enumerate(self.neurons): | |
for j, neuron2 in enumerate(self.neurons[i+1:], i+1): | |
distance = self.calculate_distance(neuron1, neuron2) | |
if distance < 0.3 and random.random() < 0.3: | |
weight = random.random() | |
neuron1.connections.append(j) | |
neuron2.connections.append(i) | |
neuron1.weights[j] = weight | |
neuron2.weights[i] = weight | |
self.connections.append({'from': i, 'to': j, 'weight': weight}) | |
def calculate_distance(self, neuron1, neuron2): | |
"""Calcular distancia euclidiana entre dos neuronas""" | |
dx = neuron1.x - neuron2.x | |
dy = neuron1.y - neuron2.y | |
dz = neuron1.z - neuron2.z | |
return np.sqrt(dx*dx + dy*dy + dz*dz) | |
def sigmoid(self, x): | |
"""Función de activación sigmoid""" | |
return 1 / (1 + np.exp(-np.clip(x, -500, 500))) | |
def step(self): | |
"""Ejecutar un paso de la simulación""" | |
# Actualizar activaciones | |
new_activations = [] | |
for j, neuron in enumerate(self.neurons): | |
input_sum = 0 | |
for i, source_neuron in enumerate(self.neurons): | |
if i == j: | |
continue | |
weight = source_neuron.weights.get(j, 0) | |
distance = self.calculate_distance(source_neuron, neuron) | |
attenuation = 1 / (1 + distance * 5) | |
input_sum += source_neuron.activation * weight * attenuation | |
# Influencia cuántica | |
quantum_influence = (neuron.quantum_state[0] - 0.5) * 0.8 | |
new_activation = self.sigmoid(input_sum + neuron.bias + quantum_influence) | |
new_activations.append(new_activation) | |
# Aplicar nuevas activaciones con decay | |
for i, neuron in enumerate(self.neurons): | |
neuron.activation = new_activations[i] * 0.96 | |
neuron.energy = neuron.activation | |
neuron.age += 0.01 | |
neuron.experience += neuron.activation * 0.1 | |
# Actualizar estado cuántico | |
for j in range(4): | |
neuron.quantum_state[j] = np.sin(time.time() * 0.001 + j) * neuron.activation | |
# Aprendizaje hebbiano | |
self.hebbian_learning() | |
# Actualizar métricas | |
self.update_metrics() | |
def hebbian_learning(self): | |
"""Aplicar aprendizaje hebbiano""" | |
learning_rate = self.metrics['learning_rate'] * 0.01 | |
for neuron in self.neurons: | |
for connected_id in neuron.connections: | |
if connected_id < len(self.neurons): | |
connected_neuron = self.neurons[connected_id] | |
delta = learning_rate * neuron.activation * connected_neuron.activation | |
current_weight = neuron.weights.get(connected_id, 0) | |
neuron.weights[connected_id] = max(0, min(4, current_weight * 0.999 + delta)) | |
def update_metrics(self): | |
"""Actualizar métricas de la red""" | |
active_neurons = sum(1 for n in self.neurons if n.activation > 0.1) | |
total_knowledge = sum(len(n.knowledge) for n in self.neurons) | |
total_energy = sum(n.activation for n in self.neurons) | |
max_energy = len(self.neurons) | |
self.metrics['efficiency'] = active_neurons / len(self.neurons) if self.neurons else 0 | |
self.metrics['knowledge_growth'] = total_knowledge | |
self.metrics['global_fitness'] = total_energy / max_energy if max_energy > 0 else 0 | |
self.metrics['convergence'] = min(self.metrics['efficiency'] * self.metrics['global_fitness'], 1) | |
self.metrics['reasoning_capability'] = len([n for n in self.neurons | |
if n.specialization == "logical" and n.activation > 0.3]) / 10 | |
def add_neuron(self): | |
"""Añadir una nueva neurona a la red""" | |
new_id = len(self.neurons) | |
x = random.uniform(0.1, 0.9) | |
y = random.uniform(0.1, 0.9) | |
new_neuron = Neuron(new_id, x, y) | |
# Conectar con neuronas cercanas | |
for existing_neuron in self.neurons: | |
distance = self.calculate_distance(new_neuron, existing_neuron) | |
if distance < 0.3: | |
weight = np.exp(-distance / 0.4) * (0.5 + random.random() * 0.9) | |
new_neuron.weights[existing_neuron.id] = weight | |
existing_neuron.weights[new_id] = weight | |
new_neuron.connections.append(existing_neuron.id) | |
existing_neuron.connections.append(new_id) | |
self.neurons.append(new_neuron) | |
def remove_neuron(self): | |
"""Eliminar una neurona de la red""" | |
if len(self.neurons) <= 5: | |
return | |
removed = self.neurons.pop() | |
# Limpiar conexiones | |
for neuron in self.neurons: | |
if removed.id in neuron.weights: | |
del neuron.weights[removed.id] | |
if removed.id in neuron.connections: | |
neuron.connections.remove(removed.id) | |
# Actualizar conexiones | |
self.connections = [conn for conn in self.connections | |
if conn['from'] != removed.id and conn['to'] != removed.id] | |
def teach_concept(self, concept): | |
"""Enseñar un concepto a la red""" | |
learning_neurons = [n for n in self.neurons if n.specialization == "learning"] | |
if learning_neurons: | |
best_learner = max(learning_neurons, key=lambda n: n.activation) | |
best_learner.knowledge.add(concept) | |
best_learner.activation += 0.5 | |
best_learner.memory.append({ | |
'pattern': concept, | |
'timestamp': time.time(), | |
'strength': 1.0 | |
}) | |
# Propagar conocimiento | |
for connected_id in best_learner.connections: | |
if connected_id < len(self.neurons) and random.random() < 0.3: | |
connected_neuron = self.neurons[connected_id] | |
connected_neuron.knowledge.add(concept) | |
connected_neuron.activation += 0.2 | |
def reset(self): | |
"""Reiniciar la red neuronal""" | |
self.initialize_network() | |
# Instancia global de la red neuronal | |
global_network = AdvancedNeuralNetwork() | |
def create_network_visualization(): | |
"""Crear visualización de la red neuronal""" | |
fig, ax = plt.subplots(figsize=(12, 8)) | |
ax.set_xlim(0, 1) | |
ax.set_ylim(0, 1) | |
ax.set_aspect('equal') | |
ax.set_facecolor('#0f172a') | |
fig.patch.set_facecolor('#0f172a') | |
# Colores por especialización | |
colors = { | |
'visual': '#ef4444', 'semantic': '#22c55e', 'temporal': '#3b82f6', | |
'spatial': '#eab308', 'abstract': '#a855f7', 'linguistic': '#06b6d4', | |
'logical': '#f97316', 'creative': '#84cc16', 'memory': '#f59e0b', | |
'learning': '#ec4899' | |
} | |
# Dibujar conexiones | |
for conn in global_network.connections: | |
from_neuron = global_network.neurons[conn['from']] | |
to_neuron = global_network.neurons[conn['to']] | |
ax.plot([from_neuron.x, to_neuron.x], [from_neuron.y, to_neuron.y], | |
'b-', alpha=0.3, linewidth=0.5) | |
# Dibujar neuronas | |
for neuron in global_network.neurons: | |
size = 50 + neuron.activation * 300 | |
color = colors.get(neuron.specialization, '#ffffff') | |
alpha = 0.3 + neuron.activation * 0.7 | |
circle = plt.Circle((neuron.x, neuron.y), 0.02, | |
color=color, alpha=alpha, zorder=10) | |
ax.add_patch(circle) | |
# Mostrar ID para neuronas muy activas | |
if neuron.activation > 0.7: | |
ax.text(neuron.x, neuron.y + 0.03, str(neuron.id), | |
ha='center', va='bottom', color='white', fontsize=8) | |
# Efecto de conocimiento | |
if neuron.knowledge: | |
knowledge_circle = plt.Circle((neuron.x, neuron.y), 0.025, | |
fill=False, edgecolor='#22c55e', | |
linewidth=2, alpha=0.6, zorder=11) | |
ax.add_patch(knowledge_circle) | |
ax.set_title('Red Neuronal IA Avanzada - Visualización en Tiempo Real', | |
color='white', fontsize=16, pad=20) | |
ax.set_xlabel('') | |
ax.set_ylabel('') | |
ax.tick_params(colors='white') | |
# Leyenda | |
legend_elements = [] | |
for spec, color in colors.items(): | |
legend_elements.append(plt.Line2D([0], [0], marker='o', color='w', | |
markerfacecolor=color, markersize=8, | |
label=spec.capitalize())) | |
ax.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(1, 1), | |
facecolor='#1e293b', edgecolor='#475569', labelcolor='white') | |
plt.tight_layout() | |
return fig | |
def step_simulation(): | |
"""Ejecutar un paso de la simulación""" | |
global_network.step() | |
return create_network_visualization(), get_metrics_display() | |
def get_metrics_display(): | |
"""Obtener display de métricas""" | |
metrics = global_network.metrics | |
return f""" | |
## 📊 Métricas de la Red Neuronal | |
- **Eficiencia**: {metrics['efficiency']:.1%} | |
- **Convergencia**: {metrics['convergence']:.1%} | |
- **Fitness Global**: {metrics['global_fitness']:.1%} | |
- **Neuronas**: {len(global_network.neurons)} | |
- **Conexiones**: {len(global_network.connections)} | |
- **Conocimiento Total**: {metrics['knowledge_growth']} | |
- **Capacidad de Razonamiento**: {metrics['reasoning_capability']:.1%} | |
""" | |
def teach_concept_to_network(concept): | |
"""Enseñar concepto a la red""" | |
if concept.strip(): | |
global_network.teach_concept(concept.strip()) | |
return (create_network_visualization(), | |
get_metrics_display(), | |
f"✅ Concepto '{concept}' enseñado exitosamente a la red", | |
"") | |
return create_network_visualization(), get_metrics_display(), "❌ Por favor ingresa un concepto válido", concept | |
def add_neuron_to_network(): | |
"""Añadir neurona a la red""" | |
global_network.add_neuron() | |
return create_network_visualization(), get_metrics_display(), "➕ Nueva neurona añadida" | |
def remove_neuron_from_network(): | |
"""Remover neurona de la red""" | |
global_network.remove_neuron() | |
return create_network_visualization(), get_metrics_display(), "➖ Neurona eliminada" | |
def reset_network(): | |
"""Reiniciar la red""" | |
global_network.reset() | |
return create_network_visualization(), get_metrics_display(), "🔄 Red neuronal reiniciada" | |
def auto_simulation_steps(): | |
"""Ejecutar múltiples pasos automáticamente""" | |
for _ in range(5): | |
global_network.step() | |
time.sleep(0.1) | |
return create_network_visualization(), get_metrics_display() | |
# Crear la interfaz Gradio | |
def create_gradio_interface(): | |
with gr.Blocks( | |
theme=gr.themes.Soft( | |
primary_hue="blue", | |
secondary_hue="slate", | |
neutral_hue="slate", | |
).set( | |
body_background_fill="#0f172a", | |
block_background_fill="#1e293b", | |
block_border_color="#475569", | |
input_background_fill="#334155", | |
button_primary_background_fill="#3b82f6", | |
button_primary_text_color="white", | |
), | |
css=""" | |
.gradio-container { | |
background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 50%, #0f172a 100%); | |
min-height: 100vh; | |
} | |
.gr-button { | |
border-radius: 8px; | |
font-weight: 600; | |
} | |
.gr-panel { | |
border-radius: 12px; | |
border: 1px solid #475569; | |
} | |
""", | |
title="🧠 NEBULA - Red Neuronal IA Avanzada" | |
) as iface: | |
gr.HTML(""" | |
<div style="text-align: center; padding: 20px;"> | |
<h1 style="color: white; font-size: 3rem; margin-bottom: 10px;"> | |
🧠 NEBULA - Red Neuronal IA Avanzada ⚡ | |
</h1> | |
<p style="color: #cbd5e1; font-size: 1.2rem;"> | |
Simulación interactiva con aprendizaje automático y supervisión por IA | |
</p> | |
<p style="color: #94a3b8; font-size: 1rem; margin-top: 10px;"> | |
Una demostración avanzada de redes neuronales con especialización funcional y aprendizaje adaptativo | |
</p> | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
plot_output = gr.Plot( | |
value=create_network_visualization(), | |
label="🌐 Visualización de Red Neuronal", | |
show_label=True | |
) | |
with gr.Row(): | |
step_btn = gr.Button("🔄 Paso Manual", variant="primary") | |
auto_btn = gr.Button("⚡ 5 Pasos Auto", variant="secondary") | |
reset_btn = gr.Button("🔄 Reiniciar", variant="stop") | |
with gr.Row(): | |
add_neuron_btn = gr.Button("➕ Añadir Neurona") | |
remove_neuron_btn = gr.Button("➖ Remover Neurona") | |
with gr.Column(scale=1): | |
metrics_display = gr.Markdown( | |
value=get_metrics_display(), | |
label="📊 Métricas en Tiempo Real" | |
) | |
with gr.Group(): | |
gr.HTML("<h3 style='color: white; text-align: center;'>📚 Enseñanza Manual</h3>") | |
concept_input = gr.Textbox( | |
placeholder="Enseña un concepto a la red...", | |
label="💡 Concepto", | |
lines=2 | |
) | |
teach_btn = gr.Button("🎯 Enseñar Concepto", variant="primary") | |
status_output = gr.Textbox( | |
label="Estado", | |
interactive=False, | |
lines=2 | |
) | |
# Información adicional | |
with gr.Row(): | |
with gr.Column(): | |
gr.HTML(""" | |
<div style="background: #1e293b; padding: 20px; border-radius: 12px; margin-top: 20px; border: 1px solid #475569;"> | |
<h3 style="color: white; margin-bottom: 15px;">🔬 Especializaciones Neuronales</h3> | |
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> | |
<div style="color: #ef4444;">🔴 Visual - Procesamiento visual</div> | |
<div style="color: #22c55e;">🟢 Semántica - Significado y conceptos</div> | |
<div style="color: #3b82f6;">🔵 Temporal - Secuencias temporales</div> | |
<div style="color: #eab308;">🟡 Espacial - Relaciones espaciales</div> | |
<div style="color: #a855f7;">🟣 Abstracta - Pensamiento abstracto</div> | |
<div style="color: #06b6d4;">🔷 Lingüística - Procesamiento de lenguaje</div> | |
<div style="color: #f97316;">🟠 Lógica - Razonamiento lógico</div> | |
<div style="color: #84cc16;">🟢 Creativa - Generación creativa</div> | |
<div style="color: #f59e0b;">🟨 Memoria - Almacenamiento</div> | |
<div style="color: #ec4899;">🟡 Aprendizaje - Adquisición de conocimiento</div> | |
</div> | |
</div> | |
""") | |
# Event handlers | |
step_btn.click( | |
step_simulation, | |
outputs=[plot_output, metrics_display] | |
) | |
auto_btn.click( | |
auto_simulation_steps, | |
outputs=[plot_output, metrics_display] | |
) | |
teach_btn.click( | |
teach_concept_to_network, | |
inputs=[concept_input], | |
outputs=[plot_output, metrics_display, status_output, concept_input] | |
) | |
concept_input.submit( | |
teach_concept_to_network, | |
inputs=[concept_input], | |
outputs=[plot_output, metrics_display, status_output, concept_input] | |
) | |
add_neuron_btn.click( | |
add_neuron_to_network, | |
outputs=[plot_output, metrics_display, status_output] | |
) | |
remove_neuron_btn.click( | |
remove_neuron_from_network, | |
outputs=[plot_output, metrics_display, status_output] | |
) | |
reset_btn.click( | |
reset_network, | |
outputs=[plot_output, metrics_display, status_output] | |
) | |
# Footer | |
gr.HTML(""" | |
<div style="text-align: center; padding: 20px; margin-top: 30px; border-top: 1px solid #475569;"> | |
<p style="color: #94a3b8;"> | |
🚀 Desarrollado por <strong>Agnuxo</strong> | | |
💡 Simulación avanzada de redes neuronales con IA supervisada | |
</p> | |
<p style="color: #64748b; font-size: 0.9rem;"> | |
Esta demostración muestra conceptos de neurociencia computacional, | |
aprendizaje automático y sistemas adaptativos complejos. | |
</p> | |
</div> | |
""") | |
return iface | |
if __name__ == "__main__": | |
iface = create_gradio_interface() | |
iface.launch( | |
server_name="0.0.0.0", | |
server_port=7860, | |
share=False | |
) |