annotate index.jl @ 121:3560f54e3eb3 cell_based_test

Change implementation of getrange to be more julia(???), mostly as an experiment to see if it breakes stuff
author Jonatan Werpers <jonatan@werpers.com>
date Sun, 10 Feb 2019 19:16:14 +0100
parents ebddd2a3a520
children 5df4ccb19476
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)
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29 if 0 < i <= boundary_width
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30 return Index{Lower}(i)
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 elseif boundary_width < i <= dim_size-boundary_width
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 return Index{Interior}(i)
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 elseif dim_size-boundary_width < i <= dim_size
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34 return Index{Upper}(i)
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 else
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 error("Bounds error") # TODO: Make this more standard
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 end
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39
0743e1247384 Add Index type for keeping track of regions
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40 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
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::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
43 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
44 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
45
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::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
47 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
48 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
49 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
50
121
3560f54e3eb3 Change implementation of getrange to be more julia(???), mostly as an experiment to see if it breakes stuff
Jonatan Werpers <jonatan@werpers.com>
parents: 120
diff changeset
51 getrange(gridsize::Integer, closuresize::Integer, ::Type{Lower} ) = 1:closuresize
3560f54e3eb3 Change implementation of getrange to be more julia(???), mostly as an experiment to see if it breakes stuff
Jonatan Werpers <jonatan@werpers.com>
parents: 120
diff changeset
52 getrange(gridsize::Integer, closuresize::Integer, ::Type{Interior}) = (closuresize+1):(gridsize - closuresize)
3560f54e3eb3 Change implementation of getrange to be more julia(???), mostly as an experiment to see if it breakes stuff
Jonatan Werpers <jonatan@werpers.com>
parents: 120
diff changeset
53 getrange(gridsize::Integer, closuresize::Integer, ::Type{Upper} ) = (gridsize - closuresize + 1):gridsize