Parallel Java (PJ) is an API and middleware for parallel programming in 100% Java on shared memory multiprocessor (SMP) parallel computers, cluster parallel computers, and hybrid SMP cluster parallel computers. PJ was developed by Professor Alan Kaminsky and his student Luke McOmber in the Department of Computer Science at the Rochester Institute of Technology.

I am happy to answer general questions about the Parallel Java Library, receive bug reports, and entertain requests for additional features. Please contact me by email at ark@cs.rit.edu. I regret that I am unable to provide technical support, specific installation instructions for your system, or advice about configuring your parallel computer hardware.

System Requirements
Installation
Usage
License
Revision History

## System Requirements

PJ was developed using Java Development Kit (JDK) 1.5. When compiling and running PJ programs, you must use JDK 1.5. PJ uses features of the Java language and platform introduced in JDK 1.5 and will not compile with earlier JDK versions.

PJ will work with JDK 1.6 and 1.7. However, my tests have revealed serious performance issues when a multithreaded PJ program is run on an SMP parallel computer with JDK 1.6 or 1.7. Due to some as-yet-unfathomed behavior of the JIT compiler and/or the thread scheduler, SMP parallel programs that experienced near-ideal speedups with JDK 1.5 experience far-less-than-ideal speedups with JDK 1.6 or 1.7 on the same machine. For now I recommend using PJ with JDK 1.5.

## Installation

There are two versions of the PJ distribution, an executable distribution and a source distribution.

Executable distribution. The executable distribution comes in a Java Archive (JAR) file named `"pjYYYYMMDD.jar"`, where YYYYMMDD are the year, month, and date. The executable distribution includes the PJ class files only. To install the executable distribution, simply store the JAR file somewhere. You may wish to change the file name, say to `"pj.jar"`.

Source distribution. The source distribution comes in a Java Archive (JAR) file named `"pjsrcYYYYMMDD.jar"`, where YYYYMMDD are the year, month, and date. The source distribution includes the PJ class files, source files, and documentation files (Javadoc). To install the source distribution, just unpack the JAR file. The source distribution expands into a subdirectory named `"pj"`. If you already have a subdirectory of that name which you want to save, be sure to unpack the JAR file in some other directory. Documentation is stored under the directory `"pj/doc"`; point your HTML browser to that directory. Java source files and class files are stored under the directory `"pj/lib"`.

Installation on a SMP computer. To run PJ programs on a shared memory multiprocessor (SMP) parallel computer, no further installation is required.

Installation on a cluster. To run PJ programs on a cluster parallel computer, in addition to installing the PJ JAR file, you must configure and run certain daemon processes on the frontend and backend processors of the cluster. For further information, see package edu.rit.pj.cluster.

## Usage

Executable distribution. When compiling and executing Java programs that use PJ, if you have installed the executable distribution, you must set your classpath to include the PJ JAR file. Here is an example of a command for the `bash` shell to set the classpath to the current directory plus the PJ JAR file:

`export CLASSPATH=.:/home/fac/ark/public_html/pj.jar`

Here is an example of a command for the `csh` shell to set the classpath to the current directory plus the PJ JAR file:

`setenv CLASSPATH .:/home/fac/ark/public_html/pj.jar`

Source distribution. When compiling and executing Java programs that use PJ, if you have installed the source distribution, you must set your classpath to include the top-level directory under which PJ's Java class files are stored. Here is an example of a command for the `bash` shell to set the classpath to the current directory plus the PJ directory:

`export CLASSPATH=.:/home/fac/ark/public_html/pj/lib`

Here is an example of a command for the `csh` shell to set the classpath to the current directory plus the PJ directory:

`setenv CLASSPATH .:/home/fac/ark/public_html/pj/lib`

## License

The documentation files, Java source files, and Java class files in the Parallel Java Library ("PJ") are copyright © 2005-2012 by Alan Kaminsky. All rights reserved. For further information, contact the author, Alan Kaminsky, at ark@cs.rit.edu.

PJ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

PJ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination.

As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.

A copy of the GNU General Public License is provided in the file `gpl.txt`. You may also obtain a copy of the GNU General Public License on the World Wide Web at http://www.gnu.org/licenses/gpl.html.

## Revision History

07-Jan-2015
  The Parallel Java Library is now released under the GNU General Public License with a linking exception.

20-Jun-2012
  In package edu.rit.pj.cluster: Added the `backendshell` configuration command to class Configuration. If specified, this configures the PJ Job Scheduler to use a given shell command string when starting a job backend process on a given backend node. The default shell command string was changed from `"sh -c"` to `"bash -l -c"`. The `-l` flag tells the shell to behave as a login shell and execute the commands in the user's login profile, if any. Changed class JobFrontend to launch a Parallel Java job using the configured shell command string instead of a hard-coded string. Changed class BackendClassLoader to support loading resources as well as class files from the Java class path.

01-Apr-2012
  In package edu.rit.mp.buf: Fixed bugs in the shared object buffer classes; the objects were not re-serialized properly after a reduction operation, causing the reduce and all-reduce message passing methods to fail when using a shared object buffer.

26-Mar-2012
  In package edu.rit.util: Added class Packing for packing and unpacking bytes into and out of integers and long integers.

  In class edu.rit.numeric.Statistics: added a method for doing an unequal-variance t-test for equality of means of two data series.

19-Mar-2012
  In package edu.rit.hyb.keysearch: Changed class FindKeyHyb to use the HybridTeam, WorkerRegion, and WorkerIntegerForLoop classes.

  In package edu.rit.hyb.fractal: Changed class MandelbrotSetHyb to use the HybridTeam, WorkerRegion, and WorkerIntegerForLoop classes. Changed class MandelbrotSetHyb2 to use the WorkerTeam, WorkerRegion, and WorkerIntegerForLoop classes.

  In package edu.rit.hyb.prime: Changed class PrimeCountFunctionHyb to use the WorkerTeam, WorkerRegion, and WorkerLongForLoop classes.

08-Mar-2012
  Changed class edu.rit.clu.keysearch.FindKeyClu2 to use a ReplicatedBoolean object for early loop exit instead of flood-send and flood-receive operations.

  Added features to the Job Scheduler's web interface. The job queue web page now has a link to a detailed job status web page for each job. The detailed job status web page includes a "comment" for each backend process. The program can set its backend process comment by calling `JobBackend.getJobBackend().setComment()`. The comment is typically used to report the backend process's progress.

22-Nov-2011
  In class edu.rit.numeric.Interpolation: Removed the restriction that the X values must be in ascending order; removed the `fInv()` method.

  Changed class edu.rit.util.RandomSubset to support both a sparse implementation and a dense implementation. This change is source compatible with previous code, which will use the sparse implementation by default as before.

  Added class edu.rit.util.Searching with methods for searching sorted and unsorted arrays of primitive types and object types.

  In class edu.rit.util.Sorting: Each `sort()` method now returns the array that was sorted.

09-Aug-2011
  Fixed a bug in class edu.rit.draw.item.Group; transforms were not applied properly if a group was nested inside another group.

  In package edu.rit.numeric: Fixed a bug in class Interpolation; it calculated the wrong answer when extrapolating beyond the last data points in the series; thank you to Francisco Esquembre for discovering the bug. Added classes BernoulliPrng, ExponentialPrng, and UniformPrng. In class Series.Stats, changed the field names to `mean`, `var`, and `stddev`, and set the statistics to NaN if the series is empty. In class Series.RobustStats, changed the field names to `median` and `meanAbsDev`, set the statistics to NaN if the series is empty, and added the `quantile()` and `histogram()` methods. In class XYSeries, removed the `stats()` and `robustStats()` methods; instead, use `xSeries().stats()`, `ySeries().stats()`, `xSeries().robustStats()`, and `ySeries().robustStats()`. In class XYZSeries, removed the `stats()` and `robustStats()` methods; instead, use `xSeries().stats()`, `ySeries().stats()`, `zSeries().stats()`, `xSeries().robustStats()`, `ySeries().robustStats()`, and `zSeries().robustStats()`.

  Added package edu.rit.sim with classes for discrete event simulation.

  In package edu.rit.util: Added class RandomSubset.

15-Mar-2011
  Fixed bugs in package edu.rit.swing; the JTextField subclasses incorrectly overrode the JComponent.isValid() method; this method's name was changed to isOkay().

22-Oct-2010
  Clarified the documentation for class edu.rit.pj.job.Runner.

  In package edu.rit.numeric: Added methods to compute the medians and mean absolute deviations in classes Series, XYSeries, and XYZSeries. Changed class RobustFit to compute the confidence region for the fitted parameters at a given confidence level.

  Added class edu.rit.util.Sorting with static methods for sorting arrays of primitive types and object types.

09-Oct-2010
  Fixed a bug in class edu.rit.util.Instance; to load the class for the object being created, it should be using the calling thread's context class loader instead of a class loader specified as an argument.

  Fixed a bug in class edu.rit.pj.job.Job; to load the class for the job's main method, it should be using the calling thread's context class loader instead of class Job's class loader.

08-Oct-2010
  In package edu.rit.pj: Added class WorkerIteration for doing parallel iterations in a cluster or hybrid parallel program. In class WorkerRegion, added methods to perform a parallel iteration over an array, the items returned by an iterator, or the items contained in an iterable collection.

  Added package edu.rit.pj.job with programs and classes for running independent jobs on parallel computers.

  In package edu.rit.io: Added class Stdio providing per-thread standard I/O streams.

  In package edu.rit.numeric: Added the `linearRegression()` method to class edu.rit.numeric.XYZSeries. Added interfaces MDFunction and ParameterizedFunction. Added classes MDMinimizationDownhillSimplex and RobustFit.

29-Jul-2010
  Fixed a bug in class edu.rit.pj.cluster.JobScheduler; if a client opened a socket connection to the Job Scheduler's web server but did not send an HTTP request message and did not close the connection, the whole Job Scheduler deadlocked.

  In class edu.rit.http.HttpServer: Added a timeout while reading an HTTP request message from a socket connection.

22-Apr-2010
  Fixed a bug in class edu.rit.color.HSB; the `unpack()` method did not compute the correct hue, saturation, and brightness components.

18-Feb-2010
  In package edu.rit.pj: Fixed a bug involving the fixed schedule classes, the parallel for loop classes, and the worker for loop classes; if the number of loop iterations was less than the number of team threads, the `run()` method would be called with a lower index greater than the upper index in some threads, whereas the `run()` method should not have been called at all in those threads.

  In package edu.rit.util: Added classes Mathe and RandomSample.

  In package edu.rit.pj.reduction: Added classes SharedIntegerMatrix and SharedLongMatrix.

21-Jan-2010
  In package edu.rit.pj: Fixed bugs in classes WorkerIntegerForLoop, WorkerIntegerStrideForLoop, WorkerLongForLoop, and WorkerLongStrideForLoop; improper synchronization between worker threads could cause a deadlock in the master thread during execution of a worker for loop.

  In class edu.rit.numeric.BigRational: Added several constructors and methods. Fixed bugs in the `floatValue()` and `doubleValue()` methods; the results were not calculated to the proper precision.

  In class edu.rit.numeric.Statistics: Added the `binomialKsTest()` method.

  In package edu.rit.util: Added class Instance with static methods for creating instances of classes.

26-Dec-2009
  In package edu.rit.pj: Added components that provide the master-worker pattern for automatic loop partitioning and load balancing in cluster parallel programs and hybrid parallel programs. These include the following classes: WorkerTeam, HybridTeam, WorkerConstruct, WorkerRegion, WorkerForLoop, WorkerIntegerForLoop, WorkerIntegerStrideForLoop, WorkerLongForLoop, WorkerLongStrideForLoop.

  In package edu.rit.clu.keysearch: Changed the FindKeyClu and FindKeyClu2 programs to use the new master-worker components.

  In package edu.rit.clu.fractal: Changed the MandelbrotSetClu2, MandelbrotSetClu3, and MSHistogramClu programs to use the new master-worker components.

  In package edu.rit.pj.reduction: In classes ByteOp, CharacterOp, IntegerOp, LongOp, and ShortOp: Added the AND, OR, and XOR reduction operators.

  In package edu.rit.io: Added classes DataOutputStream and DataInputStream.

  In class edu.rit.numeric.Statistics: Added methods to do a chi-square test for a Bernoulli distribution. Added a method to do a Kolmogorov-Smirnov test for an arbitrary distribution.

06-Oct-2009
  In class edu.rit.numeric.Statistics: Added methods for doing the chi-square test and the Y-square test.

  Moved class BigRational from package edu.rit.smp.ca to package edu.rit.numeric, and added several operations.

  In class edu.rit.util.Random: Added methods to return random values of the primitive types byte, unsigned byte, char, short, unsigned short, int, and long.

  Fixed a bug in class edu.rit.numeric.plot.impl.XYPlot: An exception was thrown if a plot series had fewer than two data points.

05-Apr-2009
  In package edu.rit.mp.buf: Fixed bugs in the matrix buffer classes; sometimes when receiving a message into a matrix buffer, an incorrect number of items would be sucked out of the message. Thank you to Omonbek Salaev for discovering the bug.

23-Mar-2009
  In package edu.rit.hyb.keysearch: Fixed a bug in class FindKeyHyb; the threads did not synchronize with each other properly when writing the `foundkey` shared variable.

  In package edu.rit.mp.buf: Fixed bugs in the object reduction buffer classes; the underlying buffer's serialized representation was not reset when the underlying buffer's contents were changed via operations on the reduction buffer.

11-Mar-2009
  In package edu.rit.mp: Fixed a bug in class ChannelGroup; if an I/O error occurred while setting up a channel for a connection initiated by a far end process, the thread accepting new connections would (incorrectly) terminate.

21-Jan-2009
  In package edu.rit.pj: Fixed a bug in class Comm; a non-blocking flood-receive operation blocked in some processes because channels were not set up properly.

  In package edu.rit.pj.cluster: Fixed a bug in class JobFrontend; the job frontend process did not pass the correct backend node host name to the job backend process.

24-Dec-2008
  The Parallel Java class files are now compiled using JDK 1.5 again. Switching to JDK 1.6 proved to be a mistake. My tests have revealed serious performance issues when a multithreaded PJ program is run on an SMP parallel computer with JDK 1.6. Due to some as-yet-unfathomed behavior of the JDK 1.6 JIT compiler and/or the JDK 1.6 thread scheduler, SMP parallel programs that experienced near-ideal speedups with JDK 1.5 experience far-less-than-ideal speedups with JDK 1.6 on the same machine. For now I recommend using PJ with JDK 1.5.

26-Nov-2008
  The Parallel Java class files are now compiled using JDK 1.6.

  In package edu.rit.mp.ChannelGroup and in class edu.rit.pj.Comm: Added the ability to receive a message whose tag lies in a given range, in addition to receiving a message with a specific tag or any tag. This change is source compatible with existing software but is not binary compatible; you may need to recompile your programs.

  In package edu.rit.compbio.phyl: Redesigned the maximum parsimony phylogenetic tree construction algorithm classes to store the results in an object passed in as a parameter. Added class MaximumParsimonyBnbHyb and main program class PhylogenyParsBnbHyb with a hybrid parallel program for maximum parsimony phylogenetic tree construction.

10-Nov-2008
  In package edu.rit.image: Fixed bugs in the PJG image classes; PJG image files would not be displayed properly if the height and width were unequal. Thank you to Paresh Khatri for discovering the bug.

13-Sep-2008
  Added package edu.rit.pj.replica with classes for replicated, shared reduction variables for use in cluster and hybrid parallel programs.

  In class edu.rit.pj.Comm: Changed the manner in which processes establish connections among themselves, to eliminate race conditions that could result in incorrect connections.

15-Aug-2008
  In package edu.rit.compbio.phyl: Changed class MaximumParsimonyBnbSmp to update the search bound variable using a reduction operator instead of an atomic compare-and-set operation.

  In package edu.rit.smp.monte: Added the source files for SMP parallel C/OpenMP programs for estimating pi using a Monte Carlo technique; these are linked from the package summary page of the Javadoc.

  In package edu.rit.smp.network: Added the source files for SMP parallel C/OpenMP programs for Floyd's Algorithm; these are linked from the package summary page of the Javadoc.

  In package edu.rit.clu.monte: Added the source files for cluster parallel C/MPI programs for estimating pi using a Monte Carlo technique; these are linked from the package summary page of the Javadoc.

  In package edu.rit.clu.network: Added the source files for cluster parallel C/MPI programs for Floyd's Algorithm; these are linked from the package summary page of the Javadoc.

07-Aug-2008
  In package edu.rit.compbio.phyl: Added methods to class TreeDrawing to draw a phylogenetic tree into a given drawing object or a given drawing group object.

  In class edu.rit.draw.item.Group: Added methods to retrieve points relative to the group's bounding box without applying the group's transformations.

  In class edu.rit.numeric.plot.Plot: Changed the default title font to sans-serif, bold, 14 point. Changed the default axis and label font to sans-serif, plain, 12 point. Increased the default margins and title offsets.

  In the unnamed package: Changed the first parallel programs, classes Program1Seq, Program1Smp, and Program1Clu, to do a primality test as the demo computation.

25-Jul-2008
  In package edu.rit.compbio.phyl: Added some features to the phylogenetic tree construction programs. The output report now includes the Hamming distance matrix and the Jukes-Cantor distance matrix. For each maximum parsimony phylogenetic tree, the least squares branch lengths are computed and displayed, and the trees are presented in ascending order of squared error.

  In package edu.rit.pj.cluster: Fixed a bug in class NonPjJobFrontend; an IllegalMonitorStateException was thrown when a backend processor was assigned to the job.

20-Jul-2008
  In package edu.rit.compbio.phyl: Changed the criterion for deciding when to prune the branch-and-bound search; the new criterion can prune the search sooner.

19-Jul-2008
  Added package edu.rit.compbio.phyl with sequential and SMP parallel programs for maximum parsimony phylogenetic tree construction using branch-and-bound search. Added package edu.rit.compbio.seq.test with unit test programs for the above.

  Removed obsolete packages edu.rit.phyl, edu.rit.phyl.pars, and edu.rit.phyl.pars.test. Equivalent programs are now in package edu.rit.compbio.phyl.

  In package edu.rit.pj: In class PJProperties: Changed the `getPjSchedule()` method to return null if the `"pj.schedule"` property was not specified. In class IntegerSchedule: Added the `runtime(IntegerSchedule)` method. In class LongSchedule: Added the `runtime(LongSchedule)` method.

  In class edu.rit.pj.cluster.JobBackend: Added code to turn on headless mode. This allows graphics drawing operations (that do not require a screen, keyboard, or mouse) to work when a PJ program is run on a backend node of a cluster.

14-Jul-2008
  Added package edu.rit.compbio.seq with sequential and parallel programs for protein sequence database searching using the Smith-Waterman local alignment algorithm. Added package edu.rit.compbio.seq.test with unit test programs for the above.

  In package edu.rit.mp.buf: Fixed a bug in class EmptyObjectBuf; the class should not have overridden the superclass's `sendItems()` and `receiveItems()` methods.

28-Jun-2008
  In package edu.rit.numeric: Added interface VectorFunction and class NonLinearLeastSquares for nonlinear least squares curve fitting. Added classes DoublePrng and NormalPrng for generating pseudorandom numbers with a normal distribution. Added classes ArraySeries, ArrayXYSeries, and ArrayXYZSeries which provide series objects backed by arrays.

  In package edu.rit.mp: Added the `objectBuffer(T[])` and `objectBuffer(T[][])` methods to class ObjectBuf. Fixed a bug in class MPObjectInputStream; the `resolveClass()` method did not correctly resolve the class for an array of objects.

  In class edu.rit.pj.cluster.JobBackend: Fixed a bug in the `reportResource()` method; a NullPointerException was thrown if the resource could not be found.

  In packages edu.rit.draw and edu.rit.draw.item: Removed the ability to rotate a DrawingItem. Added the ability to scale, shear, and rotate a Group. To apply transformations to one or more DrawingItems, put the DrawingItems in a Group and apply transformations to the Group. This change reduces the size of a serialized Drawing object. As a result of this change, Drawing objects serialized with previous versions of the Library are incompatible with the present version of the Library.

  Added package edu.rit.mri with sequential and parallel programs for solving a magnetic resonance image spin relaxometry analysis problem. Added package edu.rit.mri.test with unit test programs for the above.

08-Jun-2008
  In class edu.rit.pj.Comm: Reimplemented the all-reduce operation to reduce the number of message rounds.

  In package edu.rit.pj.cluster: Rewrote classes JobScheduler, Configuration, BackendInfo, and JobInfo to support clusters of single-CPU nodes and clusters of multi-CPU nodes. Eliminated classes HybridJobScheduler, HybridConfiguration, HybridBackendInfo, and HybridJobInfo. Changed class Configuration to include the number of CPUs in each backend node. As a consequence, this version of the Parallel Java cluster middleware will not interoperate with previous versions.

  In package edu.rit.hyb.keysearch: A few revisions to class FindKeyHyb, a hybrid parallel program for AES partial key search.

  In package edu.rit.hyb.fractal: Added class MandelbrotSetHyb, a hybrid parallel program to calculate an image of the Mandelbrot Set with one-level load balancing. Added class MandelbrotSetHyb2, a hybrid parallel program to calculate an image of the Mandelbrot Set with two-level load balancing.

  In package edu.rit.hyb.network: Rewrote classes FloydRandom, FloydPrint, FloydSeq, and FloydHyb to use a DoubleMatrixFile to read and write the input and output files.

  In package edu.rit.hyb.prime: Rewrote all the programs for calculating the prime counting function.

13-May-2008
  In package edu.rit.mp: Fixed a bug in class ChannelGroup; if the channel group had a connect listener and another process set up a connection, there was a race condition between the thread calling the connect listener and the thread receiving messages from the channel, possibly causing the channel to be in an incorrect state.

09-May-2008
  In package edu.rit.clu.monte: Added programs AesTestSeq and AesTestClu that perform a Kolmogorov-Smirnov test on the AES block cipher operating as a pseudorandom number generator. The AesTestClu program illustrates the all-to-all, exclusive-scan, and reduce collective communication operations.

  In class edu.rit.pj.Comm: Added the `allToAll()`, `scan()`, and `exclusiveScan()` collective communication operations. Removed the versions of the `reduce()` and `allReduce()` operations with separate source and accumulator buffers.

  In class edu.rit.mp.Buf: Added the `fill()` and `getTemporaryBuf()` methods.

  Fixed bugs in class edu.rit.pj.reduction.ReduceArrays; in each method, the number of array elements to reduce was one too large.

07-May-2008
  In package edu.rit.pj.cluster: Fixed a bug in class JobScheduler and class HybridJobScheduler. If a Job Frontend connected to the Job Scheduler, but the Job Frontend terminated before sending any messages, the Job Scheduler's channel remained open forever, eventually leading to resource exhaustion.

25-Apr-2008
  In package edu.rit.pj.cluster: Added the `jobtime` configuration command to class Configuration and class HybridConfiguration. This configures the PJ Job Scheduler to impose a maximum running time on each job.

24-Apr-2008
  Added package edu.rit.clu.heat with sequential and parallel programs for computing a heat distribution problem. The programs solve the partial differential equation using successive overrelaxation with Chebyshev acceleration and red-black mesh updating.

  In package edu.rit.clu.antimatter: Changed the implementation of the pipelined AntiprotonClu3 program to use fewer interprocess connections.

  In package edu.rit.image: Added class PJGHueImage for reading and writing image files where the image consists of a continuous range of hues. (The existing class PJGColorImage is best suited for images consisting of a small discrete set of colors.)

  In the unnamed package: Fixed a bug in class mprun; under JDK 1.6, class ProcessBuilder requires the full pathname of the command to execute.

  In package edu.rit.mp: Fixed bugs in classes ChannelGroup and NetworkChannelReceiveThread; several I/O error conditions were not handled properly.

30-Mar-2008
  In package edu.rit.clu.antimatter: Changed the implementation of the pipelined AntiprotonClu2 program to use fewer interprocess connections.

  In package edu.rit.util: Changed the implementation of class DefaultRandom so that close seed values do not give closely correlated random sequences.

  In package edu.rit.pj.reduction: Changed the documentation of class ObjectOp to state the requirements for an object reduction operation, which are assumed by the other classes in the Parallel Java Library.

20-Mar-2008
  In the unnamed package: Added program mprun, which runs MPI jobs through the Parallel Java job queue on a cluster parallel computer.

19-Mar-2008
  In package edu.rit.numeric: Added class Quadratic for solving quadratic equations.

  In package edu.rit.util: Fixed bugs in class Random; some precondition checks were missing.

  In class edu.rit.pj.Comm: Reimplemented the flood and all-gather operations to reduce the number of message rounds.

03-Mar-2008
  Added package edu.rit.hyb.monte with hybrid SMP cluster parallel Monte Carlo programs. Added classes PiSeq and PiHyb, sequential and cluster parallel programs to calculate π using a Monte Carlo technique.

  In package edu.rit.smp.monte: Changed classes PiSmp, PiSmp2, and PiSmp3 to use a LongForLoop.

  In package edu.rit.util: Changed the implementation of class Random. Changed class DefaultRandom to use a hashing algorithm instead of a multiplicative congruential generator (MCG) algorithm; the hashing algorithm avoids certain weaknesses of the MCG algorithm. The previous version of class DefaultRandom, which uses a MCG algorithm, is still available as class Mcg1Random.

  In package edu.rit.mp.buf: Fixed bugs in the object buffer subclasses; the serialized representation was not reset in all cases when the buffer contents were changed. Fixed bugs in the matrix buffer subclasses; an ArithmeticException was thrown when receiving into a matrix buffer for a slice of zero columns.

11-Feb-2008
  In package edu.rit.clu.antimatter: Changed programs AntiprotonSeq and AntiprotonClu to put the antiproton motion calculations in subroutines. Added program AntiprotonClu2 which uses pipelined send-receive message passing operations instead of all-gather collective communication operations. Added program AntiprotonClu3 which uses pipelined send-receive message passing operations and which overlaps computation with communication.

  In package edu.rit.numeric.plot.impl: Fixed a bug in class XYPlot; an exception was thrown when plotting a line for a data series with one data point.

07-Feb-2008
  In package edu.rit.clu.antimatter: Changed the antiproton simulation physics so the antiprotons are confined by a perpendicular magnetic field instead of by charged trap walls. Changed program AntiprotonAni to display the antiproton positions and the total momentum. Added class AntiprotonFile, and changed programs AntiprotonSeq and AntiprotonClu to store snapshots of the antiproton positions and the total momentum in a file. Added the AntiprotonPlot program to plot the data in an antiproton file.

03-Feb-2008
  In package edu.rit.clu.fractal: Added classes MSHistogramSeq and MSHistogramClu, sequential and cluster parallel programs to compute a histogram of the Mandelbrot Set and print it into a file.

  In package edu.rit.smp.fractal: Changed classes MSHistogramSeq, MSHistogramSmp, MSHistogramSmp2, and MSHistogramSmp3 to print the histogram into a file.

  In package edu.rit.numeric: Added class Cubic for solving cubic equations.

19-Jan-2008
  In package edu.rit.pj: Fixed a bug in class Comm; due to a race condition, a `floodReceive()` operation would sometimes throw a NullPointerException.

  In package edu.rit.mp: Added a channel group ID to class ChannelGroup. Added methods to class Channel to obtain the channel group IDs of the near end channel group and the far end channel group. These changes were needed to fix the aforementioned bug.

  In the unnamed package: Added the `pjrun` program; this lets a user run a non-PJ job on a PJ cluster, using the PJ job queue to assign backend nodes to the job.

13-Jan-2008
  In package edu.rit.io: Added class DoubleMatrixFile for reading and writing `double[][]` matrices, or portions thereof, from and to files.

  In package edu.rit.smp.network: Changed all the programs to use class edu.rit.io.DoubleMatrixFile for input and output of the distance matrix files.

  In package edu.rit.clu.network: Changed all the programs to use class edu.rit.io.DoubleMatrixFile for input and output of the distance matrix files. Changed class FloydClu so that each process reads a slice of the distance matrix from the input file and writes a slice of the distance matrix to a per-process output file.

31-Dec-2007
  In package edu.rit.pj: Made the `start()` and `next()` methods of classes IntegerSchedule and LongSchedule public; this lets a schedule object divide a range into chunks apart from a parallel for loop.

  In package edu.rit.clu.fractal: Rewrote class MandelbrotSetClu2. Added class MandelbrotSetClu3.

  In package edu.rit.io: Fixed a bug in class Files; the `fileForRank()` method did not return the correct result if the argument was an absolute path.

23-Dec-2007
  In package edu.rit.pj.cluster: Added class HybridJobScheduler, a Job Scheduler Daemon program for a hybrid SMP cluster parallel computer that is able to schedule multiple processes and multiple threads per process on each backend node. Added class HybridConfiguration to provide configuration information for the hybrid job scheduler. Added classes HybridBackendInfo and HybridJobInfo to hold information about backend nodes and jobs in the hybrid job scheduler.

  In package edu.rit.mp: Changed interface ConnectListener to have separate methods for reporting near-end-initiated connections and far-end-initiated connections. Changed class ChannelGroup not to start listening for incoming connections until a new `startListening()` method is called. Changed class ChannelGroup to eliminate the methods that query for channels. These changes were needed to support the new hybrid job scheduler.

  In package edu.rit.pj: Changed class Comm so that when one process initiates a connection to another process, the initiating process sends a message identifying the initiating process's rank. This change was needed to support the new hybrid job scheduler.

  Changed several classes throughout the Library to use 128 extra padding bytes to avert cache interference, instead of 64. (128 bytes is the more prevalent cache line size in modern CPUs.)

12-Dec-2007
  In the unnamed package: Added class View, a main program that can display either a drawing (class edu.rit.draw.Drawing) or a plot (class edu.rit.numeric.plot.Plot) stored in a file. The new View program supersedes the old edu.rit.draw.View program which was removed.

  In class edu.rit.numeric.plot.Plot: Made the class serializable. Added static methods to read and write Plot objects from and to files. Removed the `display()` and `repaint()` methods; their functionality is now available through the Viewable interface.

  In package edu.rit.swing: Added interface Viewable which extends interface Displayable; to show itself on the screen, a Viewable object can return a DisplayableFrame. Drawings and plots are now Viewable objects. Changed class DisplayableFrame so that when it saves the displayable object in a PNG file, the object is saved at its zoomed size.

08-Dec-2007
  In the unnamed package: Added class ncc, a main program to compute the Non-Comment Characters (NCC) metric for a group of Java source files.

27-Nov-2007
  The Parallel Java Library is now released under Version 3 of the GNU General Public License.

  Rewrote package edu.rit.image. It now contains classes for 24-bit color images and 8-bit grayscale images in the Parallel Java Graphics (PJG) image file format. PJG image files are somewhat larger than, but take much less time to write than, PNG image files. For further information, see class PJGImage.

  In the unnamed package: Added program PJG to display an image read from a PJG file.

  In package edu.rit.smp.fractal: Updated the Mandelbrot Set SMP parallel programs to generate a PJG image file instead of a PNG image file.

  In package edu.rit.clu.fractal: Updated the Mandelbrot Set cluster parallel programs to use the matrix allocation and deallocation operations in class edu.rit.util.Arrays and to generate a PJG image file instead of a PNG image file.

  In package edu.rit.mp: Added a static `emptyBuffer()` factory method to each buffer subclass. Fixed a bug in class NetworkChannelReceiveThread; an incoming message was not received properly if the number of items in the message exceeded the number of items in the destination buffer. Removed the I/O completion hook and chained I/O request capabilities from class IORequest; these reduced message passing performance too much. Changed the non-blocking send and receive methods in class ChannelGroup to take an IORequest argument instead of creating their own new IORequest object.

  In package edu.rit.pj: Removed enumeration Wait. In its place, added class BarrierAction to specify what should happen during a barrier synchronization. Changed all the `execute()` methods in class ParallelRegion to use class BarrierAction instead of enumeration Wait. In class Comm, changed the implementation of flood-receive to use a special subclass of class IORequest instead of an I/O completion hook.

  In package edu.rit.draw.item: Added class Polygon.

26-Oct-2007
  In class edu.rit.util.Arrays: Fixed bugs in the `copy()` methods; the wrong index upper bound was calculated. Added `allocate()`, `deallocate()`, `length()`, `rowLength()`, and `colLength()` methods.

  In package edu.rit.mp: Fixed bugs in the factory methods in the buffer base classes; the factory methods would fail if a matrix row was not allocated; the factory methods were changed to return a zero-length buffer instead.

  In package edu.rit.mp.buf: Moved precondition checks out of the buffer subclass constructors into the buffer base class factory methods in package edu.rit.mp.

21-Oct-2007
  In class edu.rit.pj.cluster.JobFrontend: The SSH session on the backend processor now runs the job backend process in the background and terminates immediately without waiting for the job backend process to terminate. The SSH session no longer stays around while the job is executing.

  In class edu.rit.pj.Comm: Added the `host()` method.

  In class edu.rit.numeric.Plot: Added a "Format" menu to the plot window that lets the user change plot attributes interactively.

  In class edu.rit.swing.DisplayableFrame: Added a "Fit Window" menu item to the "View" menu that resizes the window to fit the displayable object.

03-Oct-2007
  In package edu.rit.pj: Added the `barrier()` method with a barrier action to class ParallelRegion. Added the `floodSend()` and `floodReceive()` methods to class Comm. Added the `isFinished()` method to class CommRequest.

  In package edu.rit.mp: Added the `isFinished()` method to class IORequest. Added I/O request chaining and I/O completion hook capabilities to class IORequest and class ChannelGroup. These are used to implement flood-send and flood-receive.

  In package edu.rit.clu.keysearch: Changed the FindKeyClu2 program to use flood-send and flood-receive to stop the search when any process finds the key.

  In the unnamed package: Added class Program1Clu, an introductory parallel program for a cluster.

07-Sep-2007
  In package edu.rit.smp.fractal: Added program MSHistogramSmp2 to compute a histogram of the Mandelbrot Set using the parallel reduction pattern. Added program MSHistogramSmp3 to compute a histogram of the Mandelbrot Set using a critical section.

  In package edu.rit.pj.reduction: In each of the shared array classes, added a method to reduce a portion of the shared array with a portion of a given array.

  In package edu.rit.pj: Added the `team()` and `region()` methods to class ParallelConstruct. Added the `isExecutingInParallel()` and `region()` method to class ParallelTeam. Changed the implementation of the parallel constructs' low-level thread synchronization to improve performance.

22-Aug-2007
  In package edu.rit.numeric: Added interface Function, class SampledXYSeries, class TransformedSeries, class TransformedXYSeries, class TransformedXYZSeries, and class Interpolation.

  In package edu.rit.numeric.plot: Added the ability to specify bold, italic, superscript, and subscript text attributes in plot labels. Added the ability to draw a smooth curve for an X-Y data series.

  In package edu.rit.draw.item: Added class Bow to draw curved (bowed) lines. Added class Oval to draw ovals. Added a round corner attribute to class Rectangle. Added class Group to permit a group of drawing items to be translated and rotated as a unit.

03-Jul-2007
  In package edu.rit.pj.cluster: Certain messages from the job frontend to the job backends are no longer sent using a parallel broadcast tree; eliminating the parallel broadcast tree reduced the program's running time.

28-Jun-2007
  In package edu.rit.pj: Re-implemented the SMP parallel programming classes to use more extensively the Java Concurrency Utilities in packages java.util.concurrent, java.util.concurrent.atomic, and java.util.concurrent.locks. Eliminated class ParallelSectionGroup; in its place is a ParallelRegion `execute()` method that can take any number of ParallelSection arguments. Eliminated the `noWait()` method of various parallel constructs; in its place is a ParallelRegion `execute()` method argument telling whether the parallel team threads should wait for each other at the end of a parallel construct. Changed classes Schedule and LongSchedule so that user-defined schedule subclasses can be written; such schedule subclasses can also be specified at run time with a command line flag (`-Dpj.schedule`).

  Consolidated packages edu.rit.pj.op and edu.rit.pj.shared into one package, edu.rit.pj.reduction. The new package has classes for thread safe shared reduction variables of each primitive type and of object types, and arrays thereof. The new package also has classes for binary reduction operators of each primitive type as well as object types. Shifted the `getReductionBuf()` method from class edu.rit.pj.op.Op to class edu.rit.mp.Buf.

  In package edu.rit.util: Added a stride to classes Range and LongRange.

  In packages edu.rit.mp and edu.rit.mp.buf: The factory methods for creating buffer objects are now in the base classes in package edu.rit.mp. Factory methods are provided for single items, arrays, matrices, thread safe shared items, and thread safe shared arrays of each primitive type and of object types. All the buffer classes for slices of arrays and matrices now support ranges with a stride of 1 and ranges with a stride greater than 1.

  In package edu.rit.pj.cluster: Added class Configuration to encapsulate the cluster configuration file. Added the ability to specify JVM command line flags in the configuration file. Fixed a bug in class JobFrontend; the command to run a job backend process did not work if the working directory name contained whitespace.

  Added package edu.rit.numeric with classes for numerical computation. Added packages edu.rit.numeric.plot and edu.rit.numeric.plot.impl with classes for creating plots, displaying them on the screen, and writing them to PNG or PostScript files.

  In the unnamed package: Added programs Speedup and TimeFit for analyzing parallel program running time measurements.

14-May-2007
  In package edu.rit.phyl.pars: Changed class DnaSequence to add extra padding to the byte array holding the sites, to avert cache interference in an SMP parallel program. Added class MaxParsBnb2, a main program for branch-and-bound search that does not shuffle the input DNA sequences into descending distance order. (Class MaxParsBnb does shuffle the input DNA sequences into descending distance order.)

06-May-2007
  In package edu.rit.phyl.pars: Made several further changes to reduce the storage requirement and running time of the MaxParsExh program. Added the MaxParsBnb and MaxParsSmp programs; these are a sequential and an SMP parallel version of a phylogenetic tree construction program using branch-and-bound search.

02-May-2007
  Added the `allReduce()` and `barrier()` methods to class edu.rit.pj.Comm. Added class edu.rit.mp.buf.EmptyIntegerBuf.

23-Apr-2007
  In package edu.rit.phyl.pars: Changed class DnaSequence to share the base sequence storage array among different DNA sequence objects where possible; this reduces the storage requirement and running time of the MaxParsExh tree construction program.

22-Apr-2007
  Added packages edu.rit.phyl, edu.rit.phyl.pars, and edu.rit.phyl.pars.test with classes and programs for maximum parsimony phylogenetic tree construction. At present there is one tree construction program, class edu.rit.phyl.pars.MaxParsExh, which uses an exhaustive search.

09-Apr-2007
  Added package edu.rit.hyb.prime with hybrid SMP cluster parallel programs for parallel querying of a datastore of prime numbers (classes Prime32Seq and Prime32Hyb).

07-Apr-2007
  In package edu.rit.hyb.antimatter: Fixed a bug in class AntiprotonHyb; when running with multiple threads, the program did not ensure that all force calculations had completed before updating the antiproton positions.

02-Apr-2007
  In class edu.rit.pj.Comm: Added the `createComm()` method for creating a new communicator.

  Added package edu.rit.hyb.antimatter with hybrid SMP cluster parallel programs for simulating antiproton motion in an antiproton trap (classes AntiprotonHyb and RenderSeq).

24-Mar-2007
  Added package edu.rit.hyb.network with hybrid SMP cluster parallel programs for calculating all shortest paths in a graph using Floyd's Algorithm.

21-Mar-2007
  Added package edu.rit.hyb.keysearch with hybrid SMP cluster parallel programs for AES partial key search. Added package edu.rit.hyb.fractal with hybrid SMP cluster parallel programs for calculating the Mandelbrot Set.

18-Mar-2007
  In package edu.rit.pj: Fixed a bug in class Comm; the `reduce()` method permitted multiple threads to receive into the reduction buffer simultaneously, but buffers are not designed to be multiple thread safe for receiving.

17-Mar-2007
  In package edu.rit.pj.cluster: Changed the Job Frontend to use SSH to spawn Job Backend processes. This authenticates the Job Backend processes into the user's account and allows the Job Backend processes to access the user's files directly without having to go through the Job Frontend process. (Eliminating the use of SSH in the 06-Nov-2006 version proved to be a mistake.)

16-Feb-2007
  Added the `reset()` method to classes edu.rit.mp.ObjectBuf, edu.rit.mp.buf.ObjectItemBuf, edu.rit.mp.buf.ObjectArrayBuf, and edu.rit.mp.buf.ObjectMatrixBuf. The `reset()` method must be called when the state of any object in the buffer changes.

14-Feb-2007
  Fixed a bug in class edu.rit.pj.Comm; the `receive()` method sometimes threw a NullPointerException when receiving a message from any process (`fromRank` = null).

13-Feb-2007
  In package edu.rit.clu.antimatter: Added more cluster parallel programs for simulating antiproton motion in an antiproton trap (classes AntiprotonClu2 and AntiprotonClu3).

10-Feb-2007
  In class edu.rit.mp.ChannelGroup: Added the `channelToHost()`, `waitForChannelTo()`, and `waitForChannelToHost()` methods.

  In class edu.rit.pj.Comm: Rewrote the `allGather()` method to use a significantly faster message pattern. Rewrote the logic for connecting channels between backend processes. Added caching of message pattern information in the `broadcast()`, `allGather()`, and `reduce()` methods.

08-Feb-2007
  Added package edu.rit.clu.antimatter with cluster parallel programs for simulating antiproton motion in an antiproton trap (classes AntiprotonAni, AntiprotonSeq, and AntiprotonClu).

  Removed package edu.rit.clu.particles; package edu.rit.clu.antimatter took its place.

06-Feb-2007
  In package edu.rit.clu.network: Rewrote the cluster parallel programs for calculating all shortest paths in a graph using Floyd's Algorithm (classes FloydSeq and FloydClu).

  In package edu.rit.clu.timing: Added class TimeSendDouble to measure the time required to send a message whose data items are type `double`.

01-Feb-2007
  In package edu.rit.clu.monte: Rewrote the cluster parallel programs for calculating π using a Monte Carlo technique (classes PiSeq and PiClu).

  In package edu.rit.clu.fractal: Fixed a bug in class MandelbrotSetClu4; the program did not properly overlap sending the previous slice and computing the next slice.

  In package edu.rit.util: Fixed a bug in class Random; the `nextInt()` method could sometimes consume more than one value from the pseudorandom sequence, leading to incorrect sequence splitting in a parallel program.

30-Jan-2007
  In package edu.rit.clu.fractal: Added two more cluster parallel programs for calculating the Mandelbrot Set (classes MandelbrotSetClu3, MandelbrotSetClu4).

24-Jan-2007
  In package edu.rit.clu.fractal: Rewrote the cluster parallel programs for calculating the Mandelbrot Set (classes MandelbrotSetSeq, MandelbrotSetClu, MandelbrotSetClu2).

  In package edu.rit.clu.timing: Changed the output format for classes TimeSend and TimeBcast.

  In class edu.rit.pj.PJProperties: Added the `pj.jobtime` Java system property to set the maximum running time for a job.

  In package edu.rit.mp: Fixed a bug in class ChannelGroup; if one thread tried to send a message to another thread in the same process, a deadlock could happen.

16-Jan-2007
  In package edu.rit.clu.keysearch: Rewrote the cluster parallel programs for AES partial key search.

15-Jan-2007
  In package edu.rit.pj.cluster: Fixed a bug in class JobFrontend; the job frontend's lease timers for the job backend were not started at the correct time, which could result in an incorrect lease timeout that incorrectly aborted the job.

14-Jan-2007
  In package edu.rit.pj.cluster: Changed the Job Scheduler; when a job frontend process reports that a job backend process failed, the Job Scheduler will keep the backend processor available.

10-Jan-2007
  In package edu.rit.image: Added class SyncGrayImage providing a grayscale image class with producer-consumer synchronization.

  In class edu.rit.pj.ParallelRegion: Added `reductionArray()` methods to create reduction variables containing arrays of the primitive types.

  In package edu.rit.smp.network: Minor changes to the Floyd's Algorithm programs.

  Removed obsolete package edu.rit.smp.sort.

22-Dec-2006
  In package edu.rit.util: Added classes Random and DefaultRandom. These provide a pseudorandom number generator (PRNG) designed for use in parallel scientific programming.

  Made some minor changes to the parallel programs in packages edu.rit.smp.fractal and edu.rit.smp.monte.

20-Nov-2006
  In packages edu.rit.mp and edu.rit.mp.buf: Fixed a bug in the Message Protocol; a message was not received properly if the destination buffer was larger than the number of items in the message.

  In package edu.rit.pj.cluster: Changed the frontend file I/O capability to reduce the number of byte array copy operations.

09-Nov-2006
  In package edu.rit.pj.cluster: Changed class FrontendFileWriter to perform all file operations in a separate thread, to avoid blocking the job frontend's message processing thread. (Class FrontendFileReader already works this way.)

07-Nov-2006
  Some minor changes in the Job Scheduler Daemon's web interface. Fixed a bug in class edu.rit.pj.Comm; a NullPointerException occurred when a job was run on a machine with no Job Scheduler Daemon.

06-Nov-2006
  A major redesign of the PJ message passing middleware for cluster parallel programming. The goals of the redesign are to reduce the time needed to send messages and to make it easier to deploy and use PJ on cluster parallel computers. The principal changes are:
  - In package edu.rit.mp: Changed the channel and channel group classes to use Java "Old I/O" (thread-based) instead of Java "New I/O" (selector-based). Old I/O's measured performance is better than New I/O's.
  - In package edu.rit.pj.cluster: Eliminated the use of SSH to launch backend processes; PJ now has its own Job Launcher written in 100% Java. The job frontend process runs in the user's account as before, but the job backend processes are no longer authenticated into the user's account; rather, they run in a separate PJ account. Eliminating SSH greatly reduces the startup time for a PJ job. All the other classes were rewritten as well. The Job Scheduler now has a web interface for displaying the cluster status.
  - In package edu.rit.pj: Changed the implementation of class Comm to use the new classes in package edu.rit.pj.cluster. However, the exported methods of class Comm still have the same signatures as before, so programs using class Comm do not need to change.
  - Added package edu.rit.pj.io with class StreamFile. This class lets a PJ program running in the PJ account on a backend processor read and write files stored in the user's account on the frontend processor. This capability is needed because PJ no longer authenticates the job backend processes into the user's account. Instead, using class StreamFile, the job backend processes communicate with the job frontend process (which is authenticated into the user's account) to read and write files. All the application programs were changed to use class StreamFile.

09-Mar-2006
  Removed the deprecated package edu.rit.matrix. Removed the deprecated constructors in the array buffer classes in package edu.rit.mp.buf.

  In package edu.rit.pj: Changed the name of class Status to class CommStatus to emphasize that the class stores the status of a communication operation in class Comm.

20-Feb-2006
  Added non-blocking send and receive operations to class edu.rit.pj.Comm.

  In package edu.rit.mp.buf: Added buffer classes for matrices of all primitive types. Added a buffer class for a matrix of objects.

  Fixed a bug in class edu.rit.clu.particles.ProtonClu3; computation and communication used the same array, so incoming new data could overwrite the previous data being used in the computation.

16-Feb-2006
  Added the send-receive operation to class edu.rit.pj.Comm, including a non-blocking version.

  In package edu.rit.clu.particles: Added more cluster parallel programs for the Particle Simulation, an N-bodies problem.

14-Feb-2006
  Added the all-gather operation to class edu.rit.pj.Comm.

  Added package edu.rit.vector with class Vector2D, a two-dimensional mathematical vector of doubles, as well as buffer classes for sending and receiving 2-D vectors in message passing parallel programs.

  Added package edu.rit.clu.particles with sequential and cluster parallel programs for the Particle Simulation, an N-bodies problem.

12-Feb-2006
  Package edu.rit.matrix was deprecated. The classes in this package are still available but should no longer be used. Package edu.rit.matrix will be removed in a future release of the Parallel Java Library. The package was deprecated because accessing arrays and matrices using class methods takes too long in a parallel program.

  Added package edu.rit.image. This package contains image classes equivalent to the ones in package edu.rit.matrix. However, to improve running times, the new image classes operate on primitive matrices (type `byte[][]` or `int[][]`) instead of the matrix classes.

  In package edu.rit.mp.buf: Added matrix buffer classes equivalent to the ones in package edu.rit.matrix for byte, double, and integer matrices. However, to improve running times, the new matrix buffer classes operate on primitive matrices instead of the matrix classes.

  In package edu.rit.mp.buf: The constructors in all the array buffer classes were deprecated, and static factory methods were added. The constructors are still available but should no longer be used. The constructors will be removed in a future release of the Parallel Java Library. The constructors were deprecated because the static factory methods provide greater programming flexibility.

  Revised code throughout the Parallel Java Library not to use the deprecated classes and constructors.

10-Feb-2006
  In package edu.rit.matrix: Added reduction operations to classes ParallelDoubleArray, ParallelDoubleMatrix, ParallelIntegerArray, and ParallelIntegerMatrix. Added classes ParallelByteArray, ParallelByteMatrix, and RowSliceByteMatrix.

  Fixed a bug in class edu.rit.matrix.ByteMatrixBuf; the I/O buffer position was not set properly after sending items from or receiving items into the byte matrix buffer.

08-Feb-2006
  In package edu.rit.pj: Added the `reduce()` method to class Comm to do parallel reduction in a message passing program.

  Added package edu.rit.pj.op with classes for binary operations to do parallel reduction in a message passing program.

  Added package edu.rit.clu.network with cluster parallel programs for computing all shortest paths in a network using Floyd's Algorithm, an example of an algorithm that uses broadcasting on a cluster parallel computer.

  Added package edu.rit.clu.monte with cluster parallel programs for computing π using a Monte Carlo technique, an example of an algorithm that uses reduction on a cluster parallel computer.

  Fixed a bug in the matrix classes of package edu.rit.matrix; the `row()` method did not create a reference to the correct row if the full matrix was not allocated.

04-Feb-2006
  In package edu.rit.matrix: Added message buffer classes for sending and receiving matrix elements in message passing operations.

  In package edu.rit.pj: Added class RangeSchedule for writing cluster parallel programs using the master-worker pattern.

  In package edu.rit.clu.fractal: Added cluster parallel program MandelbrotSetClu2 that computes the Mandelbrot Set using the master-worker pattern for load balancing. Added cluster parallel program MandelbrotSetClu3 that computes the Mandelbrot Set using the master-worker pattern for load balancing and uses overlapped computation and I/O.

  Fixed a bug in class edu.rit.pj.Comm; a deadlock could happen when a process did a receive from "any channel."

01-Feb-2006
  Fixed a bug involving packages edu.rit.mp, edu.rit.pj, and edu.rit.pj.cluster; when an object was sent in a message through a communicator, and the object's class was not part of the PJ Library, the object would not deserialize properly at the destination (an exception would be thrown).

30-Jan-2006
  In package edu.rit.mp: Redesigned the package again. The separate Src and Dst classes were combined into a single Buf class for both sending and receiving messages. The message buffer subclasses were moved into package edu.rit.mp.buf. Package edu.rit.mp.data was eliminated. Added the ability to have multiple threads sending messages simultaneously using the same message buffer. Added a loopback channel capability so that a process can send and receive messages to and from itself in different threads. Added non-blocking send and receive operations.

  In package edu.rit.pj: Class Comm was changed to use class edu.rit.mp.Buf as the message buffer. Interface edu.rit.pj.Buffer and package edu.rit.pj.data were eliminated. Added the ability for a process to send and receive a message to and from itself in different threads. Added the scatter and gather collective communication methods.

  In package edu.rit.matrix: Added classes ParallelIntegerMatrix, RowSliceIntegerMatrix, and IntegerMatrixBuf with methods for transferring integer matrices between processes using message passing.

  Added package edu.rit.clu.fractal with cluster parallel programs for computing an image of the Mandelbrot Set, an example of a massively parallel problem that needs load balancing.

26-Jan-2006
  Fixed a bug in class edu.rit.mp.ChannelGroup; improper thread synchronization sometimes caused a deadlock.

24-Jan-2006
  Extensive changes and additions to the message passing portion of Parallel Java. In package edu.rit.mp: Redesigned the item source and item destination classes. Coalesced former packages edu.rit.mp.src and edu.rit.mp.dst into one new package edu.rit.mp.data.

  In package edu.rit.pj: Added `send()`, `receive()`, and `broadcast()` communication methods to class Comm. Added package edu.rit.pj.data with classes for message data buffers. Made many changes to package edu.rit.pj.cluster to support the new Comm capabilities.

  Added package edu.rit.clu.keysearch with cluster parallel programs for breaking a block cipher using exhaustive key search, an example of a massively parallel problem.

  Added package edu.rit.clu.timing with cluster parallel programs for timing the send, receive, and broadcast methods in class edu.rit.pj.Comm.

  Fixed a bug in class edu.rit.pj.Lock; exclusive locking was not implemented properly. Fixed a bug in class edu.rit.pj.cluster.BackendClassLoader; improper thread synchronization sometimes caused a ClassCircularityError.

14-Jan-2006
  In package edu.rit.pj: Added class Reduction which encapsulates a reduction variable for use in the parallel reduction pattern. Added a method to class ParallelRegion to associate a reduction variable with the parallel region. Added class Lock for exclusive and nonexclusive locking. Changed the critical region methods in class ParallelRegion to use class Lock instead of class java.util.concurrent.locks.ReentrantLock.

  In package edu.rit.smp.sort: Redesigned the SwapSortSeq and SwapSortSmp programs. Added the SwapSortSmp2 program which does a parallel reduction using a reduction variable.

  In package edu.rit.pj.cluster: Fixed a bug in class JobFrontend; the job frontend did not wait for end-of-stream on the SSH session's standard output and standard error before exiting.

12-Jan-2006
  Added package edu.rit.smp.sort with programs for sorting, as an additional illustration of parallel reduction and parallel team thread synchronization.

09-Jan-2006
  Added package edu.rit.smp.network with programs for computing all shortest paths in a network using Floyd's Algorithm, an example of an algorithm with dependencies between loop iterations that affect how the algorithm is parallelized.

06-Jan-2006
  Added package edu.rit.mp with classes for message passing. Added package edu.rit.mp.src with classes for message item sources. Added package edu.rit.mp.dst with classes for message item destinations. Added package edu.rit.mp.test with unit test programs for package edu.rit.mp.

  Added package edu.rit.pj.cluster with message passing middleware classes for PJ message passing parallel programs.

  In package edu.rit.pj: Added class Comm for using the message passing middleware in a PJ parallel program. At present, class Comm has a method for initializing the message passing middleware and running a PJ parallel program on the backend processors of a cluster parallel computer. In future releases, class Comm will include methods for message passing.

14-Dec-2005
  In package edu.rit.util: Added class Checklist for synchronizing producer and consumer threads.

  In package edu.rit.matrix: Added class SyncColorImage with producer-synchronization.

  In package edu.rit.smp.fractal: Added class MandelbrotSetSmp2 with a program for computing an image of the Mandelbrot set that uses overlapped computation and I/O as well as a parallel loop.

12-Dec-2005
  In package edu.rit.smp.keysearch: Added another program for breaking a block cipher using exhaustive key search.

  In package edu.rit.matrix: Added classes for treating an integer matrix as a color image. Added classes for treating a byte matrix as an indexed color image.

  Added package edu.rit.color with classes for representing colors in different ways.

  Added package edu.rit.smp.fractal with programs for computing an image of the Mandelbrot Set, an example of a massively parallel problem that needs load balancing.

06-Dec-2005
  Added package edu.rit.smp.keysearch with programs for breaking a block cipher using exhaustive key search, an example of a massively parallel problem.

  Added package edu.rit.crypto.blockcipher with classes for the Advanced Encryption Standard (AES) block cipher, used by the aforementioned programs.

  Added package edu.rit.util with: class Range to represent a range of indexes; class HexPrintStream to print things in hexadecimal.

  Added package edu.rit.matrix with: classes for one-dimensional arrays and matrices (two-dimensional arrays) of various data types; and classes for treating a byte matrix as a grayscale image.

15-Sep-2005
  In package edu.rit.pj: Added class ParallelIteration to do parallel loops over arrays, iterators, and iterable collections. Added class ParallelConstruct as a common base class for all parallel constructs and moved the implementations of common methods there. Changed the methods that throw "any exception" to be declared as `"throws Exception;"` rather than `"throws Throwable;"`.

  In package edu.rit.pj.test: Added program UC to test parallel iterations.

31-Aug-2005
  In package edu.rit.pj: Rewrote all the classes pertaining to parallel for loops. Loop index data types of both `int` and `long` are now supported. The default schedule is now a "runtime" schedule. The name of the `breakLoop()` method was changed to `stopLoop()` to emphasize that its behavior is not the same as a `break` statement.

  In package edu.rit.pj.shared: Added several additional arithmetic methods to the shared variable wrapper classes.

02-May-2005
  The first complete version of PJ was released. Package edu.rit.pj.shared now includes shared variable wrapper classes for all the primitive types.

08-Apr-2005
  Another incomplete version of PJ was released. In package edu.rit.pj: Added the `ordered()` method in class ParallelForLoop. Changed the specification of the `noWait()` method in classes ParallelForLoop, ParallelSectionGroup, and ParallelSection. Changed the specification of the `single()` method in class ParallelRegion. Fixed a bug in class Schedule and its subclasses.

21-Mar-2005
  Another incomplete version of PJ was released. The following capabilities were added in package edu.rit.pj: parallel execution of a group of parallel sections; execution of a parallel section by a single parallel team thread; execution of a parallel section in a critical region; and breaking out of parallel for loops. Some more unit test programs were added in package edu.rit.pj.test.

16-Mar-2005
  An initial incomplete version of PJ was released. This includes: initial versions of the parallel team, parallel region, and parallel for loop classes in package edu.rit.pj; a shared integer variable class in package edu.rit.pj.shared; some unit test programs in package edu.rit.pj.test; and some parallel Monte Carlo programs in package edu.rit.smp.monte.