
    Ui                         U d Z ddlZddlmZ ddddddd	d
dddddZeeeeef   f   ed<   	 ddedededefdZ		 	 	 ddededededef
dZ
	 	 ddedededededefdZy)al  Ebbinghaus forgetting curve mathematics.

R = e^(-t/S)

Where:
  R = retention (0.0 to 1.0)
  t = time since last access (hours)
  S = memory strength = base_strength * access_multiplier * surprise_bonus

The Ebbinghaus forgetting curve models how memory retention decays
exponentially over time. This implementation extends the basic model
with two reinforcement factors:

  1. Access reinforcement (spaced repetition): Each access strengthens
     the memory using logarithmic scaling -- the first few accesses
     have the biggest impact, diminishing returns after that.

  2. Surprise bonus: Higher surprise scores produce more vivid memories
     that resist decay longer.

Reference values (base_strength=24.0, access_count=1, surprise_score=0.5):
  - t=0h  -> R=1.0   (just accessed)
  - t=24h -> R~0.37  (e^-1)
  - t=48h -> R~0.14  (e^-2)
  - t=72h -> R~0.05  (e^-3)
    N)Dict   g?)threshold_daysretention_floor   g333333?Z   g?        )
aggressivemoderateconservativeinfiniteDECAY_POLICIESaccess_countsurprise_scorebase_strengthreturnc                     t        d|       } t        dt        d|            }t        d|      }dt        j                  |       z   }dd|z  z   }||z  |z  }|S )a  Calculate memory strength S from access count and surprise score.

    S = base_strength * access_multiplier * surprise_bonus

    Access multiplier uses logarithmic scaling (not linear) so that
    the first few accesses have the largest effect:
      multiplier = 1 + ln(access_count)

    Surprise bonus scales linearly from 0.5 (score=0) to 2.0 (score=1):
      bonus = 0.5 + 1.5 * surprise_score

    Args:
        access_count: Number of times this memory has been accessed.
                      Clamped to minimum 1.
        surprise_score: Surprise score in [0.0, 1.0]. Clamped.
        base_strength: Base strength in hours. Default 24.0 means
                       ~37% retention after 24h with no reinforcement.

    Returns:
        Memory strength S (positive float, in hours).
       r
         ?      ?g      ?)maxminmathlog)r   r   r   access_multipliersurprise_bonusstrengths         ./mnt/e/genesis-system/core/rlm/decay_curves.pycalculate_strengthr    +   sk    6 q,'Lc#~67N]+M dhh|44 3//N00>AHO    hours_since_accessc                     | dk  ryt        |||      }t        j                  |  |z        }t        dt	        d|            S )aF  Calculate memory retention using Ebbinghaus forgetting curve.

    R = e^(-t/S)

    Where:
      t = hours_since_access
      S = calculate_strength(access_count, surprise_score, base_strength)

    Args:
        hours_since_access: Time since memory was last accessed, in hours.
                            Non-negative. Values <= 0 return 1.0.
        access_count: Number of times this memory has been accessed.
        surprise_score: Surprise score in [0.0, 1.0].
        base_strength: Base strength in hours.

    Returns:
        Retention value clamped to [0.0, 1.0].
    r   r   r
   )r    r   expr   r   )r"   r   r   r   r   	retentions         r   calculate_retentionr&   T   sL    2 Q!,NH ,,x78I sCY'((r!   policyc           	         t         j                  |      }|,t        d|dt        t         j	                                      |d   dk  ry|d   dz  }| dk  ry| |k  ryt        | |||      }|d   }||k  r|dk  r|d	k\  ry
y|dk  ry
y)a  Determine decay action for a memory given its state and policy.

    Args:
        hours_since_access: Time since last access in hours.
        access_count: Number of times accessed.
        surprise_score: Surprise score in [0.0, 1.0].
        policy: One of "aggressive", "moderate", "conservative", "infinite".
        base_strength: Base strength in hours.

    Returns:
        One of: "retain", "demote", "delete"
    zUnknown decay policy: z	. Valid: r   r   retain      8@r      g?demotedeleter   )r   get
ValueErrorlistkeysr&   )	r"   r   r   r'   r   configthreshold_hoursr%   r   s	            r   should_decayr4   y   s    & 'F~1& <##'(;(;(=#>"?A B 	B !#-.5O D  O+#L.-I ./O ?"|a'7T!3r!   )r*   )r   r   r*   )r   r*   )__doc__r   typingr   r   strfloat__annotations__intr    r&   r4    r!   r   <module>r<      s  4   &'3?#%#>')cB#%#>	/S$sEz**+   &&& & 	&V 	")")") ") 	")
 ")R 555 5 	5
 5 	5r!   