Digital-Galatea / quantum_emotion_service.py
codejedi's picture
Replace quantum random number API with regular random numbers
273a32a
"""Random Emotion Service - Background service for random-influenced emotion updates"""
import os
import sys
import time
import logging
import random
import threading
from collections import deque
# Add parent directory to path for imports
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from config import MODEL_CONFIG
class QuantumEmotionService:
"""Background service that generates random numbers and applies them to emotions"""
def __init__(self, emotional_agent, config=None):
self.config = config or MODEL_CONFIG or {}
self.emotional_agent = emotional_agent
self.running = False
self.thread = None
self.random_numbers = deque(maxlen=6) # Store last 6 numbers
self.last_update_time = time.time()
self.update_interval = 10.0 # Update emotions every 10 seconds
self.generation_interval = 1.0 # Generate number once per second
logging.info("[RandomEmotionService] Initialized - will generate random numbers once per second")
def _generate_random_number(self):
"""Generate a single random number"""
return random.random()
def _apply_random_emotions(self):
"""Apply the collected 6 random numbers to influence emotion state"""
if len(self.random_numbers) < 6:
logging.debug(f"[RandomEmotionService] Not enough numbers yet ({len(self.random_numbers)}/6)")
return
# Convert deque to list
numbers = list(self.random_numbers)
# Map 6 numbers to 5 emotions + overall variation
# numbers[0] -> joy
# numbers[1] -> sadness
# numbers[2] -> anger
# numbers[3] -> fear
# numbers[4] -> curiosity
# numbers[5] -> overall variation factor
emotions = ["joy", "sadness", "anger", "fear", "curiosity"]
current_state = self.emotional_agent.get_state()
# Apply random influence (subtle changes, -0.05 to +0.05 range)
for i, emotion in enumerate(emotions):
if i < len(numbers) and numbers[i] is not None:
# Convert 0-1 to -0.05 to +0.05 influence
influence = (numbers[i] - 0.5) * 0.1 # Scale to ±0.05
# Apply with overall variation factor
if len(numbers) > 5 and numbers[5] is not None:
variation = (numbers[5] - 0.5) * 0.02 # Additional ±0.01 variation
influence += variation
# Update emotion
new_value = current_state[emotion] + influence
current_state[emotion] = max(0.05, min(1.0, new_value))
# Soft normalization to keep emotions balanced (only if they get too extreme)
total = sum(current_state.values())
if total > 1.5 or total < 0.5:
# Only normalize if emotions are way out of balance
for emotion in emotions:
current_state[emotion] = current_state[emotion] / total if total > 0 else 0.2
else:
# Just ensure no emotion goes below minimum threshold
for emotion in emotions:
if current_state[emotion] < 0.05:
current_state[emotion] = 0.05
# Update the emotional agent's state
self.emotional_agent.emotional_state = current_state
# Save to JSON after random update
self.emotional_agent._save_to_json()
logging.info(f"[RandomEmotionService] Applied random influence: {current_state}")
def _service_loop(self):
"""Main service loop - generates random numbers once per second, updates emotions every 10 seconds"""
logging.info("[RandomEmotionService] Service started")
while self.running:
try:
# Generate random number (once per second)
random_num = self._generate_random_number()
self.random_numbers.append(random_num)
logging.debug(f"[RandomEmotionService] Generated random number: {random_num:.4f}")
# Check if it's time to update emotions (every 10 seconds)
current_time = time.time()
if current_time - self.last_update_time >= self.update_interval:
if len(self.random_numbers) >= 6:
self._apply_random_emotions()
self.last_update_time = current_time
logging.info(f"[RandomEmotionService] Updated emotions with {len(self.random_numbers)} random numbers")
# Wait 1 second before next generation
time.sleep(self.generation_interval)
except Exception as e:
logging.error(f"[RandomEmotionService] Error in service loop: {e}")
time.sleep(self.generation_interval) # Wait before retrying
def start(self):
"""Start the background service"""
if self.running:
logging.warning("[RandomEmotionService] Already running")
return False
self.running = True
self.thread = threading.Thread(target=self._service_loop, daemon=True)
self.thread.start()
logging.info("[RandomEmotionService] Background service started")
return True
def stop(self):
"""Stop the background service"""
if not self.running:
return
self.running = False
if self.thread:
self.thread.join(timeout=2.0)
logging.info("[RandomEmotionService] Background service stopped")
def is_running(self):
"""Check if service is running"""
return self.running