Web Interface
Cadence includes a web-based interface for monitoring and visualizing the evolution process in real-time.
Overview
The web interface provides: - Real-time evolution monitoring - Interactive visualizations of program networks - Performance metrics and charts - Code inspection and comparison - Experiment management
Launching the Interface
Basic Usage
# Start the web interface
cd cadence
python ui/launch_ui.py
# Open browser to http://localhost:5000
Custom Configuration
# Specify port and host
python ui/launch_ui.py --port 8080 --host 0.0.0.0
# Enable debug mode
python ui/launch_ui.py --debug
# Use custom database
python ui/launch_ui.py --db-path /path/to/database.sqlite
Interface Components
Dashboard Overview
The main dashboard displays:
Evolution Status - Current generation and progress - Population size and diversity - Best solution found - Time elapsed and estimated completion
Quick Metrics - Best cost evolution over time - Success rate and feasibility - LLM API usage and costs - System resource utilization
Network Visualization
Interactive network graph showing program relationships:
Nodes - Each node represents a program - Size indicates fitness (larger = better) - Color represents generation - Shape indicates program status (active, elite, failed)
Edges - Lines show parent-child relationships - Thickness indicates similarity - Color represents generation gap
Controls - Zoom in/out with mouse wheel - Pan by dragging - Click nodes to inspect code - Toggle generations on/off
Performance Charts
Multiple visualization types:
Evolution Progress - Line chart of best cost over generations - Population diversity metrics - Convergence indicators
Generation Analysis - Box plots of cost distributions - Histogram of solution quality - Scatter plots of fitness vs. complexity
Comparative Analysis - Multiple experiment comparisons - A/B testing results - Parameter sensitivity analysis
Code Inspector
Detailed code examination:
Code Diff Viewer - Side-by-side comparison of parent and child programs - Highlighted differences and changes - Evolution block focus
Syntax Highlighting - Python syntax highlighting - Error highlighting - Performance annotations
Execution Traces - Program execution logs - Error messages and stack traces - Performance profiling data
Experiment Manager
Control and monitor experiments:
Experiment List - Active and completed experiments - Progress indicators - Quick statistics
Configuration Editor - Modify experiment parameters - Start/stop experiments - Schedule experiments
Results Browser - Download experiment data - Export visualizations - Generate reports
API Endpoints
The web interface exposes REST APIs for programmatic access:
Evolution Status
# Get current evolution status
GET /api/status
Response:
{
"generation": 45,
"population_size": 20,
"best_cost": 123.45,
"diversity": 0.75,
"running": true,
"start_time": "2025-07-08T10:00:00Z"
}
Program Data
# Get all programs
GET /api/programs
# Get specific program
GET /api/programs/{program_id}
# Get programs from generation
GET /api/programs?generation={gen_num}
Response:
{
"programs": [
{
"id": 1,
"code": "def tsp(cities): ...",
"cost": 123.45,
"generation": 45,
"parent_id": 5,
"feasible": true,
"timestamp": "2025-07-08T10:15:00Z"
}
]
}
Performance Metrics
# Get evolution history
GET /api/metrics/evolution
# Get generation statistics
GET /api/metrics/generation/{gen_num}
# Get performance summary
GET /api/metrics/summary
Response:
{
"generations": [
{
"generation": 1,
"best_cost": 245.67,
"average_cost": 456.78,
"diversity": 0.85,
"feasible_count": 18
}
]
}
Control Operations
# Start evolution
POST /api/control/start
{
"task": "tsp",
"generations": 100,
"population_size": 20
}
# Stop evolution
POST /api/control/stop
# Pause/resume
POST /api/control/pause
POST /api/control/resume
# Reset evolution
POST /api/control/reset
Real-time Updates
The interface uses WebSocket connections for real-time updates:
JavaScript Client
// Connect to WebSocket
const socket = io();
// Listen for evolution updates
socket.on('evolution_update', (data) => {
updateDashboard(data);
updateCharts(data);
});
// Listen for new programs
socket.on('new_program', (program) => {
addProgramToNetwork(program);
updateMetrics();
});
// Listen for generation completion
socket.on('generation_complete', (stats) => {
updateGenerationStats(stats);
refreshVisualization();
});
Server Events
# In Flask app
from flask_socketio import emit, SocketIO
socketio = SocketIO(app)
def on_evolution_update(data):
"""Broadcast evolution updates to all clients."""
socketio.emit('evolution_update', data)
def on_new_program(program):
"""Broadcast new program creation."""
socketio.emit('new_program', program.to_dict())
def on_generation_complete(generation_stats):
"""Broadcast generation completion."""
socketio.emit('generation_complete', generation_stats)
Customization
Adding Custom Visualizations
// Custom chart component
function createCustomChart(containerId, data) {
const svg = d3.select(containerId)
.append('svg')
.attr('width', 800)
.attr('height', 400);
// Custom visualization logic
const chart = new CustomChart(svg, data);
return chart;
}
// Register custom chart
registerVisualization('custom_metric', createCustomChart);
Custom Metrics
# In ui/app.py
@app.route('/api/metrics/custom')
def custom_metrics():
"""Provide custom metrics for visualization."""
# Calculate custom metrics
complexity_scores = calculate_complexity_scores()
innovation_scores = calculate_innovation_scores()
return jsonify({
'complexity': complexity_scores,
'innovation': innovation_scores
})
Theme Customization
/* Custom theme in static/css/custom.css */
:root {
--primary-color: #2C3E50;
--secondary-color: #3498DB;
--success-color: #27AE60;
--warning-color: #F39C12;
--danger-color: #E74C3C;
}
.dashboard-card {
background: var(--primary-color);
color: white;
border-radius: 8px;
padding: 20px;
margin: 10px;
}
.network-node {
stroke: var(--secondary-color);
stroke-width: 2px;
}
Configuration
Web Server Configuration
# ui/config.py
class WebConfig:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'dev-key'
HOST = os.environ.get('CADENCE_HOST') or '127.0.0.1'
PORT = int(os.environ.get('CADENCE_PORT') or 5000)
DEBUG = os.environ.get('CADENCE_DEBUG') == 'true'
# Database
DATABASE_URL = os.environ.get('DATABASE_URL') or 'sqlite:///cadence_db.sqlite'
# Real-time updates
WEBSOCKET_ENABLED = True
UPDATE_INTERVAL = 1.0 # seconds
# Security
CORS_ORIGINS = ['http://localhost:3000', 'http://127.0.0.1:3000']
MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB
Client Configuration
// static/js/config.js
const CONFIG = {
API_BASE_URL: '/api',
WEBSOCKET_URL: window.location.origin,
UPDATE_INTERVALS: {
dashboard: 2000, // 2 seconds
network: 5000, // 5 seconds
charts: 3000 // 3 seconds
},
VISUALIZATION: {
network: {
nodeSize: [5, 50],
linkDistance: 100,
charge: -300
},
charts: {
animation: true,
responsive: true,
theme: 'light'
}
}
};
Deployment
Production Deployment
# ui/wsgi.py
from ui.app import create_app
import os
app = create_app(os.environ.get('FLASK_ENV') or 'production')
if __name__ == "__main__":
app.run()
# Using Gunicorn
pip install gunicorn
gunicorn --worker-class eventlet -w 1 --bind 0.0.0.0:5000 ui.wsgi:app
# Using uWSGI
pip install uwsgi
uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file ui/wsgi.py --callable app
Docker Deployment
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["gunicorn", "--worker-class", "eventlet", "-w", "1", "--bind", "0.0.0.0:5000", "ui.wsgi:app"]
# docker-compose.yml
version: '3.8'
services:
cadence-ui:
build: .
ports:
- "5000:5000"
environment:
- CADENCE_DB_PATH=/data/cadence.sqlite
- CADENCE_HOST=0.0.0.0
volumes:
- ./data:/data
restart: unless-stopped
Reverse Proxy Configuration
# nginx.conf
server {
listen 80;
server_name cadence.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket support
location /socket.io/ {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
# Static files
location /static/ {
alias /app/ui/static/;
expires 1y;
add_header Cache-Control public;
}
}
Troubleshooting
Common Issues
Port Already in Use
# Find process using port
lsof -i :5000
# Kill process
kill -9 <PID>
# Use different port
python ui/launch_ui.py --port 8080
WebSocket Connection Failed
// Check connection status
socket.on('connect', () => {
console.log('Connected to server');
});
socket.on('disconnect', () => {
console.log('Disconnected from server');
});
socket.on('connect_error', (error) => {
console.error('Connection error:', error);
});
Database Access Issues
# Check database permissions
import sqlite3
try:
conn = sqlite3.connect('cadence_db.sqlite')
conn.close()
print("Database accessible")
except Exception as e:
print(f"Database error: {e}")
Performance Optimization
Large Datasets
# Implement pagination
@app.route('/api/programs')
def get_programs():
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 50, type=int)
programs = query_programs_paginated(page, per_page)
return jsonify(programs)
Memory Usage
# Use generators for large datasets
def stream_evolution_data():
for generation in get_generations():
yield json.dumps(generation) + '\n'
@app.route('/api/evolution/stream')
def stream_evolution():
return Response(stream_evolution_data(),
mimetype='application/json')
Caching
from flask_caching import Cache
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
@app.route('/api/metrics/summary')
@cache.cached(timeout=60) # Cache for 1 minute
def metrics_summary():
return calculate_metrics_summary()