@@ -31,41 +31,45 @@ _set_lookup(s::Safety, lookup::AbstractCategorical, newlookup::AutoLookup) = beg
3131 l1 = _set (Unsafe (), lookup, order (newlookup))
3232 l2 = _set (Unsafe (), l1, parent (newlookup))
3333 l3 = _set (s, l2, order (newlookup))
34- _set (l3, metadata (newlookup))
34+ _set (s, l3, metadata (newlookup))
3535end
3636_set_lookup (s:: Safety , lookup:: AbstractSampled , newlookup:: AutoLookup ) = begin
3737 # With autolookup we have to allow for missing fields and detect them
3838 # First force the new order to avoid unnecessary reordering of arrays
39- lookup2 = _set (Unsafe (), lookup, order (newlookup))
4039 # Then update lookup values
4140 lookup1 = _set (s, lookup, parent (newlookup))
42- # Then set the order again in case it changed
43- lookup2 = _set (s, lookup , order (newlookup))
41+ # Then set the order
42+ lookup2 = _set (s, lookup1 , order (newlookup))
4443 # Then set the span
45- lookup3 = _set (s, lookup , span (newlookup))
44+ lookup3 = _set (s, lookup2 , span (newlookup))
4645 # Then set traits that dont affect each other
4746 sa = _set (s, sampling (lookup3), sampling (newlookup))
4847 md = _set (s, metadata (lookup3), metadata (newlookup))
4948 rebuild (lookup3; sampling= sa, metadata= md)
5049end
51- _set_lookup (s:: Safety , lookup:: Lookup , newlookup:: AbstractCategorical ) = begin
50+ _set_lookup (s:: Unsafe , lookup:: Lookup , newlookup:: AbstractCategorical ) = begin
51+ lookup = _set (s, lookup, parent (newlookup))
52+ o = _set (s, order (lookup), order (newlookup))
53+ md = _set (s, metadata (lookup), metadata (newlookup))
54+ rebuild (newlookup; data= parent (lookup), order= o, metadata= md)
55+ end
56+ _set_lookup (s:: Safe , lookup:: Lookup , newlookup:: AbstractCategorical ) = begin
5257 lookup = _set (Unsafe (), lookup, parent (newlookup))
53- o = _set (s, order (lookup ), order (newlookup))
54- md = _set (s, metadata (lookup), metadata (newlookup))
58+ o = _format ( order (newlookup ), AnonDim, parent (newlookup))
59+ md = _set (s, metadata (lookup), metadata (newlookup))
5560 rebuild (newlookup; data= parent (lookup), order= o, metadata= md)
5661end
5762_set_lookup (s:: Unsafe , lookup:: Lookup , newlookup:: AbstractSampled ) =
5863 _set_lookup_parent (s, lookup, parent (newlookup))
59- _set_lookup (s:: Safety , lookup:: Lookup , newlookup:: AbstractSampled ) = begin
64+ _set_lookup (s:: Safe , lookup:: Lookup , newlookup:: AbstractSampled ) = begin
6065 # Update each field separately. The old lookup may not have these fields, or may have
6166 # a subset with the rest being traits. The new lookup may have some auto fields.
62- data = _set_lookup_parent (s, lookup, parent (newlookup))
63- o = _set (s, order (lookup), order (newlookup))
64- sp = _set (s, span (lookup), span (newlookup))
65- sa = _set (s, sampling (lookup), sampling (newlookup))
66- md = _set (s, metadata (lookup), metadata (newlookup))
67+ o = _format (order (newlookup), AnonDim, parent (newlookup))
68+ sp = _format (span (newlookup), AnonDim, parent (newlookup))
69+ sa = _set (s, sampling (lookup), sampling (newlookup))
70+ md = _set (s, metadata (lookup), metadata (newlookup))
6771 # Rebuild the new lookup with the merged fields
68- rebuild (newlookup ; data, order= o, span= sp, sampling= sa, metadata= md)
72+ rebuild (newlookup1 ; data, order= o, span= sp, sampling= sa, metadata= md)
6973end
7074_set_lookup (:: Safety , lookup:: Lookup , newlookup:: NoLookup{<:AutoValues} ) = NoLookup (axes (lookup, 1 ))
7175_set_lookup (:: Safety , lookup:: Lookup , newlookup:: AbstractNoLookup ) = newlookup
@@ -100,8 +104,8 @@ _set_lookup_parent(s::Safe, lookup::AbstractSampled, values::AbstractVector) = b
100104end
101105
102106# Order
103- _set_lookup_property (:: Safe , lookup:: Lookup , neworder:: AutoOrder ) = Lookup
104- _set_lookup_property (:: Unsafe , lookup:: Lookup , neworder:: AutoOrder ) = Lookup
107+ _set_lookup_property (:: Safe , lookup:: Lookup , neworder:: AutoOrder ) = lookup
108+ _set_lookup_property (:: Unsafe , lookup:: Lookup , neworder:: AutoOrder ) = lookup
105109_set_lookup_property (:: Safe , lookup:: AbstractNoLookup , neworder:: AutoOrder ) = lookup
106110_set_lookup_property (:: Unsafe , lookup:: AbstractNoLookup , neworder:: AutoOrder ) = lookup
107111_set_lookup_property (:: Safe , lookup:: AbstractNoLookup , neworder:: Order ) = lookup
@@ -110,8 +114,11 @@ _set_lookup_property(::Unsafe, lookup::AbstractNoLookup, neworder::Order) = look
110114_set_lookup_property (s:: Unsafe , lookup:: Lookup , neworder:: Order ) =
111115 rebuild (lookup; order= _set (s, order (lookup), neworder))
112116# Safe reorders them to match `neworder`
113- _set_lookup_property (:: Safe , lookup:: Lookup , neworder:: Order ) =
114- reorder (lookup, neworder)
117+ _set_lookup_property (:: Safe , lookup:: Lookup , neworder:: Order ) = begin
118+ re = reorder (lookup, neworder)
119+ @show " here" neworder order (lookup) order (re) span (re)
120+ re
121+ end
115122
116123# Lookup Span
117124_set_lookup_property (:: Safety , lookup:: AbstractSampled , :: Irregular{AutoBounds} ) = begin
@@ -123,25 +130,75 @@ _set_lookup_property(::Safety, lookup::AbstractSampled, ::Irregular{AutoBounds})
123130 rebuild (lookup; span= Irregular (bnds))
124131end
125132_set_lookup_property (s:: Safety , lookup:: AbstractSampled , :: Regular{AutoStep} ) = begin
126- stp = if span (lookup) isa AutoSpan || step (lookup) isa AutoStep
127- if parent (lookup) isa AbstractRange
128- step (parent (lookup))
129- else
130- AutoStep ()
131- end
132- else
133+ stp = if span (lookup) isa Regular
133134 step (lookup)
135+ else
136+ stp = _detect_span (parent (lookup))
137+ isnothing (stp) && throw (ArgumentError (" Can't set an irregular lookup values to Regular" ))
138+ stp
134139 end
135140 rebuild (lookup; span= Regular (stp))
136141end
137- # Lookup Span
138- _set_lookup_property (:: Safety , lookup:: AbstractSampled , span:: Span ) = rebuild (lookup; span= span)
139- _set_lookup_property (:: Safety , lookup:: AbstractSampled , span:: AutoSpan ) = lookup
142+ _set_lookup_property (:: Safety , lookup:: AbstractSampled , newspan:: AutoSpan ) = lookup
143+ _set_lookup_property (s:: Safety , lookup:: AbstractSampled , newspan:: Span ) =
144+ _set_lookup_property (s, lookup, span (lookup), newspan)
145+ function _set_lookup_property (
146+ s:: Safe , lookup:: AbstractSampled , :: Span , :: Explicit{<:AutoBounds}
147+ )
148+ # Generate a new bounds matrix
149+ span = Explicit (reinterpret (reshape, Float64, intervalbounds (lookup)))
150+ # Explicit has to be Intervals
151+ sampling = Intervals (locus (lookup))
152+ return rebuild (lookup; span, sampling)
153+ end
154+ _set_lookup_property (:: Safe , lookup:: AbstractSampled , :: Explicit , :: Explicit{<:AutoBounds} ) =
155+ lookup
156+ function _set_lookup_property (:: Safety , lookup:: AbstractSampled , :: Span , span:: Explicit )
157+ rebuild (lookup; span, sampling= Intervals (locus (lookup)))
158+ end
159+ function _set_lookup_property (
160+ :: Safe , lookup:: AbstractSampled , :: Span , :: Regular{<:AutoStep}
161+ )
162+ rebuild (lookup; sampling= Intervals (bounds (lookup)))
163+ end
164+ function _set_lookup_property (
165+ :: Safe , lookup:: AbstractSampled , :: Span , :: Irregular{<:AutoBounds}
166+ )
167+ rebuild (lookup; sampling= Intervals (bounds (lookup)))
168+ end
169+ _set_lookup_property (:: Safety , lookup:: AbstractSampled , :: Span , newspan:: Span ) =
170+ rebuild (lookup; span)
140171# Lookup Sampling
141- # TODO does this need to fix bounds?
142- _set_lookup_property (s:: Safety , lookup:: AbstractSampled , newsampling:: Sampling ) =
143- rebuild (lookup; sampling= _set (s, sampling (lookup), newsampling))
144- _set_lookup_property (:: Safety , lookup:: AbstractSampled , sampling:: AutoSampling ) = lookup
172+ function _set_lookup_property (s:: Safe , lookup:: AbstractSampled , newsampling:: Sampling )
173+ s = _set (s, sampling (lookup), newsampling)
174+ # If the locus is currently points, make it Center Intervals
175+ if sampling (lookup) isa Points
176+ if s isa Intervals # Points => Intervals
177+ span1 = if span (lookup) isa Irregular
178+ # We don't know the bounds
179+ Irregular (nothing , nothing )
180+ else
181+ span (lookup)
182+ end
183+ lookup1 = rebuild (lookup; sampling= Intervals (Center ()))
184+ else # Points => Points, Nothing to do here
185+ return lookup
186+ end
187+ else # Intervals => Points
188+ span1 = if span (lookup) isa Union{Irregular,Explicit}
189+ # We don't need bounds for Points
190+ Irregular (nothing , nothing )
191+ else # Regular stays the same
192+ span (lookup)
193+ end
194+ lookup1 = lookup
195+ end
196+ # For Intervals this will shift the locus
197+ # For Points always convert all loci to Center()
198+ return rebuild (shiftlocus (locus (s), lookup1); sampling= s)
199+ end
200+ _set_lookup_property (s:: Unsafe , lookup:: AbstractSampled , sampling:: Sampling ) =
201+ rebuild (lookup; sampling= _set (s, sampling (lookup), sampling))
145202# Lookup Locus
146203_set_lookup_property (s:: Unsafe , lookup:: AbstractSampled , locus:: Locus ) =
147204 rebuild (lookup; sampling= _set (s, sampling (lookup), locus))
@@ -175,4 +232,13 @@ _set(::Safety, metadata::AllMetadata, newmetadata::AllMetadata) = newmetadata
175232_set (:: Safety , A, x) = _cantseterror (A, x)
176233
177234@noinline _locuserror () = throw (ArgumentError (" Can't set a locus for `Points` sampling other than `Center` - the lookup values are the exact points" ))
178- @noinline _cantseterror (a, b) = throw (ArgumentError (" Can not set any fields of $(typeof (a)) to $(typeof (b)) " ))
235+ @noinline _cantseterror (a, b) = throw (ArgumentError (" Can not set any fields of $(typeof (a)) to $(typeof (b)) " ))
236+
237+ _detect_step (A:: AbstractRange ) = step (A)
238+ function _detect_step (A:: AbstractVector )
239+ step = first (A) - last (A) / (length (A) - 1 )
240+ for i in eachindex (A)
241+ isapprox (A[i], first (A) + step * (i - 1 )) || return nothing
242+ end
243+ return step
244+ end
0 commit comments