changeset 929:e9dd43cbd127 feature/variable_derivatives

Merge performance/get_region_type_inference
author Jonatan Werpers <jonatan@werpers.com>
date Mon, 21 Feb 2022 10:34:48 +0100
parents 453fd1a2e858 (current diff) b41180efb6c2 (diff)
children ba5f4a0ec879
files
diffstat 6 files changed, 82 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/LazyTensors/lazy_tensor_operations.jl	Fri Feb 18 08:03:37 2022 +0100
+++ b/src/LazyTensors/lazy_tensor_operations.jl	Mon Feb 21 10:34:48 2022 +0100
@@ -430,3 +430,28 @@
     print(io, "SizeMismatch: ")
     print(io, "domain size $(domain_size(err.tm)) of TensorMapping not matching size $(err.sz)")
 end
+
+function apply_with_region(op, v, boundary_width::Integer, dim_size::Integer, i)
+    if 0 < i <= boundary_width
+        return LazyTensors.apply(op,v,Index(i,Lower))
+    elseif boundary_width < i <= dim_size-boundary_width
+        return LazyTensors.apply(op,v,Index(i,Interior))
+    elseif dim_size-boundary_width < i <= dim_size
+        return LazyTensors.apply(op,v,Index(i,Upper))
+    else
+        error("Bounds error") # TODO: Make this more standard
+    end
+end
+# TBD: Can these methods be merge by having a function as an arguement instead?
+# TODO: Add inference test that show where things break and how this rewrite fixes it.
+function apply_transpose_with_region(op, v, boundary_width::Integer, dim_size::Integer, i)
+    if 0 < i <= boundary_width
+        return LazyTensors.apply_transpose(op,v,Index(i,Lower))
+    elseif boundary_width < i <= dim_size-boundary_width
+        return LazyTensors.apply_transpose(op,v,Index(i,Interior))
+    elseif dim_size-boundary_width < i <= dim_size
+        return LazyTensors.apply_transpose(op,v,Index(i,Upper))
+    else
+        error("Bounds error") # TODO: Make this more standard
+    end
+end
--- a/src/RegionIndices/RegionIndices.jl	Fri Feb 18 08:03:37 2022 +0100
+++ b/src/RegionIndices/RegionIndices.jl	Mon Feb 21 10:34:48 2022 +0100
@@ -65,6 +65,7 @@
         error("Bounds error") # TODO: Make this more standard
     end
 end
+# 2022-02-21: Using the return values of getregion cause type inference to give up in ceratin cases for example H*H*v
 
 export getregion
 
--- a/src/SbpOperators/boundaryops/boundary_operator.jl	Fri Feb 18 08:03:37 2022 +0100
+++ b/src/SbpOperators/boundaryops/boundary_operator.jl	Mon Feb 21 10:34:48 2022 +0100
@@ -84,6 +84,5 @@
 end
 
 function LazyTensors.apply_transpose(op::BoundaryOperator{T}, v::AbstractArray{T,0}, i) where T
-    r = getregion(i, closure_size(op), op.size)
-    apply_transpose(op, v, Index(i,r))
+    return LazyTensors.apply_transpose_with_region(op, v, closure_size(op), op.size[1], i)
 end
--- a/src/SbpOperators/volumeops/constant_interior_scaling_operator.jl	Fri Feb 18 08:03:37 2022 +0100
+++ b/src/SbpOperators/volumeops/constant_interior_scaling_operator.jl	Mon Feb 21 10:34:48 2022 +0100
@@ -41,8 +41,7 @@
 end
 
 function LazyTensors.apply(op::ConstantInteriorScalingOperator{T}, v::AbstractVector{T}, i) where T
-    r = getregion(i, closure_size(op), op.size[1])
-    return LazyTensors.apply(op, v, Index(i, r))
+    return LazyTensors.apply_with_region(op, v, closure_size(op), op.size[1], i)
 end
 
 LazyTensors.apply_transpose(op::ConstantInteriorScalingOperator, v, i) = apply(op, v, i)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/SbpOperators/volumeops/inference_trouble.txt	Mon Feb 21 10:34:48 2022 +0100
@@ -0,0 +1,53 @@
+Innan ändringarna på den här branchen:
+
+begin
+    using Sbplib
+    using Sbplib.Grids
+    using Sbplib.SbpOperators
+
+    g = EquidistantGrid((10,10),(0.,0.), (1.,1.))
+    v = evalOn(g, (x,y)->x^2+y^2+1)
+    H = inner_product(g, 1., [1/2])
+end
+
+# Not type stable
+LazyTensors.apply(H.t1, H.t2*v, 1,2) 
+@code_warntype LazyTensors.apply(H.t1, H.t2*v, 1,2)
+@code_warntype LazyTensors.apply(H.t1.tm, view(H.t2*v,:,1), 2)
+
+# Nedan är halvdåliga
+@code_warntype LazyTensors.apply(H.t1.tm, view(H.t2*v,1,:), 2)
+@code_warntype LazyTensors.apply(H.t1.tm, view(v,1,:), 2)
+@code_warntype LazyTensors.apply(H.t1.tm, view(v,:,1), 2)
+@code_warntype LazyTensors.apply(H.t1.tm, v[:,1], 2)
+
+
+
+
+
+
+
+
+
+begin
+    using Sbplib
+    using Sbplib.Grids
+    using Sbplib.SbpOperators
+    import Sbplib.SbpOperators: Stencil
+    using Sbplib.RegionIndices
+
+    g = EquidistantGrid(10,0., 1.)
+    v = evalOn(g, (x)->x^2+1)
+    H = inner_product(g, 1., [1/2])
+    V = SbpOperators.volume_operator(g, Stencil(1.,center=1), (Stencil(1/2,center=1),), SbpOperators.even,1)
+    b = SbpOperators.boundary_operator(g, Stencil(1/2,center=1), CartesianBoundary{1,Lower}())
+end
+
+@code_warntype LazyTensors.apply(H, H*v, 2)
+@code_warntype LazyTensors.apply(V, V*v, 2)
+@code_warntype LazyTensors.apply(b, b*v, 2)
+
+
+
+begin
+end
--- a/src/SbpOperators/volumeops/volume_operator.jl	Fri Feb 18 08:03:37 2022 +0100
+++ b/src/SbpOperators/volumeops/volume_operator.jl	Mon Feb 21 10:34:48 2022 +0100
@@ -56,6 +56,5 @@
 end
 
 function LazyTensors.apply(op::VolumeOperator{T}, v::AbstractVector{T}, i) where T
-    r = getregion(i, closure_size(op), op.size[1])
-    return LazyTensors.apply(op, v, Index(i, r))
+    return LazyTensors.apply_with_region(op, v, closure_size(op), op.size[1], i)
 end