📄 filter.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* Filter.java
* Copyright (C) 2002 Mark Hall
*
*/
package weka.gui.beans;
import java.awt.BorderLayout;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.EventObject;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.JPanel;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.AllFilter;
import weka.filters.StreamableFilter;
import weka.filters.SupervisedFilter;
import weka.gui.Logger;
/**
* A wrapper bean for Weka filters
*
* @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a>
* @version $Revision$
*/
public class Filter extends JPanel
implements BeanCommon, Visible, WekaWrapper,
Serializable, UserRequestAcceptor,
TrainingSetListener, TestSetListener,
TrainingSetProducer, TestSetProducer,
DataSource, DataSourceListener,
InstanceListener, EventConstraints {
protected BeanVisual m_visual =
new BeanVisual("Filter",
BeanVisual.ICON_PATH+"DefaultFilter.gif",
BeanVisual.ICON_PATH+"DefaultFilter_animated.gif");
private static int IDLE = 0;
private static int FILTERING_TRAINING = 1;
private static int FILTERING_TEST = 2;
private int m_state = IDLE;
protected Thread m_filterThread = null;
private transient Instances m_trainingSet;
private transient Instances m_testingSet;
/**
* Global info for the wrapped filter (if it exists).
*/
protected String m_globalInfo;
/**
* Objects talking to us
*/
private Hashtable m_listenees = new Hashtable();
/**
* Objects listening for training set events
*/
private Vector m_trainingListeners = new Vector();
/**
* Objects listening for test set events
*/
private Vector m_testListeners = new Vector();
/**
* Objects listening for instance events
*/
private Vector m_instanceListeners = new Vector();
/**
* Objects listening for data set events
*/
private Vector m_dataListeners = new Vector();
/**
* The filter to use.
*/
private weka.filters.Filter m_Filter = new AllFilter();
/**
* Instance event object for passing on filtered instance streams
*/
private InstanceEvent m_ie = new InstanceEvent(this);
private transient Logger m_log = null;
/**
* Global info (if it exists) for the wrapped filter
*
* @return the global info
*/
public String globalInfo() {
return m_globalInfo;
}
public Filter() {
setLayout(new BorderLayout());
add(m_visual, BorderLayout.CENTER);
setFilter(m_Filter);
}
/**
* Set the filter to be wrapped by this bean
*
* @param c a <code>weka.filters.Filter</code> value
*/
public void setFilter(weka.filters.Filter c) {
boolean loadImages = true;
if (c.getClass().getName().
compareTo(m_Filter.getClass().getName()) == 0) {
loadImages = false;
}
m_Filter = c;
String filterName = c.getClass().toString();
filterName = filterName.substring(filterName.
indexOf('.')+1,
filterName.length());
if (loadImages) {
if (!m_visual.loadIcons(BeanVisual.ICON_PATH+filterName+".gif",
BeanVisual.ICON_PATH+filterName+"_animated.gif")) {
useDefaultVisual();
}
}
m_visual.setText(filterName.substring(filterName.lastIndexOf('.')+1,
filterName.length()));
if (!(m_Filter instanceof StreamableFilter) &&
(m_listenees.containsKey("instance"))) {
if (m_log != null) {
m_log.logMessage("WARNING : "+m_Filter.getClass().getName()
+" is not an incremental filter");
}
}
// get global info
m_globalInfo = KnowledgeFlow.getGlobalInfo(m_Filter);
}
public weka.filters.Filter getFilter() {
return m_Filter;
}
/**
* Set the filter to be wrapped by this bean
*
* @param algorithm a weka.filters.Filter
* @exception IllegalArgumentException if an error occurs
*/
public void setWrappedAlgorithm(Object algorithm) {
if (!(algorithm instanceof weka.filters.Filter)) {
throw new IllegalArgumentException(algorithm.getClass()+" : incorrect "
+"type of algorithm (Filter)");
}
setFilter((weka.filters.Filter)algorithm);
}
/**
* Get the filter wrapped by this bean
*
* @return an <code>Object</code> value
*/
public Object getWrappedAlgorithm() {
return getFilter();
}
/**
* Accept a training set
*
* @param e a <code>TrainingSetEvent</code> value
*/
public void acceptTrainingSet(TrainingSetEvent e) {
processTrainingOrDataSourceEvents(e);
}
private boolean m_structurePassedOn = false;
/**
* Accept an instance for processing by StreamableFilters only
*
* @param e an <code>InstanceEvent</code> value
*/
public void acceptInstance(InstanceEvent e) {
// to do!
if (m_filterThread != null) {
String messg = "Filter is currently batch processing!";
if (m_log != null) {
m_log.logMessage(messg);
} else {
System.err.println(messg);
}
return;
}
if (!(m_Filter instanceof StreamableFilter)) {
if (m_log != null) {
m_log.logMessage("ERROR : "+m_Filter.getClass().getName()
+"can't process streamed instances; can't continue");
}
return;
}
if (e.getStatus() == InstanceEvent.FORMAT_AVAILABLE) {
try {
// Instances dataset = e.getInstance().dataset();
Instances dataset = e.getStructure();
if (m_Filter instanceof SupervisedFilter) {
// defualt to last column if no class is set
if (dataset.classIndex() < 0) {
dataset.setClassIndex(dataset.numAttributes()-1);
}
}
// initialize filter
m_Filter.setInputFormat(dataset);
// attempt to determine post-filtering
// structure. If successful this can be passed on to instance
// listeners as a new FORMAT_AVAILABLE event.
m_structurePassedOn = false;
try {
if (m_Filter.isOutputFormatDefined()) {
// System.err.println(m_Filter.getOutputFormat());
m_ie.setStructure(m_Filter.getOutputFormat());
notifyInstanceListeners(m_ie);
m_structurePassedOn = true;
}
} catch (Exception ex) {
System.err.println("Error in obtaining post-filter structure: Filter.java");
}
} catch (Exception ex) {
ex.printStackTrace();
}
return;
}
// pass instance through the filter
try {
if (!m_Filter.input(e.getInstance())) {
if (m_log != null) {
m_log.logMessage("ERROR : filter not ready to output instance");
}
return;
}
// collect output instance.
Instance filteredInstance = m_Filter.output();
if (filteredInstance == null) {
return;
}
if (!m_structurePassedOn) {
// pass on the new structure first
m_ie.setStructure(new Instances(filteredInstance.dataset(), 0));
notifyInstanceListeners(m_ie);
m_structurePassedOn = true;
}
m_ie.setInstance(filteredInstance);
m_ie.setStatus(e.getStatus());
notifyInstanceListeners(m_ie);
} catch (Exception ex) {
if (m_log != null) {
m_log.logMessage(ex.toString());
}
ex.printStackTrace();
}
}
private void processTrainingOrDataSourceEvents(final EventObject e) {
boolean structureOnly = false;
if (e instanceof DataSetEvent) {
structureOnly = ((DataSetEvent)e).isStructureOnly();
}
if (e instanceof TrainingSetEvent) {
structureOnly = ((TrainingSetEvent)e).isStructureOnly();
}
if (structureOnly && !(m_Filter instanceof StreamableFilter)) {
return; // nothing can be done
}
if (m_filterThread == null) {
try {
if (m_state == IDLE) {
synchronized (this) {
m_state = FILTERING_TRAINING;
}
m_trainingSet = (e instanceof TrainingSetEvent)
? ((TrainingSetEvent)e).getTrainingSet()
: ((DataSetEvent)e).getDataSet();
final String oldText = m_visual.getText();
m_filterThread = new Thread() {
public void run() {
try {
if (m_trainingSet != null) {
m_visual.setAnimated();
m_visual.setText("Filtering training data...");
if (m_log != null) {
m_log.statusMessage("Filter : filtering training data ("
+m_trainingSet.relationName());
}
m_Filter.setInputFormat(m_trainingSet);
Instances filteredData =
weka.filters.Filter.useFilter(m_trainingSet, m_Filter);
m_visual.setText(oldText);
m_visual.setStatic();
EventObject ne;
if (e instanceof TrainingSetEvent) {
ne = new TrainingSetEvent(weka.gui.beans.Filter.this,
filteredData);
((TrainingSetEvent)ne).m_setNumber =
((TrainingSetEvent)e).m_setNumber;
((TrainingSetEvent)ne).m_maxSetNumber =
((TrainingSetEvent)e).m_maxSetNumber;
} else {
ne = new DataSetEvent(weka.gui.beans.Filter.this,
filteredData);
}
notifyDataOrTrainingListeners(ne);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
m_visual.setText(oldText);
m_visual.setStatic();
m_state = IDLE;
if (isInterrupted()) {
m_trainingSet = null;
if (m_log != null) {
m_log.logMessage("Filter training set interrupted!");
m_log.statusMessage("OK");
}
}
block(false);
}
}
};
m_filterThread.setPriority(Thread.MIN_PRIORITY);
m_filterThread.start();
block(true);
m_filterThread = null;
m_state = IDLE;
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* Accept a test set
*
* @param e a <code>TestSetEvent</code> value
*/
public void acceptTestSet(final TestSetEvent e) {
if (m_trainingSet != null &&
m_trainingSet.equalHeaders(e.getTestSet()) &&
m_filterThread == null) {
try {
if (m_state == IDLE) {
m_state = FILTERING_TEST;
}
m_testingSet = e.getTestSet();
final String oldText = m_visual.getText();
m_filterThread = new Thread() {
public void run() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -