refactor: introduce registries for OCP compliance (Phase 1)
This commit is contained in:
parent
2b3362a927
commit
56996691d8
1 changed files with 73 additions and 30 deletions
|
|
@ -29,6 +29,73 @@ from jinja2 import Template
|
||||||
import sympy
|
import sympy
|
||||||
from sympy.printing.fortran import FCodePrinter
|
from sympy.printing.fortran import FCodePrinter
|
||||||
|
|
||||||
|
# --- Registries for SOLID (OCP) Compliance ---
|
||||||
|
|
||||||
|
class FunctionRegistry:
|
||||||
|
def __init__(self):
|
||||||
|
self._sympy_registry = {}
|
||||||
|
self._latex_registry = {}
|
||||||
|
|
||||||
|
def register_sympy(self, name, sympy_builder):
|
||||||
|
self._sympy_registry[name] = sympy_builder
|
||||||
|
|
||||||
|
def register_latex(self, name, latex_builder):
|
||||||
|
self._latex_registry[name] = latex_builder
|
||||||
|
|
||||||
|
def to_sympy(self, name, *args):
|
||||||
|
if name in self._sympy_registry:
|
||||||
|
return self._sympy_registry[name](*args)
|
||||||
|
return sympy.Function(name)(*args)
|
||||||
|
|
||||||
|
def to_latex(self, name, *args):
|
||||||
|
if name in self._latex_registry:
|
||||||
|
return self._latex_registry[name](*args)
|
||||||
|
b = ", ".join(args)
|
||||||
|
if name.startswith("\\"):
|
||||||
|
return r"{}{{({})}}".format(name, b)
|
||||||
|
return r"\mathrm{{{}}}({})".format(name, b)
|
||||||
|
|
||||||
|
function_registry = FunctionRegistry()
|
||||||
|
|
||||||
|
# Register standard mathematical functions
|
||||||
|
function_registry.register_sympy("sqrt", lambda *args: sympy.sqrt(args[0]))
|
||||||
|
function_registry.register_sympy("abs", lambda *args: sympy.Abs(args[0]))
|
||||||
|
function_registry.register_sympy("log", lambda *args: sympy.log(args[0]))
|
||||||
|
function_registry.register_sympy("exp", lambda *args: sympy.exp(args[0]))
|
||||||
|
function_registry.register_sympy("rxn_rate", lambda *args: sympy.Function("rxn_rate")(args[0]))
|
||||||
|
|
||||||
|
function_registry.register_latex("sqrt", lambda *args: r"\sqrt{{{}}}".format(", ".join(args)))
|
||||||
|
function_registry.register_latex("abs", lambda *args: r"\left| {} \right|".format(", ".join(args)))
|
||||||
|
function_registry.register_latex(r"\log", lambda *args: r"\log{{({})}}".format(", ".join(args)))
|
||||||
|
function_registry.register_latex(r"\exp", lambda *args: r"\exp{{({})}}".format(", ".join(args)))
|
||||||
|
function_registry.register_latex(r"\omega", lambda *args: r"\omega{{({})}}".format(", ".join(args)))
|
||||||
|
|
||||||
|
|
||||||
|
class DifferentialOperatorRegistry:
|
||||||
|
def __init__(self):
|
||||||
|
self._operators = {}
|
||||||
|
|
||||||
|
def register(self, op_name, latex_symbol):
|
||||||
|
self._operators[op_name] = latex_symbol
|
||||||
|
|
||||||
|
def get_latex_symbol(self, op_name):
|
||||||
|
if op_name in self._operators:
|
||||||
|
return self._operators[op_name]
|
||||||
|
# Fallback to dynamic parsing matching original code
|
||||||
|
fmt = r"\partial_{{{}}}"
|
||||||
|
coord = op_name[-1] if op_name else ""
|
||||||
|
return fmt.format(coord + coord if len(op_name) > 3 else coord)
|
||||||
|
|
||||||
|
differential_operator_registry = DifferentialOperatorRegistry()
|
||||||
|
|
||||||
|
# Register standard derivative operators
|
||||||
|
differential_operator_registry.register("ddx", r"\partial_{x}")
|
||||||
|
differential_operator_registry.register("d2dx", r"\partial_{xx}")
|
||||||
|
differential_operator_registry.register("ddy", r"\partial_{y}")
|
||||||
|
differential_operator_registry.register("d2dy", r"\partial_{yy}")
|
||||||
|
differential_operator_registry.register("ddz", r"\partial_{z}")
|
||||||
|
differential_operator_registry.register("d2dz", r"\partial_{zz}")
|
||||||
|
|
||||||
@v_args(inline=True)
|
@v_args(inline=True)
|
||||||
class LarkToSympy(Transformer):
|
class LarkToSympy(Transformer):
|
||||||
"""Lark AST의 수학적 노드들을 SymPy 기호 수식 객체로 변환하는 Transformer 클래스입니다.
|
"""Lark AST의 수학적 노드들을 SymPy 기호 수식 객체로 변환하는 Transformer 클래스입니다.
|
||||||
|
|
@ -81,19 +148,9 @@ class LarkToSympy(Transformer):
|
||||||
# 내장 수학 함수(sqrt, exp, log, abs, rxn_rate) 또는 사용자 정의 UDF들을 SymPy 함수 노드로 매핑
|
# 내장 수학 함수(sqrt, exp, log, abs, rxn_rate) 또는 사용자 정의 UDF들을 SymPy 함수 노드로 매핑
|
||||||
a = args[0]
|
a = args[0]
|
||||||
func_name = a.value if hasattr(a, 'value') else str(a)
|
func_name = a.value if hasattr(a, 'value') else str(a)
|
||||||
if func_name == "sqrt":
|
if func_name == "udf":
|
||||||
return sympy.sqrt(args[1])
|
return sympy.Function(a.value if hasattr(a, 'value') else str(a))(*args[1:])
|
||||||
elif func_name == "exp":
|
return function_registry.to_sympy(func_name, *args[1:])
|
||||||
return sympy.exp(args[1])
|
|
||||||
elif func_name == "log":
|
|
||||||
return sympy.log(args[1])
|
|
||||||
elif func_name == "abs":
|
|
||||||
return sympy.Abs(args[1])
|
|
||||||
elif func_name == "rxn_rate":
|
|
||||||
return sympy.Function("rxn_rate")(args[1])
|
|
||||||
elif func_name == "udf":
|
|
||||||
return sympy.Function(a.value)(*args[1:])
|
|
||||||
return sympy.Function(func_name)(*args[1:])
|
|
||||||
|
|
||||||
def neg(self, val):
|
def neg(self, val):
|
||||||
return -val
|
return -val
|
||||||
|
|
@ -574,19 +631,8 @@ class ExpToLatex(Transformer):
|
||||||
|
|
||||||
def fcall (self, *args):
|
def fcall (self, *args):
|
||||||
a = args[0]
|
a = args[0]
|
||||||
b = ", ".join(args[1:])
|
func_name = a.value if hasattr(a, 'value') else str(a)
|
||||||
if a == 'sqrt':
|
return function_registry.to_latex(func_name, *args[1:])
|
||||||
fcode = r"\sqrt{{{}}}".format(b)
|
|
||||||
return fcode
|
|
||||||
elif a == 'abs':
|
|
||||||
fcode = r"\left| {} \right|".format(b)
|
|
||||||
return fcode
|
|
||||||
elif a.startswith("\\"):
|
|
||||||
fcode = r"{}{{({})}}".format(a, b)
|
|
||||||
return fcode
|
|
||||||
else:
|
|
||||||
fcode = r"\mathrm{{{}}}({})".format(a, b)
|
|
||||||
return fcode
|
|
||||||
|
|
||||||
def neg(self, b):
|
def neg(self, b):
|
||||||
fcode = "(-{})".format(b)
|
fcode = "(-{})".format(b)
|
||||||
|
|
@ -1129,10 +1175,7 @@ class DerivedField (FieldBase):
|
||||||
self.v = v
|
self.v = v
|
||||||
self.dep = set([v])
|
self.dep = set([v])
|
||||||
|
|
||||||
fmt = r"\partial_{{{}}}"
|
partial = differential_operator_registry.get_latex_symbol(op)
|
||||||
coord = op[-1]
|
|
||||||
partial = fmt.format(coord + coord if len(op) > 3 else coord)
|
|
||||||
|
|
||||||
self.latex = partial + "(" + fdict[v].latex + ")"
|
self.latex = partial + "(" + fdict[v].latex + ")"
|
||||||
|
|
||||||
def code (self, alloc=None):
|
def code (self, alloc=None):
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue