Source code for mercurial.consciousness.perception

"""Bayesian perception as variational free energy minimization (MERCURIAL D)."""

from typing import Optional

import numpy as np

from mercurial.core.patterns import Pattern


[docs] class VariationalPerception: """ Implements perception as pattern completion: - Bottom‑up: sensory input constrains conscious state - Top‑down: prior expectations bias interpretation - Minimizes variational free energy F_perc = KL[q||p] - E_q[log p(s|h)] """ def __init__(self, prior_strength: float = 1.0, learning_rate: float = 0.1): self.prior_strength = prior_strength self.lr = learning_rate
[docs] def free_energy( self, sensory_input: np.ndarray, hidden_state: np.ndarray, prior: Optional[np.ndarray] = None, ) -> float: """ F = ||sensory - hidden||^2 + β_prior ||hidden - prior||^2 This is a simplified Gaussian approximation. """ likelihood = np.linalg.norm(sensory_input - hidden_state) ** 2 if prior is not None: prior_term = self.prior_strength * np.linalg.norm(hidden_state - prior) ** 2 else: prior_term = 0.0 return likelihood + prior_term
[docs] def infer_hidden_state( self, sensory_input: np.ndarray, prior: Optional[np.ndarray] = None, max_iter: int = 20 ) -> np.ndarray: """ Gradient descent on F to find the most likely hidden state (percept). """ if prior is not None: hidden = prior.copy() else: hidden = sensory_input.copy() for _ in range(max_iter): grad = 2 * (hidden - sensory_input) if prior is not None: grad += 2 * self.prior_strength * (hidden - prior) hidden -= self.lr * grad return hidden
[docs] def update_consciousness_from_reality( self, consciousness_pattern: Pattern, reality_pattern: Pattern ) -> Pattern: """ Bottom‑up update: consciousness pattern is pulled toward reality pattern via variational inference. This implements reality → consciousness causation. """ # Treat reality pattern as sensory input sensory = reality_pattern.V prior = consciousness_pattern.V new_V = self.infer_hidden_state(sensory, prior) return Pattern( new_V, consciousness_pattern.C, consciousness_pattern.R, label=f"{consciousness_pattern.label}_updated", )