Source code for mercurial.tests.enhancements.test_pattern_completion

"""Test pattern completion for olfactory/gustatory modalities – corrected."""

import matplotlib.pyplot as plt
import numpy as np

from mercurial.simulation.engine import SimulationEngine

# Create two stored patterns (e.g., odour A and B)
N = 50
pattern_A = np.random.choice([0, 1], size=N)
pattern_B = 1 - pattern_A  # orthogonal

stored = [pattern_A, pattern_B]


# Input function: 80% of pattern A (strong partial cue) for first 2 seconds
[docs] def partial_input(t): if t < 2.0: # 80% of pattern A (stronger cue) partial = pattern_A.copy() mask = np.random.choice([0, 1], size=N, p=[0.2, 0.8]) # 80% ones partial[mask == 0] = 0.0 return partial * 5.0 # scale input to increase influence else: return np.zeros(N)
engine = SimulationEngine(dim=10) res = engine.run_pattern_completion( (0.0, 4.0), dt=0.001, n_neurons=N, stored_patterns=stored, input_function=partial_input ) # Plot overlap with pattern A plt.figure(figsize=(10, 4)) plt.plot(res["t"], res["overlap"], label="Overlap with pattern A") plt.xlabel("Time (s)") plt.ylabel("Overlap") plt.title("Pattern Completion: Partial Odour Input (corrected)") plt.axhline(y=0.5, color="r", linestyle="--", label="Chance level") plt.ylim(0, 1) plt.legend() plt.grid(True, alpha=0.3) plt.show() # Visualise final activity pattern final_r = res["r"][-1] plt.figure(figsize=(12, 4)) plt.subplot(1, 3, 1) plt.imshow(pattern_A.reshape(1, -1), cmap="gray", aspect="auto") plt.title("Pattern A") plt.subplot(1, 3, 2) plt.imshow(pattern_B.reshape(1, -1), cmap="gray", aspect="auto") plt.title("Pattern B") plt.subplot(1, 3, 3) plt.imshow(final_r.reshape(1, -1), cmap="hot", aspect="auto") plt.title("Final Network State") plt.tight_layout() plt.show() print(f"Final overlap with pattern A: {res['overlap'][-1]:.3f}")