package ac.essex.gp.ooechs.novelty1.nodes.functions;

import ac.essex.gp.tree.Node;
import ac.essex.gp.params.NodeConstraints;
import ac.essex.gp.problems.DataStack;
import ac.essex.gp.ooechs.novelty1.NovelGPProblem;

/**
 * Gets the range in height between a series of features contained
 * within a vector.
 *
 * @author Olly Oechsle, University of Essex, Date: 16-Apr-2008
 * @version 1.0
 */
public class GetPeaks extends Node {

    public GetPeaks()  {
        super(3);
    }

    public int getReturnType() {
        return NodeConstraints.VECTOR;
    }

    int startX, endX, value;

    public double execute(DataStack data) {

        double percent;

        percent = child[0].execute(data);
        int value1 = (int) (percent * NovelGPProblem.signalLength);

        percent = child[1].execute(data);
        int value2 = (int) (percent * NovelGPProblem.signalLength);

        percent = child[2].execute(data);
        value = (int) (percent * NovelGPProblem.maxSignal);

        startX = Math.min(value1, value2);
        endX = Math.max(value1, value2);

        if (startX < 0) startX = 0;
        if (endX >= NovelGPProblem.signalLength) endX = NovelGPProblem.signalLength - 1;

        try {

        data.setData(NovelGPProblem.currentSignal.getPeaks(startX, endX, value));

        } catch (Exception e) {
            System.out.println("Argh");
            e.printStackTrace();
        }

        return debugger.record(data.value);
    }

    public String toJava() {
        return "getPeaks(" + startX + ", " + endX + ", " + value + ")";
    }

    public int getChildType(int i) {
        return NodeConstraints.PARAMETER;
    }

}
