Skip to content

Commit 4f01217

Browse files
committed
Restructured to clean up SymEngine module
1 parent 9e87548 commit 4f01217

File tree

2 files changed

+52
-44
lines changed

2 files changed

+52
-44
lines changed

lib/symengine.rb

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,28 +33,32 @@ def Function(n)
3333
def evalf(operand, prec=53, real=false)
3434
return _evalf(operand, prec, real)
3535
end
36-
def evalf_dirichlet_eta(exp)
37-
SymEngine::evalf(SymEngine::dirichlet_eta(exp))
38-
end
39-
def evalf_zeta(exp)
40-
SymEngine::evalf(SymEngine::zeta(exp))
41-
end
42-
def lambdify_code(exp)
43-
sym_map = exp.free_symbols.map { |sym| sym.to_s}.sort.join(",")
44-
str = exp.to_s
45-
str.gsub!(/[\d\.]+/, 'Rational(\0,1)')
46-
replacements = { sin:"Math.sin", cos: "Math.cos", tan: "Math.tan",
47-
asin:"Math.asin", acos: "Math.acos", atan: "Math.atan",
48-
sinh:"Math.sinh", cosh: "Math.cosh", tanh: "Math.tanh",
49-
asinh:"Math.asinh", acosh: "Math.acosh", atanh: "Math.atanh",
50-
pi: "Math::PI", E: "Math::E",
51-
dirichlet_eta: "SymEngine::evalf_dirichlet_eta",
52-
zeta: "SymEngine::evalf_zeta", gamma: "Math.gamma" }
53-
replacements.each {|key, value| str.gsub!(/(\b#{key}\b)/, value)}
54-
"lambda { | #{sym_map} | #{str} }"
55-
end
5636
def lambdify(exp)
57-
eval(lambdify_code(exp))
37+
eval(SymEngine::Utils::lambdify_code(exp))
38+
end
39+
end
40+
module Utils
41+
class << self
42+
def evalf_dirichlet_eta(exp)
43+
SymEngine::evalf(SymEngine::dirichlet_eta(exp))
44+
end
45+
def evalf_zeta(exp)
46+
SymEngine::evalf(SymEngine::zeta(exp))
47+
end
48+
def lambdify_code(exp)
49+
sym_map = exp.free_symbols.map { |sym| sym.to_s}.sort.join(",")
50+
str = exp.to_s
51+
str.gsub!(/[\d\.]+/, 'Rational(\0,1)')
52+
replacements = { sin:"Math.sin", cos: "Math.cos", tan: "Math.tan",
53+
asin:"Math.asin", acos: "Math.acos", atan: "Math.atan",
54+
sinh:"Math.sinh", cosh: "Math.cosh", tanh: "Math.tanh",
55+
asinh:"Math.asinh", acosh: "Math.acosh", atanh: "Math.atanh",
56+
pi: "Math::PI", E: "Math::E",
57+
dirichlet_eta: "SymEngine::Utils::evalf_dirichlet_eta",
58+
zeta: "SymEngine::Utils::evalf_zeta", gamma: "Math.gamma" }
59+
replacements.each {|key, value| str.gsub!(/(\b#{key}\b)/, value)}
60+
"lambda { | #{sym_map} | #{str} }"
61+
end
5862
end
5963
end
6064
end

spec/lambdify_spec.rb

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,30 @@
44
let(:y) { SymEngine::Symbol.new('y') }
55
let(:z) { SymEngine::Symbol.new('z') }
66

7+
def l(code)
8+
SymEngine::Utils::lambdify_code(code)
9+
end
10+
711
it 'creates lambda codes' do
8-
expect(SymEngine::lambdify_code( x + y + z )).to eq("lambda { | x,y,z | x + y + z }")
9-
expect(SymEngine::lambdify_code( x + 5 )).to eq("lambda { | x | Rational(5,1) + x }")
10-
expect(SymEngine::lambdify_code( SymEngine::sin(x) )).to eq("lambda { | x | Math.sin(x) }")
11-
expect(SymEngine::lambdify_code( SymEngine::cos(x) )).to eq("lambda { | x | Math.cos(x) }")
12-
expect(SymEngine::lambdify_code( SymEngine::tan(x) )).to eq("lambda { | x | Math.tan(x) }")
13-
expect(SymEngine::lambdify_code( SymEngine::asin(x) )).to eq("lambda { | x | Math.asin(x) }")
14-
expect(SymEngine::lambdify_code( SymEngine::acos(x) )).to eq("lambda { | x | Math.acos(x) }")
15-
expect(SymEngine::lambdify_code( SymEngine::atan(x) )).to eq("lambda { | x | Math.atan(x) }")
16-
expect(SymEngine::lambdify_code( SymEngine::sinh(x) )).to eq("lambda { | x | Math.sinh(x) }")
17-
expect(SymEngine::lambdify_code( SymEngine::cosh(x) )).to eq("lambda { | x | Math.cosh(x) }")
18-
expect(SymEngine::lambdify_code( SymEngine::tanh(x) )).to eq("lambda { | x | Math.tanh(x) }")
19-
expect(SymEngine::lambdify_code( SymEngine::asinh(x) )).to eq("lambda { | x | Math.asinh(x) }")
20-
expect(SymEngine::lambdify_code( SymEngine::acosh(x) )).to eq("lambda { | x | Math.acosh(x) }")
21-
expect(SymEngine::lambdify_code( SymEngine::atanh(x) )).to eq("lambda { | x | Math.atanh(x) }")
22-
expect(SymEngine::lambdify_code( SymEngine::gamma(x) )).to eq("lambda { | x | Math.gamma(x) }")
23-
expect(SymEngine::lambdify_code( x + SymEngine::PI )).to eq("lambda { | x | x + Math::PI }")
24-
expect(SymEngine::lambdify_code( x + SymEngine::E )).to eq("lambda { | x | x + Math::E }")
25-
expect(SymEngine::lambdify_code( SymEngine::dirichlet_eta(x) )).to eq("lambda { | x | SymEngine::evalf_dirichlet_eta(x) }")
26-
expect(SymEngine::lambdify_code( SymEngine::zeta(x) )).to eq("lambda { | x | SymEngine::evalf_zeta(x, Rational(1,1)) }")
12+
expect(l( x + y + z )).to eq("lambda { | x,y,z | x + y + z }")
13+
expect(l( x + 5 )).to eq("lambda { | x | Rational(5,1) + x }")
14+
expect(l( SymEngine::sin(x) )).to eq("lambda { | x | Math.sin(x) }")
15+
expect(l( SymEngine::cos(x) )).to eq("lambda { | x | Math.cos(x) }")
16+
expect(l( SymEngine::tan(x) )).to eq("lambda { | x | Math.tan(x) }")
17+
expect(l( SymEngine::asin(x) )).to eq("lambda { | x | Math.asin(x) }")
18+
expect(l( SymEngine::acos(x) )).to eq("lambda { | x | Math.acos(x) }")
19+
expect(l( SymEngine::atan(x) )).to eq("lambda { | x | Math.atan(x) }")
20+
expect(l( SymEngine::sinh(x) )).to eq("lambda { | x | Math.sinh(x) }")
21+
expect(l( SymEngine::cosh(x) )).to eq("lambda { | x | Math.cosh(x) }")
22+
expect(l( SymEngine::tanh(x) )).to eq("lambda { | x | Math.tanh(x) }")
23+
expect(l( SymEngine::asinh(x) )).to eq("lambda { | x | Math.asinh(x) }")
24+
expect(l( SymEngine::acosh(x) )).to eq("lambda { | x | Math.acosh(x) }")
25+
expect(l( SymEngine::atanh(x) )).to eq("lambda { | x | Math.atanh(x) }")
26+
expect(l( SymEngine::gamma(x) )).to eq("lambda { | x | Math.gamma(x) }")
27+
expect(l( x + SymEngine::PI )).to eq("lambda { | x | x + Math::PI }")
28+
expect(l( x + SymEngine::E )).to eq("lambda { | x | x + Math::E }")
29+
expect(l( SymEngine::dirichlet_eta(x) )).to eq("lambda { | x | SymEngine::Utils::evalf_dirichlet_eta(x) }")
30+
expect(l( SymEngine::zeta(x) )).to eq("lambda { | x | SymEngine::Utils::evalf_zeta(x, Rational(1,1)) }")
2731

2832

2933
end
@@ -52,17 +56,17 @@
5256
expect(lamb.call(1)).to eq(6)
5357
expect(lamb.call(0)).to eq(5)
5458
expect(lamb.call(-1)).to eq(4)
55-
expect(lamb.call(Math::PI)).to be_within(0.000000000000001).of(8.141592653589793)
59+
expect(lamb.call(Math::PI)).to be_within(1e-15).of(8.141592653589793)
5660
end
5761
end
5862

5963
describe 'lambda for sin' do
6064
let(:func) { SymEngine::sin(x) }
6165
let(:lamb) { SymEngine::lambdify(func) }
6266
it 'performs sin calculation with a lambda function' do
63-
expect(lamb.call(0)).to be_within(0.000000000000001).of(0.0)
64-
expect(lamb.call(Math::PI)).to be_within(0.000000000000001).of(0.0)
65-
expect(lamb.call(Math::PI/2)).to be_within(0.000000000000001).of(1.0)
67+
expect(lamb.call(0)).to be_within(1e-15).of(0.0)
68+
expect(lamb.call(Math::PI)).to be_within(1e-15).of(0.0)
69+
expect(lamb.call(Math::PI/2)).to be_within(1e-15).of(1.0)
6670
end
6771
end
6872

0 commit comments

Comments
 (0)