Coverage for /usr/lib/python3/dist-packages/sympy/utilities/memoization.py: 28%

32 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-14 15:55 +0200

1from functools import wraps 

2 

3 

4def recurrence_memo(initial): 

5 """ 

6 Memo decorator for sequences defined by recurrence 

7 

8 See usage examples e.g. in the specfun/combinatorial module 

9 """ 

10 cache = initial 

11 

12 def decorator(f): 

13 @wraps(f) 

14 def g(n): 

15 L = len(cache) 

16 if n <= L - 1: 

17 return cache[n] 

18 for i in range(L, n + 1): 

19 cache.append(f(i, cache)) 

20 return cache[-1] 

21 return g 

22 return decorator 

23 

24 

25def assoc_recurrence_memo(base_seq): 

26 """ 

27 Memo decorator for associated sequences defined by recurrence starting from base 

28 

29 base_seq(n) -- callable to get base sequence elements 

30 

31 XXX works only for Pn0 = base_seq(0) cases 

32 XXX works only for m <= n cases 

33 """ 

34 

35 cache = [] 

36 

37 def decorator(f): 

38 @wraps(f) 

39 def g(n, m): 

40 L = len(cache) 

41 if n < L: 

42 return cache[n][m] 

43 

44 for i in range(L, n + 1): 

45 # get base sequence 

46 F_i0 = base_seq(i) 

47 F_i_cache = [F_i0] 

48 cache.append(F_i_cache) 

49 

50 # XXX only works for m <= n cases 

51 # generate assoc sequence 

52 for j in range(1, i + 1): 

53 F_ij = f(i, j, cache) 

54 F_i_cache.append(F_ij) 

55 

56 return cache[n][m] 

57 

58 return g 

59 return decorator