m2m模型翻译
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.9 KiB

6 months ago
  1. """ Generic SymPy-Independent Strategies """
  2. identity = lambda x: x
  3. def exhaust(rule):
  4. """ Apply a rule repeatedly until it has no effect """
  5. def exhaustive_rl(expr):
  6. new, old = rule(expr), expr
  7. while new != old:
  8. new, old = rule(new), new
  9. return new
  10. return exhaustive_rl
  11. def memoize(rule):
  12. """ Memoized version of a rule """
  13. cache = {}
  14. def memoized_rl(expr):
  15. if expr in cache:
  16. return cache[expr]
  17. else:
  18. result = rule(expr)
  19. cache[expr] = result
  20. return result
  21. return memoized_rl
  22. def condition(cond, rule):
  23. """ Only apply rule if condition is true """
  24. def conditioned_rl(expr):
  25. if cond(expr):
  26. return rule(expr)
  27. else:
  28. return expr
  29. return conditioned_rl
  30. def chain(*rules):
  31. """
  32. Compose a sequence of rules so that they apply to the expr sequentially
  33. """
  34. def chain_rl(expr):
  35. for rule in rules:
  36. expr = rule(expr)
  37. return expr
  38. return chain_rl
  39. def debug(rule, file=None):
  40. """ Print out before and after expressions each time rule is used """
  41. if file is None:
  42. from sys import stdout
  43. file = stdout
  44. def debug_rl(*args, **kwargs):
  45. expr = args[0]
  46. result = rule(*args, **kwargs)
  47. if result != expr:
  48. file.write("Rule: %s\n" % rule.__name__)
  49. file.write("In: %s\nOut: %s\n\n"%(expr, result))
  50. return result
  51. return debug_rl
  52. def null_safe(rule):
  53. """ Return original expr if rule returns None """
  54. def null_safe_rl(expr):
  55. result = rule(expr)
  56. if result is None:
  57. return expr
  58. else:
  59. return result
  60. return null_safe_rl
  61. def tryit(rule, exception):
  62. """ Return original expr if rule raises exception """
  63. def try_rl(expr):
  64. try:
  65. return rule(expr)
  66. except exception:
  67. return expr
  68. return try_rl
  69. def do_one(*rules):
  70. """ Try each of the rules until one works. Then stop. """
  71. def do_one_rl(expr):
  72. for rl in rules:
  73. result = rl(expr)
  74. if result != expr:
  75. return result
  76. return expr
  77. return do_one_rl
  78. def switch(key, ruledict):
  79. """ Select a rule based on the result of key called on the function """
  80. def switch_rl(expr):
  81. rl = ruledict.get(key(expr), identity)
  82. return rl(expr)
  83. return switch_rl
  84. def minimize(*rules, objective=identity):
  85. """ Select result of rules that minimizes objective
  86. >>> from sympy.strategies import minimize
  87. >>> inc = lambda x: x + 1
  88. >>> dec = lambda x: x - 1
  89. >>> rl = minimize(inc, dec)
  90. >>> rl(4)
  91. 3
  92. >>> rl = minimize(inc, dec, objective=lambda x: -x) # maximize
  93. >>> rl(4)
  94. 5
  95. """
  96. def minrule(expr):
  97. return min([rule(expr) for rule in rules], key=objective)
  98. return minrule