source: src/main/java/weka/core/CheckOptionHandler.java @ 10

Last change on this file since 10 was 4, checked in by gnappo, 14 years ago

Import di weka.

File size: 14.6 KB
Line 
1/*
2 *    This program is free software; you can redistribute it and/or modify
3 *    it under the terms of the GNU General Public License as published by
4 *    the Free Software Foundation; either version 2 of the License, or
5 *    (at your option) any later version.
6 *
7 *    This program is distributed in the hope that it will be useful,
8 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 *    GNU General Public License for more details.
11 *
12 *    You should have received a copy of the GNU General Public License
13 *    along with this program; if not, write to the Free Software
14 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
15 */
16
17/*
18 *    CheckOptionHandler.java
19 *    Copyright (C) 1999 University of Waikato, Hamilton, New Zealand
20 *
21 */
22
23package weka.core;
24
25import java.util.Enumeration;
26import java.util.Vector;
27
28/**
29 * Simple command line checking of classes that implement OptionHandler.<p/>
30 *
31 * Usage: <p/>
32 * <code>
33 *     CheckOptionHandler -W optionHandlerClassName -- test options
34 * </code> <p/>
35 *
36 <!-- options-start -->
37 * Valid options are: <p/>
38 *
39 * <pre> -D
40 *  Turn on debugging output.</pre>
41 *
42 * <pre> -S
43 *  Silent mode - prints nothing to stdout.</pre>
44 *
45 * <pre> -W
46 *  Full name of the OptionHandler analysed.
47 *  eg: weka.classifiers.rules.ZeroR
48 *  (default weka.classifiers.rules.ZeroR)</pre>
49 *
50 * <pre>
51 * Options specific to option handler weka.classifiers.rules.ZeroR:
52 * </pre>
53 *
54 * <pre> -D
55 *  If set, classifier is run in debug mode and
56 *  may output additional info to the console</pre>
57 *
58 <!-- options-end -->
59 *
60 * Options after -- are used as user options in testing the
61 * OptionHandler
62 *
63 * @author Len Trigg (trigg@cs.waikato.ac.nz)
64 * @author FracPete (fracpete at waikato dot ac dot nz)
65 * @version $Revision: 5953 $
66 */
67public class CheckOptionHandler
68  extends Check {
69
70  /** the optionhandler to test */
71  protected OptionHandler m_OptionHandler = new weka.classifiers.rules.ZeroR();
72
73  /** the user-supplied options */
74  protected String[] m_UserOptions = new String[0];
75 
76  /** whether the tests were successful */
77  protected boolean m_Success;
78 
79  /**
80   * Returns an enumeration describing the available options.
81   *
82   * @return an enumeration of all the available options.
83   */
84  public Enumeration listOptions() {
85    Vector<Option> result = new Vector<Option>();
86   
87    Enumeration en = super.listOptions();
88    while (en.hasMoreElements())
89      result.addElement((Option)en.nextElement());
90   
91    result.addElement(new Option(
92        "\tFull name of the OptionHandler analysed.\n"
93        +"\teg: weka.classifiers.rules.ZeroR\n"
94        + "\t(default weka.classifiers.rules.ZeroR)",
95        "W", 1, "-W"));
96   
97    if (m_OptionHandler != null) {
98      result.addElement(new Option(
99          "", "", 0, 
100          "\nOptions specific to option handler " 
101          + m_OptionHandler.getClass().getName() + ":"));
102     
103      Enumeration enm = m_OptionHandler.listOptions();
104      while (enm.hasMoreElements())
105        result.addElement((Option)enm.nextElement());
106    }
107   
108    return result.elements();
109  }
110 
111  /**
112   * Parses a given list of options. <p/>
113   *
114   <!-- options-start -->
115   * Valid options are: <p/>
116   *
117   * <pre> -D
118   *  Turn on debugging output.</pre>
119   *
120   * <pre> -S
121   *  Silent mode - prints nothing to stdout.</pre>
122   *
123   * <pre> -W
124   *  Full name of the OptionHandler analysed.
125   *  eg: weka.classifiers.rules.ZeroR
126   *  (default weka.classifiers.rules.ZeroR)</pre>
127   *
128   * <pre>
129   * Options specific to option handler weka.classifiers.rules.ZeroR:
130   * </pre>
131   *
132   * <pre> -D
133   *  If set, classifier is run in debug mode and
134   *  may output additional info to the console</pre>
135   *
136   <!-- options-end -->
137   *
138   * @param options the list of options as an array of strings
139   * @throws Exception if an option is not supported
140   */
141  public void setOptions(String[] options) throws Exception {
142    String      tmpStr;
143   
144    super.setOptions(options);
145   
146    tmpStr = Utils.getOption('W', options);
147    if (tmpStr.length() == 0)
148      tmpStr = weka.classifiers.rules.ZeroR.class.getName();
149    setUserOptions(Utils.partitionOptions(options));
150    setOptionHandler(
151        (OptionHandler) Utils.forName(
152            OptionHandler.class, tmpStr, null));
153  }
154 
155  /**
156   * Gets the current settings of the CheckClassifier.
157   *
158   * @return an array of strings suitable for passing to setOptions
159   */
160  public String[] getOptions() {
161    Vector<String>        result;
162    String[]      options;
163    int           i;
164   
165    result = new Vector<String>();
166   
167    options = super.getOptions();
168    for (i = 0; i < options.length; i++)
169      result.add(options[i]);
170   
171    if (getOptionHandler() != null) {
172      result.add("-W");
173      result.add(getOptionHandler().getClass().getName());
174    }
175   
176    if (m_OptionHandler != null) {
177      options = m_OptionHandler.getOptions();
178      result.add("--");
179      for (i = 0; i < options.length; i++)
180        result.add(options[i]);
181    }
182   
183    return (String[]) result.toArray(new String[result.size()]);
184  }
185 
186  /**
187   * Set the OptionHandler to work on..
188   *
189   * @param value the OptionHandler to use.
190   */
191  public void setOptionHandler(OptionHandler value) {
192    m_OptionHandler = value;
193  }
194 
195  /**
196   * Get the OptionHandler used in the tests.
197   *
198   * @return the OptionHandler used in the tests.
199   */
200  public OptionHandler getOptionHandler() {
201    return m_OptionHandler;
202  }
203
204  /**
205   * Sets the user-supplied options (creates a copy)
206   *
207   * @param value       the user-supplied options to use
208   */
209  public void setUserOptions(String[] value) {
210    m_UserOptions = getCopy(value);
211  }
212 
213  /**
214   * Gets the current user-supplied options (creates a copy)
215   *
216   * @return            the user-supplied options
217   */
218  public String[] getUserOptions() {
219    return getCopy(m_UserOptions);
220  }
221 
222  /**
223   * returns the success of the tests
224   *
225   * @return            true if the tests were successful
226   */
227  public boolean getSuccess() {
228    return m_Success;
229  }
230 
231  /**
232   * Prints the given options to a string.
233   *
234   * @param options the options to be joined
235   * @return the options as one long string
236   */
237  protected String printOptions(String[] options) {
238    if (options == null) {
239      return("<null>");
240    } else {
241      return Utils.joinOptions(options);
242    }
243  }
244
245  /**
246   * Compares the two given sets of options.
247   *
248   * @param options1 the first set of options
249   * @param options2 the second set of options
250   * @throws Exception if the two sets of options differ
251   */
252  protected void compareOptions(String[] options1, String[] options2) 
253    throws Exception {
254
255    if (options1 == null) {
256      throw new Exception("first set of options is null!");
257    }
258    if (options2 == null) {
259      throw new Exception("second set of options is null!");
260    }
261    if (options1.length != options2.length) {
262      throw new Exception("problem found!\n"
263                            + "First set: " + printOptions(options1) + '\n'
264                            + "Second set: " + printOptions(options2) + '\n'
265                            + "options differ in length");
266    }
267    for (int i = 0; i < options1.length; i++) {
268      if (!options1[i].equals(options2[i])) {
269       
270        throw new Exception("problem found!\n"
271                            + "\tFirst set: " + printOptions(options1) + '\n'
272                            + "\tSecond set: " + printOptions(options2) + '\n'
273                            + '\t' + options1[i] + " != " + options2[i]);
274      }
275    }
276  }
277
278  /**
279   * creates a copy of the given options
280   *
281   * @param options     the options to copy
282   * @return            the copy
283   */
284  protected String[] getCopy(String[] options) {
285    String[]    result;
286   
287    result = new String[options.length];
288    System.arraycopy(options, 0, result, 0, options.length);
289   
290    return result;
291  }
292 
293  /**
294   * returns a new instance of the OptionHandler's class
295   *
296   * @return            a new instance
297   */
298  protected OptionHandler getDefaultHandler() {
299    OptionHandler       result;
300   
301    try {
302      result = (OptionHandler) m_OptionHandler.getClass().newInstance();
303    }
304    catch (Exception e) {
305      e.printStackTrace();
306      result = null;
307    }
308   
309    return result;
310  }
311
312  /**
313   * returns the default options the default OptionHandler will return
314   *
315   * @return            the default options
316   */
317  protected String[] getDefaultOptions() {
318    String[]            result;
319    OptionHandler       o;
320   
321    o = getDefaultHandler();
322    if (o == null) {
323      println("WARNING: couldn't create default handler, cannot use default options!");
324      result = new String[0];
325    }
326    else {
327      result = o.getOptions();
328    }
329   
330    return result;
331  }
332 
333  /**
334   * checks whether the listOptions method works
335   *
336   * @return index 0 is true if the test was passed, index 1 is always false
337   */
338  public boolean checkListOptions() {
339    boolean     result;
340   
341    print("ListOptions...");
342   
343    try {
344      Enumeration enu = getOptionHandler().listOptions();
345      if (getDebug() && enu.hasMoreElements())
346        println("");
347      while (enu.hasMoreElements()) {
348        Option option = (Option) enu.nextElement();
349        if (getDebug()) {
350          println(option.synopsis());
351          println(option.description());
352        }
353      }
354
355      println("yes");
356      result = true;
357    }
358    catch (Exception e) {
359      println("no");
360      result = false;
361
362      if (getDebug())
363        println(e);
364    }
365   
366    return result;
367  }
368 
369  /**
370   * checks whether the user-supplied options can be processed at all
371   *
372   * @return index 0 is true if the test was passed, index 1 is always false
373   */
374  public boolean checkSetOptions() {
375    boolean     result;
376   
377    print("SetOptions...");
378   
379    try {
380      getDefaultHandler().setOptions(getUserOptions());
381      println("yes");
382      result = true;
383    }
384    catch (Exception e) {
385      println("no");
386      result = false;
387
388      if (getDebug())
389        println(e);
390    }
391   
392    return result;
393  }
394 
395  /**
396   * checks whether the default options can be processed completely
397   * or some invalid options are returned by the getOptions() method.
398   *
399   * @return index 0 is true if the test was passed, index 1 is always false
400   */
401  public boolean checkDefaultOptions() {
402    boolean     result;
403    String[]    options;
404   
405    print("Default options...");
406
407    options = getDefaultOptions();
408   
409    try {
410      getDefaultHandler().setOptions(options);
411      Utils.checkForRemainingOptions(options);
412      println("yes");
413      result = true;
414    }
415    catch (Exception e) {
416      println("no");
417      result = false;
418
419      if (getDebug())
420        println(e);
421    }
422   
423    return result;
424  }
425 
426  /**
427   * checks whether the user-supplied options can be processed completely
428   * or some "left-over" options remain
429   *
430   * @return index 0 is true if the test was passed, index 1 is always false
431   */
432  public boolean checkRemainingOptions() {
433    boolean     result;
434    String[]    options;
435   
436    print("Remaining options...");
437
438    options = getUserOptions();
439   
440    try {
441      getDefaultHandler().setOptions(options);
442      if (getDebug())
443        println("\n  remaining: " + printOptions(options));
444      println("yes");
445      result = true;
446    }
447    catch (Exception e) {
448      println("no");
449      result = false;
450
451      if (getDebug())
452        println(e);
453    }
454   
455    return result;
456  }
457 
458  /**
459   * checks whether the user-supplied options stay the same after settting,
460   * getting and re-setting again
461   *
462   * @return index 0 is true if the test was passed, index 1 is always false
463   */
464  public boolean checkCanonicalUserOptions() {
465    boolean             result;
466    OptionHandler       handler;
467    String[]            userOptions;
468    String[]            userOptionsCheck;
469   
470    print("Canonical user options...");
471
472    try {
473      handler = getDefaultHandler();
474      handler.setOptions(getUserOptions());
475      if (getDebug())
476        print("\n  Getting canonical user options: ");
477      userOptions = handler.getOptions();
478      if (getDebug())
479        println(printOptions(userOptions));
480      if (getDebug())
481        println("  Setting canonical user options");
482      handler.setOptions((String[])userOptions.clone());
483      if (getDebug())
484        println("  Checking canonical user options");
485      userOptionsCheck = handler.getOptions();
486      compareOptions(userOptions, userOptionsCheck);
487
488      println("yes");
489      result = true;
490    }
491    catch (Exception e) {
492      println("no");
493      result = false;
494
495      if (getDebug())
496        println(e);
497    }
498   
499    return result;
500  }
501
502  /**
503   * checks whether the optionhandler can be re-setted again to default
504   * options after the user-supplied options have been set.
505   *
506   * @return index 0 is true if the test was passed, index 1 is always false
507   */
508  public boolean checkResettingOptions() {
509    boolean             result;
510    String[]            defaultOptions;
511    String[]            defaultOptionsCheck;
512    OptionHandler       handler;
513
514    print("Resetting options...");
515   
516    try {
517      if (getDebug())
518        println("\n  Setting user options");
519      handler = getDefaultHandler();
520      handler.setOptions(getUserOptions());
521      defaultOptions = getDefaultOptions();
522      if (getDebug())
523        println("  Resetting to default options");
524      handler.setOptions(getCopy(defaultOptions));
525      if (getDebug())
526        println("  Checking default options match previous default");
527      defaultOptionsCheck = handler.getOptions();
528      compareOptions(defaultOptions, defaultOptionsCheck);
529     
530      println("yes");
531      result = true;
532    }
533    catch (Exception e) {
534      println("no");
535      result = false;
536
537      if (getDebug())
538        println(e);
539    }
540   
541    return result;
542  }
543 
544  /**
545   * Runs some diagnostic tests on an optionhandler object. Output is
546   * printed to System.out (if not silent).
547   */
548  public void doTests() {
549    println("OptionHandler: " + m_OptionHandler.getClass().getName() + "\n");
550
551    if (getDebug()) {
552      println("--> Info");
553      print("Default options: ");
554      println(printOptions(getDefaultOptions()));
555      print("User options: ");
556      println(printOptions(getUserOptions()));
557    }
558
559    println("--> Tests");
560    m_Success = checkListOptions();
561
562    if (m_Success)
563      m_Success = checkSetOptions();
564   
565    if (m_Success)
566      m_Success = checkDefaultOptions();
567   
568    if (m_Success)
569      m_Success = checkRemainingOptions();
570
571    if (m_Success)
572      m_Success = checkCanonicalUserOptions();
573
574    if (m_Success)
575      m_Success = checkResettingOptions();
576  }
577 
578  /**
579   * Returns the revision string.
580   *
581   * @return            the revision
582   */
583  public String getRevision() {
584    return RevisionUtils.extract("$Revision: 5953 $");
585  }
586 
587  /**
588   * Main method for using the CheckOptionHandler.
589   *
590   * @param args        the options to the CheckOptionHandler
591   */
592  public static void main(String[] args) {
593    CheckOptionHandler check = new CheckOptionHandler();
594    runCheck(check, args);
595    if (check.getSuccess())
596      System.exit(0);
597    else
598      System.exit(1);
599  }
600}
Note: See TracBrowser for help on using the repository browser.