📄 experiment.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. *//* * Experiment.java * Copyright (C) 1999 Len Trigg * */package weka.experiment;import weka.core.OptionHandler;import weka.core.Utils;import weka.core.Option;import weka.core.Instances;import weka.core.FastVector;import weka.core.AdditionalMeasureProducer;import java.io.Serializable;import java.io.File;import java.io.IOException;import java.io.Reader;import java.io.FileReader;import java.io.BufferedReader;import java.lang.reflect.Array;import java.lang.reflect.Method;import java.util.Enumeration;import java.util.Vector;import java.beans.PropertyDescriptor;import javax.swing.DefaultListModel;import java.io.FileInputStream;import java.io.ObjectInputStream;import java.io.BufferedInputStream;import java.io.FileOutputStream;import java.io.BufferedOutputStream;import java.io.ObjectOutputStream;import java.beans.Customizer;import java.beans.PropertyChangeEvent;import java.beans.PropertyDescriptor;import java.beans.MethodDescriptor;import java.beans.PropertyEditor;import java.beans.PropertyChangeSupport;import java.beans.PropertyChangeListener;/** * Holds all the necessary configuration information for a standard * type experiment. This object is able to be serialized for storage * on disk. * * @author Len Trigg (trigg@cs.waikato.ac.nz) * @version $Revision: 1.3 $ */public class Experiment implements Serializable, OptionHandler { /** The filename extension that should be used for experiment files */ public static String FILE_EXTENSION = ".exp"; /** Where results will be sent */ //==================== BEGIN EDIT mbilenko ============================ protected ResultListener m_ResultListener = new InstancesResultListener(); //==================== END EDIT mbilenko ============================== /** The result producer */ protected ResultProducer m_ResultProducer = new RandomSplitResultProducer(); /** Lower run number */ protected int m_RunLower = 1; /** Upper run number */ protected int m_RunUpper = 10; /** An array of dataset files */ protected DefaultListModel m_Datasets = new DefaultListModel(); /** True if the exp should also iterate over a property of the RP */ protected boolean m_UsePropertyIterator = false; /** The path to the iterator property */ protected PropertyNode [] m_PropertyPath; /** The array of values to set the property to */ protected Object m_PropertyArray; /** User notes about the experiment */ protected String m_Notes = ""; /** Method names of additional measures of objects contained in the custom property iterator. Only methods names beginning with "measure" and returning doubles are recognised */ protected String [] m_AdditionalMeasures = null; /** True if the class attribute is the first attribute for all datasets involved in this experiment. */ protected boolean m_ClassFirst = false; /** If true an experiment will advance the current data set befor any custom itererator */ protected boolean m_AdvanceDataSetFirst = true; /** * Sets whether the first attribute is treated as the class * for all datasets involved in the experiment. This information * is not output with the result of the experiments! */ public void classFirst(boolean flag) { m_ClassFirst = flag; } boolean m_m_AdvanceRunFirst; /** * Get the value of m_DataSetFirstFirst. * * @return Value of m_DataSetFirstFirst. */ public boolean getAdvanceDataSetFirst() { return m_AdvanceDataSetFirst; } /** * Set the value of m_AdvanceDataSetFirst. * * @param newm_AdvanceDataSetFirst Value to assign to m_AdvanceRunFirst. */ public void setAdvanceDataSetFirst(boolean newAdvanceDataSetFirst) { m_AdvanceDataSetFirst = newAdvanceDataSetFirst; } /** * Gets whether the custom property iterator should be used. * * @return true if so */ public boolean getUsePropertyIterator() { return m_UsePropertyIterator; } /** * Sets whether the custom property iterator should be used. * * @param newUsePropertyIterator true if so */ public void setUsePropertyIterator(boolean newUsePropertyIterator) { m_UsePropertyIterator = newUsePropertyIterator; } /** * Gets the path of properties taken to get to the custom property * to iterate over. * * @return an array of PropertyNodes */ public PropertyNode [] getPropertyPath() { return m_PropertyPath; } /** * Sets the path of properties taken to get to the custom property * to iterate over. * * @param newPropertyPath an array of PropertyNodes */ public void setPropertyPath(PropertyNode [] newPropertyPath) { m_PropertyPath = newPropertyPath; } /** * Sets the array of values to set the custom property to. * * @param newPropArray a value of type Object which should be an * array of the appropriate values. */ public void setPropertyArray(Object newPropArray) { m_PropertyArray = newPropArray; } /** * Gets the array of values to set the custom property to. * * @return a value of type Object which should be an * array of the appropriate values. */ public Object getPropertyArray() { return m_PropertyArray; } /** * Gets the number of custom iterator values that have been defined * for the experiment. * * @return the number of custom property iterator values. */ public int getPropertyArrayLength() { return Array.getLength(m_PropertyArray); } /** * Gets a specified value from the custom property iterator array. * * @param index the index of the value wanted * @return the property array value */ public Object getPropertyArrayValue(int index) { return Array.get(m_PropertyArray, index); } /* These may potentially want to be made un-transient if it is decided * that experiments may be saved mid-run and later resumed */ /** The current run number when the experiment is running */ protected transient int m_RunNumber; /** The current dataset number when the experiment is running */ protected transient int m_DatasetNumber; /** The current custom property value index when the experiment is running */ protected transient int m_PropertyNumber; /** True if the experiment has finished running */ protected transient boolean m_Finished = true; /** The dataset currently being used */ protected transient Instances m_CurrentInstances; /** The custom property value that has actually been set */ protected transient int m_CurrentProperty; /** * When an experiment is running, this returns the current run number. * * @return the current run number. */ public int getCurrentRunNumber() { return m_RunNumber; } /** * When an experiment is running, this returns the current dataset number. * * @return the current dataset number. */ public int getCurrentDatasetNumber() { return m_DatasetNumber; } /** * When an experiment is running, this returns the index of the * current custom property value. * * @return the index of the current custom property value. */ public int getCurrentPropertyNumber() { return m_PropertyNumber; } /** * Prepares an experiment for running, initializing current iterator * settings. * * @exception Exception if an error occurs */ public void initialize() throws Exception { m_RunNumber = getRunLower(); m_DatasetNumber = 0; m_PropertyNumber = 0; m_CurrentProperty = -1; m_CurrentInstances = null; m_Finished = false; if (m_UsePropertyIterator && (m_PropertyArray == null)) { throw new Exception("Null array for property iterator"); } if (getRunLower() > getRunUpper()) { throw new Exception("Lower run number is greater than upper run number"); } if (getDatasets().size() == 0) { throw new Exception("No datasets have been specified"); } if (m_ResultProducer == null) { throw new Exception("No ResultProducer set"); } if (m_ResultListener == null) { throw new Exception("No ResultListener set"); } // if (m_UsePropertyIterator && (m_PropertyArray != null)) { determineAdditionalResultMeasures(); // } m_ResultProducer.setResultListener(m_ResultListener); m_ResultProducer.setAdditionalMeasures(m_AdditionalMeasures); m_ResultProducer.preProcess(); // constrain the additional measures to be only those allowable // by the ResultListener String [] columnConstraints = m_ResultListener. determineColumnConstraints(m_ResultProducer); if (columnConstraints != null) { m_ResultProducer.setAdditionalMeasures(columnConstraints); } } /** * Iterate over the objects in the property array to determine what * (if any) additional measures they support */ private void determineAdditionalResultMeasures() throws Exception { m_AdditionalMeasures = null; FastVector measureNames = new FastVector(); // first try the result producer, then property array if applicable if (m_ResultProducer instanceof AdditionalMeasureProducer) { Enumeration am = ((AdditionalMeasureProducer)m_ResultProducer). enumerateMeasures(); while (am.hasMoreElements()) { String mname = (String)am.nextElement(); if (mname.startsWith("measure")) { if (measureNames.indexOf(mname) == -1) { measureNames.addElement(mname); } } else { throw new Exception ("Additional measures in " + m_ResultProducer.getClass().getName() +" must obey the naming convention" +" of starting with \"measure\""); } } } if (m_UsePropertyIterator && (m_PropertyArray != null)) { for (int i = 0; i < Array.getLength(m_PropertyArray); i++) { Object current = Array.get(m_PropertyArray, i); if (current instanceof AdditionalMeasureProducer) { Enumeration am = ((AdditionalMeasureProducer)current). enumerateMeasures(); while (am.hasMoreElements()) { String mname = (String)am.nextElement(); if (mname.startsWith("measure")) { if (measureNames.indexOf(mname) == -1) { measureNames.addElement(mname); } } else { throw new Exception ("Additional measures in " + current.getClass().getName() +" must obey the naming convention" +" of starting with \"measure\""); } } } } } if (measureNames.size() > 0) { m_AdditionalMeasures = new String [measureNames.size()]; for (int i=0;i<measureNames.size();i++) { m_AdditionalMeasures[i] = (String)measureNames.elementAt(i); } } } /** * Recursively sets the custom property value, by setting all values * along the property path. * * @param propertyDepth the current position along the property path * @param origValue the value to set the property to * @exception Exception if an error occurs */ protected void setProperty(int propertyDepth, Object origValue) throws Exception { PropertyDescriptor current = m_PropertyPath[propertyDepth].property; Object subVal = null; if (propertyDepth < m_PropertyPath.length - 1) { Method getter = current.getReadMethod(); Object getArgs [] = { }; subVal = getter.invoke(origValue, getArgs); setProperty(propertyDepth + 1, subVal); } else { subVal = Array.get(m_PropertyArray, m_PropertyNumber); } Method setter = current.getWriteMethod(); Object [] args = { subVal }; setter.invoke(origValue, args); } /** * Returns true if there are more iterations to carry out in the experiment. * * @return true if so */ public boolean hasMoreIterations() { return !m_Finished; } /** * Carries out the next iteration of the experiment. * * @exception Exception if an error occurs */ public void nextIteration() throws Exception { if (m_UsePropertyIterator) { if (m_CurrentProperty != m_PropertyNumber) { setProperty(0, m_ResultProducer); m_CurrentProperty = m_PropertyNumber; } } if (m_CurrentInstances == null) { File currentFile = (File) getDatasets().elementAt(m_DatasetNumber); Reader reader = new FileReader(currentFile); Instances data = new Instances(new BufferedReader(reader)); if (m_ClassFirst) { data.setClassIndex(0); } else { data.setClassIndex(data.numAttributes() - 1); } m_CurrentInstances = data; m_ResultProducer.setInstances(m_CurrentInstances); } m_ResultProducer.doRun(m_RunNumber); advanceCounters(); } /** * Increments iteration counters appropriately. */ public void advanceCounters() { if (m_AdvanceDataSetFirst) { m_RunNumber ++; if (m_RunNumber > getRunUpper()) { m_RunNumber = getRunLower(); m_DatasetNumber ++; m_CurrentInstances = null; if (m_DatasetNumber >= getDatasets().size()) { m_DatasetNumber = 0; if (m_UsePropertyIterator) { m_PropertyNumber ++; if (m_PropertyNumber >= Array.getLength(m_PropertyArray)) { m_Finished = true; } } else { m_Finished = true; } } } } else { // advance by custom iterator before data set m_RunNumber ++; if (m_RunNumber > getRunUpper()) { m_RunNumber = getRunLower(); if (m_UsePropertyIterator) { m_PropertyNumber ++; if (m_PropertyNumber >= Array.getLength(m_PropertyArray)) { m_PropertyNumber = 0; m_DatasetNumber ++; m_CurrentInstances = null; if (m_DatasetNumber >= getDatasets().size()) { m_Finished = true; } } } else { m_DatasetNumber ++; m_CurrentInstances = null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -