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.
 
 
 
 

406 lines
12 KiB

from sympy.testing.pytest import raises
from sympy.parsing.sym_expr import SymPyExpression
from sympy.external import import_module
lfortran = import_module('lfortran')
if lfortran:
from sympy.codegen.ast import (Variable, IntBaseType, FloatBaseType, String,
Return, FunctionDefinition, Assignment,
Declaration, CodeBlock)
from sympy.core import Integer, Float, Add
from sympy.core.symbol import Symbol
expr1 = SymPyExpression()
expr2 = SymPyExpression()
src = """\
integer :: a, b, c, d
real :: p, q, r, s
"""
def test_sym_expr():
src1 = (
src +
"""\
d = a + b -c
"""
)
expr3 = SymPyExpression(src,'f')
expr4 = SymPyExpression(src1,'f')
ls1 = expr3.return_expr()
ls2 = expr4.return_expr()
for i in range(0, 7):
assert isinstance(ls1[i], Declaration)
assert isinstance(ls2[i], Declaration)
assert isinstance(ls2[8], Assignment)
assert ls1[0] == Declaration(
Variable(
Symbol('a'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls1[1] == Declaration(
Variable(
Symbol('b'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls1[2] == Declaration(
Variable(
Symbol('c'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls1[3] == Declaration(
Variable(
Symbol('d'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls1[4] == Declaration(
Variable(
Symbol('p'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls1[5] == Declaration(
Variable(
Symbol('q'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls1[6] == Declaration(
Variable(
Symbol('r'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls1[7] == Declaration(
Variable(
Symbol('s'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls2[8] == Assignment(
Variable(Symbol('d')),
Symbol('a') + Symbol('b') - Symbol('c')
)
def test_assignment():
src1 = (
src +
"""\
a = b
c = d
p = q
r = s
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(0, 12):
if iter < 8:
assert isinstance(ls1[iter], Declaration)
else:
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('a')),
Variable(Symbol('b'))
)
assert ls1[9] == Assignment(
Variable(Symbol('c')),
Variable(Symbol('d'))
)
assert ls1[10] == Assignment(
Variable(Symbol('p')),
Variable(Symbol('q'))
)
assert ls1[11] == Assignment(
Variable(Symbol('r')),
Variable(Symbol('s'))
)
def test_binop_add():
src1 = (
src +
"""\
c = a + b
d = a + c
s = p + q + r
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(8, 11):
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('c')),
Symbol('a') + Symbol('b')
)
assert ls1[9] == Assignment(
Variable(Symbol('d')),
Symbol('a') + Symbol('c')
)
assert ls1[10] == Assignment(
Variable(Symbol('s')),
Symbol('p') + Symbol('q') + Symbol('r')
)
def test_binop_sub():
src1 = (
src +
"""\
c = a - b
d = a - c
s = p - q - r
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(8, 11):
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('c')),
Symbol('a') - Symbol('b')
)
assert ls1[9] == Assignment(
Variable(Symbol('d')),
Symbol('a') - Symbol('c')
)
assert ls1[10] == Assignment(
Variable(Symbol('s')),
Symbol('p') - Symbol('q') - Symbol('r')
)
def test_binop_mul():
src1 = (
src +
"""\
c = a * b
d = a * c
s = p * q * r
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(8, 11):
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('c')),
Symbol('a') * Symbol('b')
)
assert ls1[9] == Assignment(
Variable(Symbol('d')),
Symbol('a') * Symbol('c')
)
assert ls1[10] == Assignment(
Variable(Symbol('s')),
Symbol('p') * Symbol('q') * Symbol('r')
)
def test_binop_div():
src1 = (
src +
"""\
c = a / b
d = a / c
s = p / q
r = q / p
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(8, 12):
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('c')),
Symbol('a') / Symbol('b')
)
assert ls1[9] == Assignment(
Variable(Symbol('d')),
Symbol('a') / Symbol('c')
)
assert ls1[10] == Assignment(
Variable(Symbol('s')),
Symbol('p') / Symbol('q')
)
assert ls1[11] == Assignment(
Variable(Symbol('r')),
Symbol('q') / Symbol('p')
)
def test_mul_binop():
src1 = (
src +
"""\
d = a + b - c
c = a * b + d
s = p * q / r
r = p * s + q / p
"""
)
expr1.convert_to_expr(src1, 'f')
ls1 = expr1.return_expr()
for iter in range(8, 12):
assert isinstance(ls1[iter], Assignment)
assert ls1[8] == Assignment(
Variable(Symbol('d')),
Symbol('a') + Symbol('b') - Symbol('c')
)
assert ls1[9] == Assignment(
Variable(Symbol('c')),
Symbol('a') * Symbol('b') + Symbol('d')
)
assert ls1[10] == Assignment(
Variable(Symbol('s')),
Symbol('p') * Symbol('q') / Symbol('r')
)
assert ls1[11] == Assignment(
Variable(Symbol('r')),
Symbol('p') * Symbol('s') + Symbol('q') / Symbol('p')
)
def test_function():
src1 = """\
integer function f(a,b)
integer :: x, y
f = x + y
end function
"""
expr1.convert_to_expr(src1, 'f')
for iter in expr1.return_expr():
assert isinstance(iter, FunctionDefinition)
assert iter == FunctionDefinition(
IntBaseType(String('integer')),
name=String('f'),
parameters=(
Variable(Symbol('a')),
Variable(Symbol('b'))
),
body=CodeBlock(
Declaration(
Variable(
Symbol('a'),
type=IntBaseType(String('integer')),
value=Integer(0)
)
),
Declaration(
Variable(
Symbol('b'),
type=IntBaseType(String('integer')),
value=Integer(0)
)
),
Declaration(
Variable(
Symbol('f'),
type=IntBaseType(String('integer')),
value=Integer(0)
)
),
Declaration(
Variable(
Symbol('x'),
type=IntBaseType(String('integer')),
value=Integer(0)
)
),
Declaration(
Variable(
Symbol('y'),
type=IntBaseType(String('integer')),
value=Integer(0)
)
),
Assignment(
Variable(Symbol('f')),
Add(Symbol('x'), Symbol('y'))
),
Return(Variable(Symbol('f')))
)
)
def test_var():
expr1.convert_to_expr(src, 'f')
ls = expr1.return_expr()
for iter in expr1.return_expr():
assert isinstance(iter, Declaration)
assert ls[0] == Declaration(
Variable(
Symbol('a'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls[1] == Declaration(
Variable(
Symbol('b'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls[2] == Declaration(
Variable(
Symbol('c'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls[3] == Declaration(
Variable(
Symbol('d'),
type = IntBaseType(String('integer')),
value = Integer(0)
)
)
assert ls[4] == Declaration(
Variable(
Symbol('p'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls[5] == Declaration(
Variable(
Symbol('q'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls[6] == Declaration(
Variable(
Symbol('r'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
assert ls[7] == Declaration(
Variable(
Symbol('s'),
type = FloatBaseType(String('real')),
value = Float(0.0)
)
)
else:
def test_raise():
from sympy.parsing.fortran.fortran_parser import ASR2PyVisitor
raises(ImportError, lambda: ASR2PyVisitor())
raises(ImportError, lambda: SymPyExpression(' ', mode = 'f'))