use crate::error::Error;
pub(super) fn validate_learning_rate(learning_rate: f32) -> Result<(), Error> {
if !(learning_rate > 0.0 && learning_rate.is_finite()) {
return Err(Error::invalid_parameter(
"learning_rate",
format!("must be positive and finite, got {}", learning_rate),
));
}
Ok(())
}
pub(super) fn validate_decay_rate(value: f32, param_name: &str) -> Result<(), Error> {
if !((0.0..1.0).contains(&value) && value.is_finite()) {
return Err(Error::invalid_parameter(
param_name.to_string(),
format!("must be in range [0, 1) and finite, got {}", value),
));
}
Ok(())
}
pub(super) fn validate_epsilon(epsilon: f32) -> Result<(), Error> {
if !(epsilon > 0.0 && epsilon.is_finite()) {
return Err(Error::invalid_parameter(
"epsilon",
format!("must be positive and finite, got {}", epsilon),
));
}
Ok(())
}
pub(super) fn validate_positive_finite(value: f32, param_name: &str) -> Result<(), Error> {
if !(value > 0.0 && value.is_finite()) {
return Err(Error::invalid_parameter(
param_name.to_string(),
format!("must be positive and finite, got {}", value),
));
}
Ok(())
}
pub(super) fn validate_non_negative_finite(value: f32, param_name: &str) -> Result<(), Error> {
if !(value >= 0.0 && value.is_finite()) {
return Err(Error::invalid_parameter(
param_name.to_string(),
format!("must be non-negative and finite, got {}", value),
));
}
Ok(())
}
pub(super) fn validate_clip_norm(clip_norm: Option<f32>) -> Result<(), Error> {
if let Some(max_norm) = clip_norm {
validate_positive_finite(max_norm, "clip_norm")?;
}
Ok(())
}