YVIq2
abstract
type
AbstractCallback
end
abstract
type
SafeCallback
<:
AbstractCallback
end
const
Callback
=
SafeCallback
abstract
type
UnsafeCallback
<:
AbstractCallback
end
TODO: implement proper merging of permissions
stateaccess
(
::
Callback
)
=
(
;
)
runafter
(
::
AbstractCallback
)
=
(
)
abstract
type
ConflictResolution
end
struct
NotDefined
<:
ConflictResolution
end
struct
Unresolvable
<:
ConflictResolution
end
struct
RunFirst
<:
ConflictResolution
cb
end
struct
NoConflict
<:
ConflictResolution
end
function
_resolveconflict
(
cb1
,
cb2
)
r
=
resolveconflict
(
cb1
,
cb2
)
if
r
===
NotDefined
(
)
return
resolveconflict
(
cb2
,
cb1
)
else
return
r
end
end
resolveconflict
(
::
AbstractCallback
,
::
AbstractCallback
)
=
NotDefined
(
)
abstract
type
FitException
<:
Exception
end
struct
CancelStepException
<:
FitException
msg
::
String
end
struct
CancelEpochException
<:
FitException
msg
::
String
end
struct
CancelFittingException
<:
FitException
msg
::
String
end
Callback hook
on
(
::
Event
,
phase
,
::
Callback
,
learner
)
=
return
_on
(
e
,
p
,
cb
,
learner
)
=
on
(
e
,
p
,
cb
,
learner
)
function
_on
(
e
,
p
,
cb
::
SafeCallback
,
learner
)
perms
=
Zygote
.
ignore
(
)
do
stateaccess
(
cb
)
end
on
(
e
,
p
,
cb
,
protect
(
learner
,
perms
)
)
end
init!
(
::
Callback
,
learner
)
=
return