import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np import torch from singularity_core import SingularityCore from mpl_toolkits.mplot3d import Axes3D import matplotlib.patches as patches class SingularityVisualizer: """Визуализация сингулярного ядра в стиле React-компонента.""" def __init__(self, singularity_radius=0.01, wormhole_depth=2.1, rotation_speed=0.0): self.singularity = SingularityCore( singularity_radius=singularity_radius, wormhole_depth=wormhole_depth, rotation_speed=rotation_speed, embedding_dim=256 ) # Параметры визуализации self.fig = None self.ax = None self.animation = None def create_torus_mesh(self, theta_res=64, phi_res=128): """Создание тороидальной сетки с wormhole эффектом.""" theta = np.linspace(0, 2*np.pi, theta_res) phi = np.linspace(0, 2*np.pi, phi_res) theta_grid, phi_grid = np.meshgrid(theta, phi) # Тороидальные координаты R = 1.0 # Major radius r = self.singularity.singularity_radius # Minor radius x = (R + r * np.cos(phi_grid)) * np.cos(theta_grid) y = (R + r * np.cos(phi_grid)) * np.sin(theta_grid) z = r * np.sin(phi_grid) # Wormhole effect: z = sin(3θ) × depth wormhole_effect = np.sin(3 * theta_grid) * self.singularity.wormhole_depth z += wormhole_effect return x, y, z def visualize_singularity(self, show_trajectories=True, show_singularity=True): """Основная визуализация сингулярности.""" self.fig = plt.figure(figsize=(12, 8)) self.ax = self.fig.add_subplot(111, projection='3d') # Создание тороидальной сетки x, y, z = self.create_torus_mesh() # Отрисовка тороидальной поверхности self.ax.plot_wireframe(x, y, z, color='#00ffff', alpha=0.8, linewidth=0.5) # Траектории частиц if show_trajectories: self._add_trajectories() # Сингулярность в центре if show_singularity: self.ax.scatter([0], [0], [0], color='red', s=100, alpha=0.8, label='Singularity') # Настройка осей self.ax.set_xlabel('X') self.ax.set_ylabel('Y') self.ax.set_zlabel('Z') self.ax.set_title(f'Singularity Core\nRadius: {self.singularity.singularity_radius:.3f}, ' f'Depth: {self.singularity.wormhole_depth:.3f}') # Установка равных масштабов max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0 mid_x = (x.max()+x.min()) * 0.5 mid_y = (y.max()+y.min()) * 0.5 mid_z = (z.max()+z.min()) * 0.5 self.ax.set_xlim(mid_x - max_range, mid_x + max_range) self.ax.set_ylim(mid_y - max_range, mid_y + max_range) self.ax.set_zlim(mid_z - max_range, mid_z + max_range) plt.tight_layout() return self.fig def _add_trajectories(self): """Добавление траекторий частиц.""" # Создаем несколько траекторий num_trajectories = 5 for i in range(num_trajectories): # Случайная траектория вокруг тора t = np.linspace(0, 4*np.pi, 100) theta = t + i * 2*np.pi/num_trajectories phi = 0.5 * np.sin(2*t) + i * np.pi/num_trajectories R = 1.0 r = self.singularity.singularity_radius x_traj = (R + r * np.cos(phi)) * np.cos(theta) y_traj = (R + r * np.cos(phi)) * np.sin(theta) z_traj = r * np.sin(phi) + np.sin(3 * theta) * self.singularity.wormhole_depth self.ax.plot(x_traj, y_traj, z_traj, 'o-', markersize=2, alpha=0.7, color='white') def animate_singularity(self, frames=100): """Анимация сингулярности.""" self.fig = plt.figure(figsize=(12, 8)) self.ax = self.fig.add_subplot(111, projection='3d') def animate(frame): self.ax.clear() # Обновляем параметры для анимации rotation_angle = frame * 2 * np.pi / frames * self.singularity.rotation_speed # Создаем тороидальную сетку с поворотом theta = np.linspace(0, 2*np.pi, 64) phi = np.linspace(0, 2*np.pi, 128) theta_grid, phi_grid = np.meshgrid(theta + rotation_angle, phi) R = 1.0 r = self.singularity.singularity_radius x = (R + r * np.cos(phi_grid)) * np.cos(theta_grid) y = (R + r * np.cos(phi_grid)) * np.sin(theta_grid) z = r * np.sin(phi_grid) + np.sin(3 * theta_grid) * self.singularity.wormhole_depth self.ax.plot_wireframe(x, y, z, color='#00ffff', alpha=0.8, linewidth=0.5) # Сингулярность self.ax.scatter([0], [0], [0], color='red', s=100, alpha=0.8) # Настройка осей self.ax.set_xlabel('X') self.ax.set_ylabel('Y') self.ax.set_zlabel('Z') self.ax.set_title(f'Singularity Animation\nFrame: {frame}/{frames}') # Установка равных масштабов max_range = 2.0 self.ax.set_xlim(-max_range, max_range) self.ax.set_ylim(-max_range, max_range) self.ax.set_zlim(-max_range, max_range) self.animation = animation.FuncAnimation( self.fig, animate, frames=frames, interval=50, blit=False ) return self.animation def show_transformation_metrics(self): """Показать метрики трансформации.""" # Создаем тестовое состояние test_state = torch.randn(1, 10, 256) # Применяем трансформацию result = self.singularity.self_wrapping_cycle(test_state, "Визуализация") if result["success"]: metrics = result["metrics"] # Создаем график метрик fig, axes = plt.subplots(2, 2, figsize=(12, 8)) fig.suptitle('Singularity Transformation Metrics', fontsize=16) # Метрики metric_names = ['State Transformation', 'Curvature', 'Entropy', 'Coherence'] metric_values = [ metrics['state_transformation'], metrics['curvature'], metrics['entropy'] if not np.isnan(metrics['entropy']) else 0, metrics['coherence'] ] colors = ['#00ffff', '#ff00ff', '#ffff00', '#00ff00'] for i, (name, value, color) in enumerate(zip(metric_names, metric_values, colors)): ax = axes[i//2, i%2] ax.bar([name], [value], color=color, alpha=0.7) ax.set_title(name) ax.set_ylabel('Value') ax.text(0, value, f'{value:.3f}', ha='center', va='bottom') plt.tight_layout() return fig return None def update_parameters(self, singularity_radius=None, wormhole_depth=None, rotation_speed=None): """Обновление параметров сингулярности.""" self.singularity.update_parameters( singularity_radius=singularity_radius, wormhole_depth=wormhole_depth, rotation_speed=rotation_speed ) print(f"✅ Параметры обновлены: r={self.singularity.singularity_radius:.3f}, " f"depth={self.singularity.wormhole_depth:.3f}, speed={self.singularity.rotation_speed:.3f}") def demo_singularity_visualization(): """Демонстрация визуализации сингулярности.""" print("🌀 Демонстрация сингулярной визуализации...") # Создаем визуализатор visualizer = SingularityVisualizer( singularity_radius=0.01, wormhole_depth=2.1, rotation_speed=0.5 ) # Статическая визуализация print("📊 Создание статической визуализации...") fig1 = visualizer.visualize_singularity(show_trajectories=True, show_singularity=True) plt.savefig('singularity_static.png', dpi=300, bbox_inches='tight') print("✅ Статическая визуализация сохранена как 'singularity_static.png'") # Метрики трансформации print("📈 Создание графика метрик...") fig2 = visualizer.show_transformation_metrics() if fig2: plt.savefig('singularity_metrics.png', dpi=300, bbox_inches='tight') print("✅ График метрик сохранен как 'singularity_metrics.png'") # Анимация print("🎬 Создание анимации...") anim = visualizer.animate_singularity(frames=50) anim.save('singularity_animation.gif', writer='pillow', fps=10) print("✅ Анимация сохранена как 'singularity_animation.gif'") # Интерактивная демонстрация print("🖱️ Запуск интерактивной демонстрации...") plt.show() print("🎉 Демонстрация завершена!") if __name__ == "__main__": demo_singularity_visualization()