function pctdemo_plot_distribjob(plotType, varargin)
%PCTDEMO_PLOT_DISTRIBJOB Create graphs for the Parallel Computing Toolbox
%distributed job examples.
%   The function can create four different types of graphs. 
%   1) pctdemo_plot_distribjob('speedup', numTasks, time, refTime,
%      titleStr) shows the speedup curve obtained by comparing the
%      execution times in the vector time to the sequential execution time
%      stored in refTime.  The number of tasks corresponding to time is
%      stored in numTasks.
%   2) pctdemo_plot_distribjob('barTime', numTasks, time, titleStr)
%      displays a simple bar chart of the execution times in the vector
%      time as a function of number of tasks.
%   3) pctdemo_plot_distribjob('fields', times, description, ...
%      fieldsToShow) displays a bar chart of all the execution times stored
%      in the fields fieldsToShow of the struct array times.
%   4) pctdemo_plot_distribjob('normalizedFields', times, ...
%      description, fieldsToShow) normalizes the execution times stored in
%      the fields fieldsToShow of the struct array times to obtain the
%      execution time per task.  It then displays a bar chart of the
%      execution time per task for each of those fields.

%   Copyright 2008-2011 The MathWorks, Inc.

    switch plotType
      case 'speedup'
        numTasks = varargin{1};
        time = varargin{2};
        refTime = varargin{3};
        titleStr = varargin{4};
        speedup(numTasks, time, refTime, titleStr);
      case 'barTime'
        numTasks = varargin{1};
        time = varargin{2};
        titleStr = varargin{3};
        barTime(numTasks, time, titleStr);
      case 'fields'
        times = varargin{1};
        description = varargin{2};
        fieldsToShow = varargin{3};
        fields(times, description, fieldsToShow, 'Time in seconds');
      case 'normalizedFields'
        times = varargin{1};
        description = varargin{2};
        fieldsToShow = varargin{3};
        normalized = normalizeTimes(times, fieldsToShow);
        fields(normalized, description, ...
               fieldsToShow, 'Normalized time in seconds');
    end
end

function speedup(numTasks, time, refTime, titleStr)
    speedup = numTasks.*refTime./time;
    fig = figure;
    ax = axes('parent', fig);
    bar(ax, speedup);
    set(ax, 'XTickLabel', numTasks);
    title(ax, titleStr);
    ylabel(ax, 'Speedup');
    xlabel(ax, 'Number of tasks')
end

function barTime(numTasks, time, titleStr)
    fig = figure;
    ax = axes('parent', fig);
    bar(ax, time);
    set(ax, 'XTickLabel', numTasks);
    title(ax, titleStr);
    ylabel(ax, 'Seconds');
    xlabel(ax, 'Number of tasks')
end

function fields(times, description, fieldsToShow, yLabelText)
    fieldsToShow = fieldsToShow(:);
    cols = ceil(sqrt(length(fieldsToShow)));
    rows = ceil(length(fieldsToShow)/cols);
    fig = figure;
    for j = 1:length(fieldsToShow)
        ax = subplot(rows, cols, j, 'parent', fig);
        numTasks = [times.numTasks];
        values = [times.(fieldsToShow{j})];
        bar(ax, values);
        set(ax, 'XTickLabel', numTasks);
        title(ax, description.(fieldsToShow{j}));
        ylabel(ax, yLabelText);
        xlabel(ax, 'Number of tasks');
    end
end

function normalized = normalizeTimes(times, fieldsToShow)
    numTasks = [times.numTasks];
    normalized.(fieldsToShow{1}) = [times.(fieldsToShow{1})]./numTasks;
    for i = 2:length(fieldsToShow)
        normalized.(fieldsToShow{i}) = [times.(fieldsToShow{i})]./numTasks;
    end
    normalized.numTasks = numTasks;
end

