package com.yahoo.labs.samoa.moa.core; /* * #%L * SAMOA * %% * Copyright (C) 2013 RWTH Aachen University, Germany * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import java.util.HashMap; import java.util.Iterator; import java.util.TreeSet; import com.yahoo.labs.samoa.instances.Attribute; import com.yahoo.labs.samoa.instances.DenseInstance; import com.yahoo.labs.samoa.instances.Instance; public class DataPoint extends DenseInstance{ private static final long serialVersionUID = 1L; protected int timestamp; private HashMap<String, String> measure_values; protected int noiseLabel; public DataPoint(Instance nextInstance, Integer timestamp) { super(nextInstance); this.setDataset(nextInstance.dataset()); this.timestamp = timestamp; measure_values = new HashMap<String, String>(); Attribute classLabel = dataset().classAttribute(); noiseLabel = classLabel.indexOfValue("noise"); // -1 returned if there is no noise } public void updateWeight(int cur_timestamp, double decay_rate){ setWeight(Math.pow(2,(-1.0)*decay_rate*(cur_timestamp-timestamp))); } public void setMeasureValue(String measureKey, double value){ synchronized(measure_values){ measure_values.put(measureKey, Double.toString(value)); } } public void setMeasureValue(String measureKey,String value){ synchronized(measure_values){ measure_values.put(measureKey, value); } } public String getMeasureValue(String measureKey){ if(measure_values.containsKey(measureKey)) synchronized(measure_values){ return measure_values.get(measureKey); } else return ""; } public int getTimestamp(){ return timestamp; } public String getInfo(int x_dim, int y_dim) { StringBuffer sb = new StringBuffer(); sb.append("<html><table>"); sb.append("<tr><td>Point</td><td>"+timestamp+"</td></tr>"); for (int i = 0; i < numAttributes() - 1; i++) { //m_AttValues.length String label = "Dim "+i; if(i == x_dim) label = "<b>X</b>"; if(i == y_dim) label = "<b>Y</b>"; sb.append("<tr><td>"+label+"</td><td>"+value(i)+"</td></tr>"); } sb.append("<tr><td>Decay</td><td>"+weight()+"</td></tr>"); sb.append("<tr><td>True cluster</td><td>"+classValue()+"</td></tr>"); sb.append("</table>"); sb.append("<br>"); sb.append("<b>Evaluation</b><br>"); sb.append("<table>"); TreeSet<String> sortedset; synchronized(measure_values){ sortedset = new TreeSet<String>(measure_values.keySet()); } Iterator miterator = sortedset.iterator(); while(miterator.hasNext()) { String key = (String)miterator.next(); sb.append("<tr><td>"+key+"</td><td>"+measure_values.get(key)+"</td></tr>"); } sb.append("</table></html>"); return sb.toString(); } public double getDistance(DataPoint other){ double distance = 0.0; int numDims = numAttributes(); if(classIndex()!=0) numDims--; for (int i = 0; i < numDims; i++) { double d = value(i) - other.value(i); distance += d * d; } return Math.sqrt(distance); } public boolean isNoise() { return (int)classValue() == noiseLabel; } public double getNoiseLabel() { return noiseLabel; } }