Hi all,
I was wondering if this is a julian use of the @generated macro:
type Functor{Symbol} end
# A simple general product-sum operator;
# returns a[1]⊙b[1] ⊕ a[2]⊙b[2] ⊕ ...
@generated function dot{⊕,⊙,T}(::Type{Functor{⊕}}, ::Type{Functor{⊙}},
a::Array{T}, b::Array{T})
return quote
assert(length(a)==length(b))
p = zero(T)
for i=1:length(a)
@inbounds p=$⊕(p,$⊙(a[i],b[i]))
end
p
end
end
The idea is to produce a specialized dot() operator that can work with
arbitrary product and sum operators yet still be computationally efficient.
These are some examples on how to use the above function:
dot(Functor{:+}, Functor{:*}, [-1,0,1],[1,0,1]) # vector dot; returns 0
dot(Functor{:max}, Functor{:+}, [-1,0,1],[1,0,1]) # max-sum; returns 2
dot(Functor{:|}, Functor{:&}, [true,false,true],[false,true,true]) #
constraint satisfaction; returns true
Testing shows that this is faster by about 10x than passing the functions
directly and runs at the same speed . It also doesn't go through any memory
allocations.