largeRCRF-Java/src/main/java/ca/joeltherrien/randomforest/covariates/BooleanCovariate.java

90 lines
2.3 KiB
Java

package ca.joeltherrien.randomforest.covariates;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@RequiredArgsConstructor
public final class BooleanCovariate implements Covariate<Boolean>{
@Getter
private final String name;
private final BooleanSplitRule splitRule = new BooleanSplitRule(); // there's only one possible rule for BooleanCovariates.
@Override
public Collection<BooleanSplitRule> generateSplitRules(List<Value<Boolean>> data, int number) {
return Collections.singleton(splitRule);
}
@Override
public BooleanValue createValue(Boolean value) {
return new BooleanValue(value);
}
@Override
public Value<Boolean> createValue(String value) {
if(value == null || value.equalsIgnoreCase("na")){
return createValue( (Boolean) null);
}
if(value.equalsIgnoreCase("true")){
return createValue(true);
}
else if(value.equalsIgnoreCase("false")){
return createValue(false);
}
else{
throw new IllegalArgumentException("Require either true/false/na to create BooleanCovariate");
}
}
public class BooleanValue implements Value<Boolean>{
private final Boolean value;
private BooleanValue(final Boolean value){
this.value = value;
}
@Override
public BooleanCovariate getParent() {
return BooleanCovariate.this;
}
@Override
public Boolean getValue() {
return value;
}
@Override
public boolean isNA() {
return value == null;
}
}
public class BooleanSplitRule implements SplitRule<Boolean>{
@Override
public final String toString() {
return "BooleanSplitRule";
}
@Override
public BooleanCovariate getParent() {
return BooleanCovariate.this;
}
@Override
public boolean isLeftHand(final Value<Boolean> value) {
if(value.isNA()) {
throw new IllegalArgumentException("Trying to determine split on missing value");
}
return !value.getValue();
}
}
}