Skip to content

Commit ddb5516

Browse files
committed
Making evaluation without dimension specified much faster
1 parent 3dc4af2 commit ddb5516

File tree

2 files changed

+18
-28
lines changed

2 files changed

+18
-28
lines changed

src/0_structs_and_generic_reversals.jl

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,8 @@ function underlying_dimensions(a::PE_Function)
166166
return Set(keys(a.units_))
167167
end
168168

169-
function evaluate(f::MultivariateFunction, coordinate::Float64)
170-
if length(setdiff(underlying_dimensions(f), Set([default_symbol]))) == 0
171-
coordinates = Dict([default_symbol] .=> coordinate)
172-
return evaluate(f, coordinates)
173-
else
174-
error("It is not possible to use the evaluate method without using a dict unless the only variable is the default one.")
175-
end
169+
function evaluate(f::MultivariateFunction, coordinate::Float64; variable::Symbol = default_symbol)
170+
return evaluate(f, Dict{Symbol,Float64}(variable => coordinate))
176171
end
177172

178173
"""
@@ -252,10 +247,6 @@ struct Sum_Of_Functions <: MultivariateFunction
252247
end
253248
Base.broadcastable(e::Sum_Of_Functions) = Ref(e)
254249

255-
#function zero(f::Sum_Of_Functions)
256-
# return Sum_Of_Functions([])
257-
#end
258-
259250
function evaluate(f::Sum_Of_Functions, coordinates::Dict{Symbol,Float64})
260251
if length(f.functions_) > 0
261252
vals = evaluate.(f.functions_, Ref(coordinates))
@@ -283,15 +274,6 @@ function rebadge(f::Sum_Of_Functions, mapping::Dict{Symbol,Symbol})
283274
return Sum_Of_Functions(funcs)
284275
end
285276

286-
function evaluate(f::Sum_Of_Functions, coordinates::Float64)
287-
if length(f.functions_) > 0
288-
vals = evaluate.(f.functions_, Ref(coordinates))
289-
return sum(vals)
290-
else
291-
return 0.0
292-
end
293-
end
294-
295277
function convert(::Type{Sum_Of_Functions}, f::PE_Function)
296278
return Sum_Of_Functions(f)
297279
end
@@ -495,14 +477,6 @@ end
495477
function evaluate(f::Missing, coordinates::Dict{Symbol,Float64})
496478
return missing
497479
end
498-
function evaluate(f::Piecewise_Function, coordinate::Float64)
499-
if underlying_dimensions(f) == Set([default_symbol])
500-
coordinates_ = Dict{Symbol,Float64}(default_symbol => coordinate)
501-
return evaluate(f, coordinates_)
502-
else
503-
error("Cannot evaluate a Piecewise function without a dictionary set of coordinates unless it is a MultivariateFunction with only the default dimension being used.")
504-
end
505-
end
506480

507481
function underlying_dimensions(f::Piecewise_Function)
508482
underlying = union(underlying_dimensions.(f.functions_)...)

test/7_schumaker_test.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,19 @@ numerical_integral = integral(spline, lhs,rhs)
4141

4242
analytical = analytic_integral(lhs,rhs)
4343
abs( analytical - numerical_integral ) < 0.001
44+
45+
46+
#= Speed test of MultivariateFunctions vs Univariate vs SchumakerSpline
47+
using SchumakerSpline
48+
using UnivariateFunctions
49+
x = collect(range(0.001, stop=10, length=1000))
50+
y = log.(x)
51+
@time schum = SchumakerSpline.Schumaker(x, y)
52+
@time univ = UnivariateFunctions.create_quadratic_spline(x,y)
53+
@time multiv = MultivariateFunctions.create_quadratic_spline(x,y)
54+
@time SchumakerSpline.evaluate(schum, 7.8)
55+
@time UnivariateFunctions.evaluate(univ, 7.8)
56+
@time MultivariateFunctions.evaluate(multiv, 7.8)
57+
@time MultivariateFunctions.evaluate(multiv, 7.8; variable = :default)
58+
@time MultivariateFunctions.evaluate(multiv, Dict{Symbol,Float64}(:default => 7.8))
59+
=#

0 commit comments

Comments
 (0)