DataAugmentation
"""
Sequence(transforms...)
`Transform` that applies multiple `transformations`
after each other.
You should not use this explicitly. Instead use [`compose`](#).
"""
struct
Sequence
{
T
<:
Tuple
}
<:
Transform
transforms
::
T
end
Sequence
(
tfms
...
)
=
Sequence
{
typeof
(
tfms
)
}
(
tfms
)
Sequence
(
tfm
::
Transform
)
=
tfm
getrandstate
(
seq
::
Sequence
)
=
getrandstate
.
(
seq
.
transforms
)
compose
(
tfm1
::
Transform
,
tfm2
::
Transform
)
=
Sequence
(
tfm1
,
tfm2
)
compose
(
seq
::
Sequence
,
tfm
::
Transform
)
=
Sequence
(
seq
.
transforms
...
,
tfm
)
compose
(
tfm
::
Transform
,
seq
::
Sequence
)
=
compose
(
tfm
,
seq
.
transforms
...
)
compose
(
::
Identity
,
seq
::
Sequence
)
=
seq
compose
(
seq
::
Sequence
,
::
Identity
)
=
seq
compose
(
seq1
::
Sequence
,
seq2
::
Sequence
)
=
compose
(
seq1
.
transforms
...
,
seq2
.
transforms
...
)
function
apply
(
seq
::
Sequence
,
items
::
Tuple
;
randstate
=
getrandstate
(
seq
)
)
for
(
tfm
,
r
)
in
zip
(
seq
.
transforms
,
randstate
)
items
=
apply
(
tfm
,
items
;
randstate
=
r
)
end
return
items
end
apply
(
seq
::
Sequence
,
item
::
Item
;
randstate
=
getrandstate
(
seq
)
)
=
apply
(
seq
,
(
item
,
)
;
randstate
=
randstate
)
|>
only
function
makebuffer
(
pipeline
::
Sequence
,
items
)
buffers
=
[
]
for
tfm
in
pipeline
.
transforms
push!
(
buffers
,
makebuffer
(
tfm
,
items
)
)
items
=
apply
(
tfm
,
items
)
end
return
buffers
end
function
apply!
(
buffers
::
Vector
,
pipeline
::
Sequence
,
items
::
Item
;
randstate
=
getrandstate
(
pipeline
)
)
@
assert
length
(
buffers
)
==
length
(
pipeline
.
transforms
)
for
(
tfm
,
buffer
,
r
)
in
zip
(
pipeline
.
transforms
,
buffers
,
randstate
)
items
=
apply!
(
buffer
,
tfm
,
items
;
randstate
=
r
)
end
return
items
end