/*
 * NetTrainer.java
 *
 * Created on 13 ottobre 2003, 19.41
 */

package org.joone.samples.engine.validation;

import java.util.*;
import org.joone.engine.*;
import org.joone.net.*;
/**
 * This class trains and validates a neural network passed as parameter
 * of the constructor and, when the validation phase is finished, it
 * notifies its listeners.
 * The neural network passes as parameter is cloned before to use it,
 * so the calling program can call many copies of this class to train
 * and validate several copies of the same neural network.
 *
 * @author  pmarrone
 */
public class NeuralNetTrainer  implements Runnable, NeuralNetListener, NeuralValidationListener {
    private Vector listeners;
    private NeuralNet nnet;
    private Thread myThread = null;
    
    public NeuralNetTrainer(NeuralNet nn) {
        listeners = new Vector();
        nnet = cloneNet(nn);
    }
    
    public void addValidationListener(NeuralValidationListener newListener){
        if (!listeners.contains(newListener))
            listeners.addElement(newListener);
    }
    
    /**
     * Trains the neural network
     */
    protected void train() {
        //System.out.println("Training...");
        nnet.getMonitor().addNeuralNetListener(this);
        nnet.getMonitor().setLearning(true);
        nnet.getMonitor().setValidation(false);
        nnet.go(true);
        this.validate();
    }
    
    /**
     * Validates the trained neural network
     */
    protected void validate(){
        //System.out.println("Valitading...");
        // Set all the parameters for the validation
        NeuralNet newNet = cloneNet(nnet);
        NeuralNetValidator nnv = new NeuralNetValidator(newNet);
        nnv.addValidationListener(this);
        nnv.start();  // Validates the net
    }
    
    /**
     * Clones the neural network passed as parameter
     */
    private NeuralNet cloneNet(NeuralNet net)  {
        // Creates a copy of the neural network
        net.getMonitor().setExporting(true);
        NeuralNet newNet = net.cloneNet();
        net.getMonitor().setExporting(false);
        
        // Cleans the old listeners
        // This is a fundamental action to avoid that the validated net
        // calls any method of previously registered listeners
        newNet.removeAllListeners();
        return newNet;
    }
    
    // Notifies all the registered listeners
    private void fireNetValidated(NeuralValidationEvent event) {
        NeuralNet NN = (NeuralNet)event.getSource();
        NN.terminate(false); // <-- Added as a bug workaround 
        for (int i=0; i < listeners.size(); ++i) {
            NeuralValidationListener nvl = (NeuralValidationListener)listeners.elementAt(i);
            nvl.netValidated(new NeuralValidationEvent(NN));
        }
    }
    
    /** Starts the training & validation phases into a separated thread
     */
    public void start() {
        if (myThread == null) {
            myThread = new Thread(this, "Trainer");
            myThread.start();
        }
    }
    
    public void run() {
        this.train();
        myThread = null;
    }
    
    public void netStopped(NeuralNetEvent e) {
    }
    
    public void netValidated(NeuralValidationEvent event) {
        // When also the validation phase terminates, then notifies all the listeners
        this.fireNetValidated(event);
    }
    
    public void cicleTerminated(NeuralNetEvent e) {
        //System.out.println("Cycle "+nnet.getMonitor().getCurrentCicle()+" terminated");
    }
    
    public void netStarted(NeuralNetEvent e) {
    }
    
    public void errorChanged(NeuralNetEvent e) {
        /*System.out.println("Error "+nnet.getMonitor().getCurrentCicle()+" changed");
        System.out.println("Tot Cycles: "+nnet.getMonitor().getTotCicles());
        System.out.println("Val. Patt.: "+nnet.getMonitor().getValidationPatterns());
        System.out.println("Tr.  Patt.: "+nnet.getMonitor().getTrainingPatterns()); */
    }
    
    public void netStoppedError(NeuralNetEvent e, String error) {
        System.exit(1);
    }
    
    
}

 

Ads help maintain this website.