///|
fn invalid_linkage_score(value : Double) -> Bool {
value.is_nan() || value.is_inf() || value < 0.0 || value > 1.0
}
///|
/// Validates nested matching, blocking, work-limit, and score settings.
pub fn validate_linkage_config(
config : LinkageConfig,
) -> Result[Unit, LinkageError] {
match validate_match_config(config.match_config) {
Err(error) => return Err(InvalidLinkageMatchConfig(error))
Ok(_) => ()
}
if config.blocking_algorithms.length() == 0 {
return Err(NoLinkageBlockingAlgorithms)
}
for index = 0; index < config.blocking_algorithms.length(); index = index + 1 {
for earlier = 0; earlier < index; earlier = earlier + 1 {
if config.blocking_algorithms[index] ==
config.blocking_algorithms[earlier] {
return Err(
DuplicateLinkageBlockingAlgorithm(config.blocking_algorithms[index]),
)
}
}
}
if config.max_candidates_per_left < 1 {
return Err(InvalidLinkageCandidateLimit(config.max_candidates_per_left))
}
if invalid_linkage_score(config.minimum_score) {
return Err(InvalidLinkageMinimumScore(config.minimum_score))
}
Ok(())
}