
/**
 * This class is part of a demonstration of distributed computing.
 * It is to be used with CLMandelbrotWorker.java and CLMandelbrotMaster.java.
 * This class must be present on both the master computer (along with
 * CLMandelbrotMaster) and on the worker computers.
 * 
 * CLMandelbrotTask is a simple container that holds the data for one "task"
 * which consists of computing one row of data for a Mandelbrot image.  It
 * also contains the output of the task, and a method for doing the computation.
 * CLMandelbrotMaster computes the image by creating one CLMandelbrotTask for
 * each row in the image.  The tasks are sent over a network to CLMandelbrotWorkers
 * to be computed, and the results are returned to CLMandelbrotMaster where
 * all the results are combined to produce the entire image.
 */
public class CLMandelbrotTask {

    public int id;              // Identifies this task.  Each task that is 
                                // part of the overall computation has a
                                // different id.

    public int maxIterations;   // Input for the computation.
    public double y;    
    public double xmin;
    public double dx;
    public int count;

    public int[] results;       // Holds the results of the computation after
                                //  compute() has been executed.


    /**
     * Performs the task represented by this data.  Uses the values
     * of maxIterations, y, xmin, dx, and count.  Creates the result
     * array and fills it with computed data.  For the purposes of
     * this demonstration, it is not important to understand the
     * computation performed by this task.
     */
    public void compute() {
        results = new int[count];
        for (int i = 0; i < count; i++)
            results[i] = countIterations(xmin + i*dx,y);
    }


    /**
     * Called by compute() to compute each entry in the results array.
     */
    private int countIterations(double startx, double starty) {
        int ct = 0;
        double x = startx;
        double y = starty;
        while (ct < maxIterations && x*x + y*y < 5) {
            double new_x = x*x - y*y + startx;
            y = 2*x*y + starty;
            x = new_x;
            ct++;
        }
        return ct;
    }

}
