Skip to content

Commit cd5048d

Browse files
authored
Merge pull request #530 from eschnett/eschnett/random
Provide `rand` function for TensorValues
2 parents 7ec005e + 078f836 commit cd5048d

9 files changed

+76
-0
lines changed

NEWS.md

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## Unreleased
8+
9+
### Added
10+
- `rand` function for `MultiValue` objects.
11+
712
## [0.15.1] - 2021-01-22
813

914
### Added

Project.toml

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
1919
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
2020
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
2121
QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
22+
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
2223
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
2324
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2425
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

src/TensorValues/SymFourthOrderTensorValueTypes.jl

+10
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,16 @@ zero(::SymFourthOrderTensorValue{D,T,L}) where {D,T,L} = zero(SymFourthOrderTens
8787
end
8888
one(::SymFourthOrderTensorValue{D,T}) where {D,T} = one(SymFourthOrderTensorValue{D,T})
8989

90+
@generated function rand(rng::AbstractRNG,
91+
::Random.SamplerType{<:SymFourthOrderTensorValue{D,T}}) where {D,T}
92+
L=(D*(D+1)÷2)^2
93+
quote
94+
rand(rng, SymFourthOrderTensorValue{D,T,$L})
95+
end
96+
end
97+
rand(rng::AbstractRNG,::Random.SamplerType{<:SymFourthOrderTensorValue{D,T,L}}) where {D,T,L} =
98+
SymFourthOrderTensorValue{D,T}(Tuple(rand(rng, SVector{L,T})))
99+
90100
change_eltype(::Type{SymFourthOrderTensorValue{D,T1,L}},::Type{T2}) where {D,T1,T2,L} = SymFourthOrderTensorValue{D,T2,L}
91101
change_eltype(::SymFourthOrderTensorValue{D,T1,L},::Type{T2}) where {D,T1,T2,L} = change_eltype(SymFourthOrderTensorValue{D,T1,L},T2)
92102

src/TensorValues/SymTensorValueTypes.jl

+10
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ zero(::SymTensorValue{D,T,L}) where {D,T,L} = zero(SymTensorValue{D,T,L})
120120
end
121121
one(::SymTensorValue{D,T}) where {D,T} = one(SymTensorValue{D,T})
122122

123+
@generated function rand(rng::AbstractRNG,
124+
::Random.SamplerType{<:SymTensorValue{D,T}}) where {D,T}
125+
L=D*(D+1)÷2
126+
quote
127+
rand(rng, SymTensorValue{D,T,$L})
128+
end
129+
end
130+
rand(rng::AbstractRNG,::Random.SamplerType{<:SymTensorValue{D,T,L}}) where {D,T,L} =
131+
SymTensorValue{D,T}(Tuple(rand(rng, SVector{L,T})))
132+
123133
Mutable(::Type{<:SymTensorValue{D,T}}) where {D,T} = MMatrix{D,D,T}
124134
Mutable(::SymTensorValue{D,T}) where {D,T} = Mutable(SymTensorValue{D,T})
125135
mutable(a::SymTensorValue{D}) where D = MMatrix{D,D}(Tuple(get_array(a)))

src/TensorValues/TensorValueTypes.jl

+12
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ zero(::TensorValue{D1,D2,T}) where {D1,D2,T} = zero(TensorValue{D1,D2,T})
9595
end
9696
one(::TensorValue{D1,D2,T}) where {D1,D2,T} = one(TensorValue{D1,D2,T})
9797

98+
@generated function rand(rng::AbstractRNG,
99+
::Random.SamplerType{<:TensorValue{D1,D2,T}}) where {D1,D2,T}
100+
L=D1*D2
101+
quote
102+
rand(rng, TensorValue{D1,D2,T,$L})
103+
end
104+
end
105+
function rand(rng::AbstractRNG,
106+
::Random.SamplerType{<:TensorValue{D1,D2,T,L}}) where {D1,D2,T,L}
107+
return TensorValue{D1,D2,T,L}(Tuple(rand(rng, SVector{L,T})))
108+
end
109+
98110
Mutable(::Type{<:TensorValue{D1,D2,T}}) where {D1,D2,T} = MMatrix{D1,D2,T}
99111
Mutable(::TensorValue{D1,D2,T}) where {D1,D2,T} = Mutable(TensorValue{D1,D2,T})
100112
mutable(a::TensorValue{D1,D2}) where {D1,D2} = MMatrix{D1,D2}(a.data)

src/TensorValues/TensorValues.jl

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ using Base: @propagate_inbounds, @pure
3636
using Gridap.Helpers
3737
using Gridap.Arrays
3838
using LinearAlgebra
39+
using Random
3940

4041
export MultiValue
4142
export VectorValue
@@ -71,6 +72,7 @@ import Base: CartesianIndices
7172
import Base: LinearIndices
7273
import Base: adjoint
7374
import Base: transpose
75+
import Base: rand
7476

7577
import LinearAlgebra: det, inv, tr, cross, dot, norm
7678
# Reexport from LinearAlgebra (just for convenience)

src/TensorValues/ThirdOrderTensorValueTypes.jl

+12
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ change_eltype(::T,::Type{T2}) where {T<:ThirdOrderTensorValue,T2} = change_eltyp
8080
zero(::Type{<:ThirdOrderTensorValue{D1,D2,D3,T}}) where {D1,D2,D3,T} = ThirdOrderTensorValue{D1,D2,D3,T}(tfill(zero(T),Val{D1*D2*D3}()))
8181
zero(::ThirdOrderTensorValue{D1,D2,D3,T}) where {D1,D2,D3,T} = zero(ThirdOrderTensorValue{D1,D2,D3,T})
8282

83+
@generated function rand(rng::AbstractRNG,
84+
::Random.SamplerType{<:ThirdOrderTensorValue{D1,D2,D3,T}}) where {D1,D2,D3,T}
85+
L=D1*D2*D3
86+
quote
87+
rand(rng, ThirdOrderTensorValue{D1,D2,D3,T,$L})
88+
end
89+
end
90+
function rand(rng::AbstractRNG,
91+
::Random.SamplerType{<:ThirdOrderTensorValue{D1,D2,D3,T,L}}) where {D1,D2,D3,T,L}
92+
return ThirdOrderTensorValue{D1,D2,D3,T,L}(Tuple(rand(rng, SVector{L,T})))
93+
end
94+
8395
Mutable(::Type{<:ThirdOrderTensorValue{D1,D2,D3,T}}) where {D1,D2,D3,T} = MArray{Tuple{D1,D2,D3},T}
8496
Mutable(::ThirdOrderTensorValue{D1,D2,D3,T}) where {D1,D2,D3,T} = Mutable(ThirdOrderTensorValue{D1,D2,D3,T})
8597
mutable(a::ThirdOrderTensorValue{D1,D2,D3}) where {D1,D2,D3} = MArray{Tuple{D1,D2,D3}}(a.data)

src/TensorValues/VectorValueTypes.jl

+4
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ convert(::Type{<:VectorValue{D,T}}, arg::VectorValue{D,T}) where {D,T} = arg
7878
zero(::Type{<:VectorValue{D,T}}) where {D,T} = VectorValue{D,T}(tfill(zero(T),Val{D}()))
7979
zero(::VectorValue{D,T}) where {D,T} = zero(VectorValue{D,T})
8080

81+
function rand(rng::AbstractRNG, ::Random.SamplerType{VectorValue{D,T}}) where {D,T}
82+
return VectorValue{D,T}(Tuple(rand(rng, SVector{D,T})))
83+
end
84+
8185
Mutable(::Type{VectorValue{D,T}}) where {D,T} = MVector{D,T}
8286
Mutable(::VectorValue{D,T}) where {D,T} = Mutable(VectorValue{D,T})
8387
mutable(a::VectorValue) = MVector(a.data)

test/TensorValuesTests/TypesTests.jl

+20
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,26 @@ z = one(SymFourthOrderTensorValue{2,Int})
263263
@test isa(z,SymFourthOrderTensorValue{2})
264264
@test Tuple(z) == (1.,0.,0., 0.,0.5,0., 0.,0.,1.)
265265

266+
r = rand(VectorValue{3,Int})
267+
@test isa(r,VectorValue{3,Int})
268+
@test r rand(typeof(r))
269+
270+
r = rand(TensorValue{3,3,Int})
271+
@test isa(r,TensorValue{3,3,Int,9})
272+
@test r rand(typeof(r))
273+
274+
r = rand(ThirdOrderTensorValue{3,3,3,Int})
275+
@test isa(r,ThirdOrderTensorValue{3,3,3,Int,27})
276+
@test r rand(typeof(r))
277+
278+
r = rand(SymTensorValue{3,Int})
279+
@test isa(r,SymTensorValue{3,Int,6})
280+
@test r rand(typeof(r))
281+
282+
r = rand(SymFourthOrderTensorValue{3,Int})
283+
@test isa(r,SymFourthOrderTensorValue{3,Int,36})
284+
@test r rand(typeof(r))
285+
266286
# Conversions
267287

268288
a = @SVector ones(Int,3)

0 commit comments

Comments
 (0)