@@ -39,6 +39,16 @@ function Base.show(io::IO, m::Mul)
3939 print (io, " (" , join (args, " $(operation (m)) " ), " )" )
4040 return nothing
4141end
42+ function Base. hash (m:: Mul , h:: UInt64 )
43+ h = hash (:Mul , h)
44+ for arg in arguments (m)
45+ h = hash (arg, h)
46+ end
47+ return h
48+ end
49+ function map_arguments (f, m:: Mul )
50+ return Mul (map (f, arguments (m)))
51+ end
4252
4353@wrapped struct LazyNamedDimsArray{
4454 T, A <: AbstractNamedDimsArray{T} ,
@@ -65,6 +75,18 @@ function NamedDimsArrays.dename(a::LazyNamedDimsArray)
6575 end
6676end
6777
78+ function getindex_lazy (a:: AbstractArray , I... )
79+ u = unwrap (a)
80+ if ! iscall (u)
81+ return u[I... ]
82+ else
83+ return error (" Indexing into expression not supported." )
84+ end
85+ end
86+ function Base. getindex (a:: LazyNamedDimsArray , I:: Int... )
87+ return getindex_lazy (a, I... )
88+ end
89+
6890function TermInterface. arguments (a:: LazyNamedDimsArray )
6991 u = unwrap (a)
7092 if ! iscall (u)
@@ -158,6 +180,49 @@ function Base.:(==)(a1::LazyNamedDimsArray, a2::LazyNamedDimsArray)
158180 end
159181end
160182
183+ # Defined to avoid type piracy.
184+ # TODO : Define a proper hash function
185+ # in NamedDimsArrays.jl, maybe one that is
186+ # independent of the order of dimensions.
187+ function _hash (a:: NamedDimsArray , h:: UInt64 )
188+ h = hash (:NamedDimsArray , h)
189+ h = hash (dename (a), h)
190+ for i in inds (a)
191+ h = hash (i, h)
192+ end
193+ return h
194+ end
195+ function _hash (x, h:: UInt64 )
196+ return hash (x, h)
197+ end
198+ function Base. hash (a:: LazyNamedDimsArray , h:: UInt64 )
199+ h = hash (:LazyNamedDimsArray , h)
200+ # Use `_hash`, which defines a custom hash for NamedDimsArray.
201+ return _hash (unwrap (a), h)
202+ end
203+
204+ generic_map (f, v) = map (f, v)
205+ generic_map (f, v:: AbstractDict ) = Dict (eachindex (v) .=> map (f, values (v)))
206+ generic_map (f, v:: AbstractSet ) = Set ([f (x) for x in v])
207+ function map_arguments (f, a:: LazyNamedDimsArray )
208+ u = unwrap (a)
209+ if ! iscall (u)
210+ return error (" No arguments to map." )
211+ elseif ismul (u)
212+ return LazyNamedDimsArray (map_arguments (f, u))
213+ else
214+ return error (" Variant not supported." )
215+ end
216+ end
217+ function substitute (a:: LazyNamedDimsArray , substitutions:: AbstractDict )
218+ haskey (substitutions, a) && return substitutions[a]
219+ ! iscall (a) && return a
220+ return map_arguments (arg -> substitute (arg, substitutions), a)
221+ end
222+ function substitute (a:: LazyNamedDimsArray , substitutions)
223+ return substitute (a, Dict (substitutions))
224+ end
225+
161226function printnode (io:: IO , a:: LazyNamedDimsArray )
162227 return printnode (io, unwrap (a))
163228end
@@ -280,6 +345,17 @@ Base.size(a::SymbolicArray) = length.(axes(a))
280345function Base.:(== )(a:: SymbolicArray , b:: SymbolicArray )
281346 return symname (a) == symname (b) && axes (a) == axes (b)
282347end
348+ function Base. hash (a:: SymbolicArray , h:: UInt64 )
349+ h = hash (:SymbolicArray , h)
350+ h = hash (symname (a), h)
351+ return hash (size (a), h)
352+ end
353+ function Base. getindex (a:: SymbolicArray , I... )
354+ return error (" Indexing into SymbolicArray not supported." )
355+ end
356+ function Base. setindex! (a:: SymbolicArray , value, I... )
357+ return error (" Indexing into SymbolicArray not supported." )
358+ end
283359function Base. show (io:: IO , mime:: MIME"text/plain" , a:: SymbolicArray )
284360 Base. summary (io, a)
285361 println (io, " :" )
0 commit comments