/*
* File: AbstractWeightedEnsemble.java
* Authors: Justin Basilico
* Project: Cognitive Foundry Learning Core
*
* Copyright 2011 Cognitive Foundry. All rights reserved.
*/
package gov.sandia.cognition.learning.algorithm.ensemble;
import gov.sandia.cognition.util.AbstractCloneableSerializable;
import gov.sandia.cognition.util.ArgumentChecker;
import gov.sandia.cognition.util.DefaultWeightedValue;
import gov.sandia.cognition.util.ObjectUtil;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
import java.util.List;
/**
* An abstract implementation of the {@code Ensemble} interface for ensembles
* that have a weight associated with each member. Implements the ensemble as a
* list of weighted values.
*
* @param <MemberType>
* The type of the members of this weighted ensemble.
* @author Justin Basilico
* @since 3.3.3
*/
public class AbstractWeightedEnsemble<MemberType>
extends AbstractCloneableSerializable
implements Ensemble<WeightedValue<MemberType>>
{
/** The default weight when adding a member is {@value}. */
public static final double DEFAULT_WEIGHT = 1.0;
/** The members of the ensemble. */
protected List<WeightedValue<MemberType>> members;
/**
* Creates a new, empty of AbstractWeightedEnsemble.
*/
public AbstractWeightedEnsemble()
{
this(new ArrayList<WeightedValue<MemberType>>());
}
/**
* Creates a new instance of AbstractWeightedEnsemble.
*
* @param members
* The members of the ensemble.
*/
public AbstractWeightedEnsemble(
final List<WeightedValue<MemberType>> members)
{
super();
this.setMembers(members);
}
@Override
public AbstractWeightedEnsemble<MemberType> clone()
{
@SuppressWarnings("unchecked")
final AbstractWeightedEnsemble<MemberType> clone =
(AbstractWeightedEnsemble<MemberType>) super.clone();
clone.members = ObjectUtil.cloneSmartElementsAsArrayList(this.members);
return clone;
}
/**
* Adds the given regression function with a default weight of 1.0.
*
* @param member
* The regression function to add.
*/
public void add(
final MemberType member)
{
this.add(member, DEFAULT_WEIGHT);
}
/**
* Adds the given regression function with a given weight.
*
* @param member
* The regression function to add.
* @param weight
* The weight for the new member.
*/
public void add(
final MemberType member,
final double weight)
{
ArgumentChecker.assertIsNotNull("categorizer", member);
final WeightedValue<MemberType> weighted =
new DefaultWeightedValue<MemberType>(member, weight);
this.getMembers().add(weighted);
}
/**
* Gets the number of members in the ensemble.
*
* @return
* The number of members in the ensemble.
*/
public int getMemberCount()
{
return this.getMembers().size();
}
/**
* Gets the sum of the weights of the ensemble members.
*
* @return
* The sum of the ensemble member weights.
*/
public double getWeightSum()
{
double sum = 0.0;
for (WeightedValue<?> weighted : this.getMembers())
{
sum += weighted.getWeight();
}
return sum;
}
/**
* Gets the members of the ensemble.
*
* @return The members of the ensemble.
*/
@Override
public List<WeightedValue<MemberType>> getMembers()
{
return this.members;
}
/**
* Sets the members of the ensemble.
*
* @param members The members of the ensemble.
*/
public void setMembers(
final List<WeightedValue<MemberType>> members)
{
this.members = members;
}
}