Mercurial > repos > public > sbplib_julia
annotate src/RegionIndices/RegionIndices.jl @ 971:bc12be1b1ae5 feature/variable_derivatives
Fix typo
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Mon, 14 Mar 2022 10:20:39 +0100 |
parents | b41180efb6c2 |
children | 49d03d1169ef |
rev | line source |
---|---|
214
08b07c6eeec7
Move index.jl to its own package
Jonatan Werpers <jonatan@werpers.com>
parents:
165
diff
changeset
|
1 module RegionIndices |
08b07c6eeec7
Move index.jl to its own package
Jonatan Werpers <jonatan@werpers.com>
parents:
165
diff
changeset
|
2 |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
3 abstract type Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
4 struct Interior <: Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 struct Lower <: Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 struct Upper <: Region end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 |
542
011ca1639153
Remove Index{Unknown} and replace with general Any implementations
Jonatan Werpers <jonatan@werpers.com>
parents:
334
diff
changeset
|
8 export Region, Interior, Lower, Upper |
218
03375aa30edd
Add Tests and exports to RegionIndices
Jonatan Werpers <jonatan@werpers.com>
parents:
214
diff
changeset
|
9 |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
10 struct Index{R<:Region, T<:Integer} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 i::T |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
12 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 Index{R,T}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 Index{R}(i::T) where {R<:Region,T<:Integer} = new{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 Index(i::T, ::Type{R}) where {R<:Region,T<:Integer} = Index{R,T}(i) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 Index(t::Tuple{T, DataType}) where {R<:Region,T<:Integer} = Index{t[2],T}(t[1]) # TBD: This is not very specific in what types are allowed in t[2]. Can this be fixed? |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 |
218
03375aa30edd
Add Tests and exports to RegionIndices
Jonatan Werpers <jonatan@werpers.com>
parents:
214
diff
changeset
|
19 export Index |
03375aa30edd
Add Tests and exports to RegionIndices
Jonatan Werpers <jonatan@werpers.com>
parents:
214
diff
changeset
|
20 |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 # Index(R::Type{<:Region}) = Index{R} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 ## Vill kunna skriva |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 ## IndexTupleType(Int, (Lower, Interior)) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 Index(R::Type{<:Region}, T::Type{<:Integer}) = Index{R,T} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 IndexTupleType(T::Type{<:Integer},R::NTuple{N, DataType} where N) = Tuple{Index.(R, T)...} |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 Base.convert(::Type{T}, i::Index{R,T} where R) where T = i.i |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 Base.convert(::Type{CartesianIndex}, I::NTuple{N,Index} where N) = CartesianIndex(convert.(Int, I)) |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 Base.Int(I::Index) = I.i |
274
11010bb74260
Dispatch getindex for TensorMappingApplication on region indices. Dispatch apply
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
240
diff
changeset
|
32 Base.to_index(I::Index) = Int(I) #How to get this to work for all cases?? |
277
21e5c1dd6794
Add getindex-function for region indices. Update LazyArray tests. NOTE: Not sure if this is the way to go.
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
274
diff
changeset
|
33 Base.getindex(A::AbstractArray{T,N}, I::NTuple{N,Index}) where {T,N} = A[I...] #Is this ok?? |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 function Index(i::Integer, boundary_width::Integer, dim_size::Integer) |
165
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
36 return Index{getregion(i,boundary_width,dim_size)}(i) |
96
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 end |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 |
0743e1247384
Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t) |
218
03375aa30edd
Add Tests and exports to RegionIndices
Jonatan Werpers <jonatan@werpers.com>
parents:
214
diff
changeset
|
40 export IndexTuple |
103
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
41 |
144
ce56727e4232
Add TODO for switch to using Region values in some places
Jonatan Werpers <jonatan@werpers.com>
parents:
123
diff
changeset
|
42 # TODO: Use the values of the region structs, e.g. Lower(), for the region parameter instead of the types. |
ce56727e4232
Add TODO for switch to using Region values in some places
Jonatan Werpers <jonatan@werpers.com>
parents:
123
diff
changeset
|
43 # For example the following works: |
ce56727e4232
Add TODO for switch to using Region values in some places
Jonatan Werpers <jonatan@werpers.com>
parents:
123
diff
changeset
|
44 # (Lower(),Upper()) isa NTuple{2, Region} -> true |
ce56727e4232
Add TODO for switch to using Region values in some places
Jonatan Werpers <jonatan@werpers.com>
parents:
123
diff
changeset
|
45 # typeof((Lower(),Upper())) -> Tuple{Lower,Upper} |
103
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
46 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::Integer, region::NTuple{Dim,DataType}) where Dim |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
47 return regionindices(gridsize, ntuple(x->closuresize,Dim), region) |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
48 end |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
49 |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
50 function regionindices(gridsize::NTuple{Dim,Integer}, closuresize::NTuple{Dim,Integer}, region::NTuple{Dim,DataType}) where Dim |
120
ebddd2a3a520
Rename getunitrange to getrange and change signature to be more specific
Jonatan Werpers <jonatan@werpers.com>
parents:
103
diff
changeset
|
51 regions = map(getrange,gridsize,closuresize,region) |
103
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
52 return CartesianIndices(regions) |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
53 end |
a274d6384e91
Apply 2d Laplace one region at a time (removing the need for branching in the innermost loop)
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
98
diff
changeset
|
54 |
223
b3506cfbb9d8
Add some missing exports
Jonatan Werpers <jonatan@werpers.com>
parents:
218
diff
changeset
|
55 export regionindices |
b3506cfbb9d8
Add some missing exports
Jonatan Werpers <jonatan@werpers.com>
parents:
218
diff
changeset
|
56 |
165
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
57 function getregion(i::Integer, boundary_width::Integer, dim_size::Integer) |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
58 if 0 < i <= boundary_width |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
59 return Lower |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
60 elseif boundary_width < i <= dim_size-boundary_width |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
61 return Interior |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
62 elseif dim_size-boundary_width < i <= dim_size |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
63 return Upper |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
64 else |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
65 error("Bounds error") # TODO: Make this more standard |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
66 end |
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
67 end |
971 | 68 # 2022-02-21: Using the return values of getregion cause type inference to give up in certain cases, for example H*H*v |
165
9fc9167e9a4c
Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents:
144
diff
changeset
|
69 |
240 | 70 export getregion |
71 | |
123
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
72 function getrange(gridsize::Integer, closuresize::Integer, region::DataType) |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
73 if region == Lower |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
74 r = 1:closuresize |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
75 elseif region == Interior |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
76 r = (closuresize+1):(gridsize - closuresize) |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
77 elseif region == Upper |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
78 r = (gridsize - closuresize + 1):gridsize |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
79 else |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
80 error("Unspecified region") |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
81 end |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
82 return r |
5df4ccb19476
Undo changes of 3560f54e3eb3 and change to result a little bit to avoid allocations.
Jonatan Werpers <jonatan@werpers.com>
parents:
121
diff
changeset
|
83 end |
214
08b07c6eeec7
Move index.jl to its own package
Jonatan Werpers <jonatan@werpers.com>
parents:
165
diff
changeset
|
84 |
08b07c6eeec7
Move index.jl to its own package
Jonatan Werpers <jonatan@werpers.com>
parents:
165
diff
changeset
|
85 end # module |