// Path: ensemble-clustering/src/main/java/com/oculusinfo/ml/feature/Feature.java
// public abstract class Feature implements Serializable {
//     private static final long serialVersionUID = 192274668774344842L;
//     
//     // the unique name of the feature
//     protected String          name;
//    
//     // The weight of this feature
//     private double            weight;
// 
// 	public Feature() {
// 		// empty constructor
// 	    this.weight = 1.0;
// 	}
// 
// 	public Feature(String name) {
// 		this.name = name;
//         this.weight = 1.0;
// 	}
// 
// 	public double getWeight () {
// 	    return weight;
// 	}
// 
// 	public void setWeight (double weight) {
// 	    this.weight = weight;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 	
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 	
// 	@JsonIgnore
// 	public String getId() {
// 		return name;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return name.hashCode();
// 	}
// }


import org.codehaus.jackson.annotate.JsonIgnore;
import com.oculusinfo.ml.feature.Feature;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Copyright (c) 2013 Oculus Info Inc.
 * http://www.oculusinfo.com/
 *
 * Released under the MIT License.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:

 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.oculusinfo.ml;



/***
 * Instance represents one "row" or "group" of data describing one entity in a data set.
 * The instances are associated with a collection of typed features that represent the data values
 * of the entity.  Each instance can be provided a distinguishing "label" that can be used for classification.
 * 
 * Each instance is assumed to be provided a unique identifier.  If none is provided, then one will be generated.
 * 
 * @author slangevin
 *
 */
public class Instance implements Serializable {
	private static final long serialVersionUID = -8781788906032267606L;
	
	protected String 	id;
	protected String	classLabel;
	protected Map<String, Feature> features = new LinkedHashMap<String, Feature>();
	
	public Instance() { 
		this(UUID.randomUUID().toString());
	}
	
	/***
	 * Constructor to specify your own id's
	 * 
	 * NOTE: id's MUST be unique!  It's is up to the caller to ensure this.
	 * 
	 * @param id
	 */
	public Instance(String id) {
		this.id = id;
	}
	
	/***
	 * Return whether this Instance has the specified label
	 * 
	 * @param label label to test
	 * @return true if the Instance has a matching class label
	 */

// Path: ensemble-clustering/src/main/java/com/oculusinfo/ml/feature/Feature.java
// public abstract class Feature implements Serializable {
//     private static final long serialVersionUID = 192274668774344842L;
//     
//     // the unique name of the feature
//     protected String          name;
//    
//     // The weight of this feature
//     private double            weight;
// 
// 	public Feature() {
// 		// empty constructor
// 	    this.weight = 1.0;
// 	}
// 
// 	public Feature(String name) {
// 		this.name = name;
//         this.weight = 1.0;
// 	}
// 
// 	public double getWeight () {
// 	    return weight;
// 	}
// 
// 	public void setWeight (double weight) {
// 	    this.weight = weight;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 	
// 	public void setName(String name) {
// 		this.name = name;
// 	}
// 	
// 	@JsonIgnore
// 	public String getId() {
// 		return name;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return name.hashCode();
// 	}
// }


// Path: ensemble-clustering/src/main/java/com/oculusinfo/ml/Instance.java
import org.codehaus.jackson.annotate.JsonIgnore;
import com.oculusinfo.ml.feature.Feature;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Copyright (c) 2013 Oculus Info Inc.
 * http://www.oculusinfo.com/
 *
 * Released under the MIT License.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:

 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package com.oculusinfo.ml;



/***
 * Instance represents one "row" or "group" of data describing one entity in a data set.
 * The instances are associated with a collection of typed features that represent the data values
 * of the entity.  Each instance can be provided a distinguishing "label" that can be used for classification.
 * 
 * Each instance is assumed to be provided a unique identifier.  If none is provided, then one will be generated.
 * 
 * @author slangevin
 *
 */
public class Instance implements Serializable {
	private static final long serialVersionUID = -8781788906032267606L;
	
	protected String 	id;
	protected String	classLabel;
	protected Map<String, Feature> features = new LinkedHashMap<String, Feature>();
	
	public Instance() { 
		this(UUID.randomUUID().toString());
	}
	
	/***
	 * Constructor to specify your own id's
	 * 
	 * NOTE: id's MUST be unique!  It's is up to the caller to ensure this.
	 * 
	 * @param id
	 */
	public Instance(String id) {
		this.id = id;
	}
	
	/***
	 * Return whether this Instance has the specified label
	 * 
	 * @param label label to test
	 * @return true if the Instance has a matching class label
	 */

	public boolean hasClassLabel(String label) {
