📄 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.util.Vector;import java.util.EventObject;import java.util.Hashtable;import java.util.Enumeration;import javax.swing.JPanel;import javax.swing.JLabel;import javax.swing.JTextField;import java.awt.BorderLayout;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.InputEvent;import java.awt.*;import java.io.Serializable;import java.io.Reader;import java.io.BufferedReader;import java.io.FileReader;import java.io.File;import javax.swing.ImageIcon;import javax.swing.SwingConstants;import java.beans.EventSetDescriptor;import weka.core.Instance;import weka.core.Instances;import weka.filters.*;import weka.gui.Logger;/** * A wrapper bean for Weka filters * * @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a> * @version $Revision: 1.1.1.1 $ */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; /** * 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; 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. lastIndexOf('.')+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); 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"); } } } 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) throws IllegalArgumentException { 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); } /** * 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(); 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); } catch (Exception ex) { ex.printStackTrace(); } } // 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; } 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) { 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() { try { if (m_testingSet != null) { m_visual.setAnimated(); m_visual.setText("Filtering test data..."); if (m_log != null) { m_log.statusMessage("Filter : filtering test data (" +m_testingSet.relationName()); } Instances filteredTest = weka.filters.Filter.useFilter(m_testingSet, m_Filter); m_visual.setText(oldText); m_visual.setStatic(); TestSetEvent ne = new TestSetEvent(weka.gui.beans.Filter.this, filteredTest); ne.m_setNumber = e.m_setNumber; ne.m_maxSetNumber = e.m_maxSetNumber; notifyTestListeners(ne); } } catch (Exception ex) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -