fn compute_splittable_features_for_children(
	children_best_splits_for_features: &[(
		Option<ChooseBestSplitForFeatureOutput>,
		Option<ChooseBestSplitForFeatureOutput>,
	)],
) -> (Vec<bool>, Vec<bool>) {
	let n_features = children_best_splits_for_features.len();
	let mut left_child_splittable_features = vec![false; n_features];
	let mut right_child_splittable_features = vec![false; n_features];
	for (
		left_child_splittable_feature,
		right_child_splittable_feature,
		children_best_splits_for_feature,
	) in zip!(
		left_child_splittable_features.iter_mut(),
		right_child_splittable_features.iter_mut(),
		children_best_splits_for_features
	) {
		let (left_child_best_split_for_feature, right_child_best_split_for_feature) =
			children_best_splits_for_feature;
		if left_child_best_split_for_feature.is_some() {
			*left_child_splittable_feature = true;
		}
		if right_child_best_split_for_feature.is_some() {
			*right_child_splittable_feature = true;
		}
	}
	(
		left_child_splittable_features,
		right_child_splittable_features,
	)
}
/// Compute features that are splittable based on whether a valid split was found in this round.
Compute features that are splittable based on whether a valid split was found in this round.
Compute features that are splittable based on whether a valid split was found in this round .
fn compute_splittable_features_for_children(
	children_best_splits_for_features: &[(
		Option<ChooseBestSplitForFeatureOutput>,
		Option<ChooseBestSplitForFeatureOutput>,
	)],
) -> (Vec<bool>, Vec<bool>) {
	let n_features = children_best_splits_for_features.len();
	let mut left_child_splittable_features = vec![false; n_features];
	let mut right_child_splittable_features = vec![false; n_features];
	for (
		left_child_splittable_feature,
		right_child_splittable_feature,
		children_best_splits_for_feature,
	) in zip!(
		left_child_splittable_features.iter_mut(),
		right_child_splittable_features.iter_mut(),
		children_best_splits_for_features
	) {
		let (left_child_best_split_for_feature, right_child_best_split_for_feature) =
			children_best_splits_for_feature;
		if left_child_best_split_for_feature.is_some() {
			*left_child_splittable_feature = true;
		}
		if right_child_best_split_for_feature.is_some() {
			*right_child_splittable_feature = true;
		}
	}
	(
		left_child_splittable_features,
		right_child_splittable_features,
	)
}
fn compute_splittable_features_for_children ( children_best_splits_for_features : & [ ( Option < ChooseBestSplitForFeatureOutput > , Option < ChooseBestSplitForFeatureOutput > , ) ] , ) -> ( Vec < bool > , Vec < bool > ) { let n_features = children_best_splits_for_features . len ( ) ; let mut left_child_splittable_features = vec ! [ false n_features ] ; let mut right_child_splittable_features = vec ! [ false n_features ] ; for ( left_child_splittable_feature , right_child_splittable_feature , children_best_splits_for_feature , ) in zip ! ( left_child_splittable_features iter_mut ( ) right_child_splittable_features iter_mut ( ) children_best_splits_for_features ) { let ( left_child_best_split_for_feature , right_child_best_split_for_feature ) = children_best_splits_for_feature ; if left_child_best_split_for_feature . is_some ( ) { * left_child_splittable_feature = true ; } if right_child_best_split_for_feature . is_some ( ) { * right_child_splittable_feature = true ; } } ( left_child_splittable_features , right_child_splittable_features , ) }
Compute features that are splittable based on whether a valid split was found in this round.
Compute features that are splittable based on whether a valid split was found in this round .
children_best_splits_for_features
&[(
		Option<ChooseBestSplitForFeatureOutput>,
		Option<ChooseBestSplitForFeatureOutput>,
	)]