annotate index.jl @ 211:1ad91e11b1f4 package_refactor

Move DiffOps and Grids into packages
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 26 Jun 2019 10:44:20 +0200
parents 9fc9167e9a4c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
96
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 abstract type Region end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 struct Interior <: Region end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 struct Lower <: Region end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 struct Upper <: Region end
98
50273f745f05 Add "Unknown" region and implement D2 for it
Jonatan Werpers <jonatan@werpers.com>
parents: 96
diff changeset
5 struct Unknown <: Region end
96
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 struct Index{R<:Region, T<:Integer}
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 i::T
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 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
11 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
12 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
13 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
14 end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 # Index(R::Type{<:Region}) = Index{R}
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 ## Vill kunna skriva
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19 ## IndexTupleType(Int, (Lower, Interior))
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20 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
21 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
22
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
23 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
24 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
25
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26 Base.Int(I::Index) = I.i
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 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
29 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
30 end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 IndexTuple(t::Vararg{Tuple{T, DataType}}) where T<:Integer = Index.(t)
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
33
144
ce56727e4232 Add TODO for switch to using Region values in some places
Jonatan Werpers <jonatan@werpers.com>
parents: 123
diff changeset
34 # 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
35 # 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
36 # (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
37 # 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
38 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
39 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
40 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
41
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
42 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
43 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
44 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
45 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
46
165
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
47 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
48 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
49 return Lower
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
50 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
51 return Interior
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
52 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
53 return Upper
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
54 else
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
55 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
56 end
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
57 end
9fc9167e9a4c Factor out function for geting the region of an index
Jonatan Werpers <jonatan@werpers.com>
parents: 144
diff changeset
58
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
59 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
60 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
61 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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
69 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
70 end