use of edu.rit.util.Range in project ffx by mjschnie.
the class ShortBuf method rowSliceBuffer.
/**
* Create a buffer for one row slice of the given short matrix. The returned
* buffer encompasses <TT>theRowRange</TT> of rows, and all the columns, in
* <TT>theMatrix</TT>. The range's stride may be 1 or greater than 1.
*
* @param theMatrix Matrix.
* @param theRowRange Range of rows to include.
* @return Buffer.
* @exception NullPointerException (unchecked exception) Thrown if
* <TT>theMatrix</TT> is null or
* <TT>theRowRange</TT> is null.
* @exception IndexOutOfBoundsException (unchecked exception) Thrown if
* <TT>theMatrix</TT>'s allocation does not include <TT>theRowRange</TT>.
*/
public static ShortBuf rowSliceBuffer(short[][] theMatrix, Range theRowRange) {
if (theMatrix == null) {
throw new NullPointerException("ShortBuf.rowSliceBuffer(): theMatrix is null");
}
int nr = Arrays.rowLength(theMatrix);
if (0 > theRowRange.lb() || theRowRange.ub() >= nr) {
throw new IndexOutOfBoundsException("ShortBuf.rowSliceBuffer(): theMatrix row index range = 0.." + (nr - 1) + ", theRowRange = " + theRowRange);
}
int nc = Arrays.colLength(theMatrix, theRowRange.lb());
if (theRowRange.stride() == 1) {
return new ShortMatrixBuf_1(theMatrix, theRowRange, new Range(0, nc - 1));
} else {
return new ShortMatrixBuf(theMatrix, theRowRange, new Range(0, nc - 1));
}
}
use of edu.rit.util.Range in project ffx by mjschnie.
the class ParallelRegion method execute.
/**
* Execute a parallel for loop within this parallel region. For further
* information, see class {@linkplain IntegerForLoop}. The loop index goes
* from <TT>first</TT> (inclusive) to <TT>last</TT> (inclusive) in steps of
* +1. If <TT>first</TT> is greater than <TT>last</TT>, then no loop
* iterations are performed. At the end of the parallel for loop, the
* parallel team threads encounter a barrier, and their behavior depends on
* the given {@linkplain BarrierAction}.
* <P>
* <I>Note:</I> Either all threads in the parallel team must call the
* <TT>execute()</TT> method with identical arguments, or none of the
* threads must call the <TT>execute()</TT> method.
*
* @param first First loop index.
* @param last Last loop index.
* @param theLoop Parallel for loop.
* @param action Barrier action.
* @exception NullPointerException (unchecked exception) Thrown if
* <TT>theLoop</TT> is null. Thrown if
* <TT>action</TT> is null.
* @exception IllegalStateException (unchecked exception) Thrown if no
* parallel team is executing this parallel region.
* @exception Exception Thrown if one of <TT>theLoop</TT>'s methods throws
* an exception.
* @throws java.lang.Exception if any.
*/
public final void execute(int first, int last, IntegerForLoop theLoop, BarrierAction action) throws Exception {
// Verify preconditions.
if (theLoop == null) {
throw new NullPointerException("ParallelRegion.execute(): Parallel for loop is null");
}
if (action == null) {
throw new NullPointerException("ParallelRegion.execute(): Barrier action is null");
}
if (myTeam == null) {
throw new IllegalStateException("ParallelRegion.execute(): No parallel team executing");
}
try {
// Record parallel team.
theLoop.myTeam = this.myTeam;
// Get current parallel team thread.
ParallelTeamThread currentThread = getCurrentThread();
int currentIndex = currentThread.myIndex;
// Do top-of-parallel-construct processing.
IntegerSchedule schedule = null;
if (currentThread.arriveAtParallelConstruct()) {
// each team thread.
try {
schedule = theLoop.schedule();
schedule.commonStart(myTeam.K, new Range(first, last));
for (ParallelTeamThread thread : myTeam.myThread) {
thread.setIntegerSchedule(schedule);
}
} catch (Throwable exc) {
for (ParallelTeamThread thread : myTeam.myThread) {
thread.setConstructException(exc);
}
}
}
// Get the shared parallel for loop schedule object.
schedule = currentThread.getIntegerSchedule();
theLoop.mySchedule = schedule;
// Prepare to catch exceptions thrown by the parallel for loop body.
Throwable runException = null;
try {
// Perform per-thread initialization.
theLoop.start();
// Repeatedly get and process a chunk of loop iterations.
Range chunk;
while ((chunk = schedule.commonNext(currentIndex)) != null) {
theLoop.commonRun(chunk.lb(), chunk.ub());
}
// Perform per-thread finalization.
theLoop.finish();
} catch (Throwable exc) {
runException = exc;
schedule.myBreak = true;
}
// Barrier synchronization.
action.doBarrier(currentThread);
// Propagate any exception thrown by the run() method.
ParallelTeam.rethrow(runException);
} finally {
// Forget parallel team.
theLoop.myTeam = null;
theLoop.mySchedule = null;
}
}
use of edu.rit.util.Range in project ffx by mjschnie.
the class Signed8BitIntegerBuf method colSliceBuffer.
/**
* Create a buffer for one column slice of the given integer matrix. The
* returned buffer encompasses all the rows, and <TT>theColRange</TT> of
* columns, in <TT>theMatrix</TT>. The range's stride may be 1 or greater
* than 1.
*
* @param theMatrix Matrix.
* @param theColRange Range of columns to include.
* @return Buffer.
* @exception NullPointerException (unchecked exception) Thrown if
* <TT>theMatrix</TT> is null or
* <TT>theColRange</TT> is null.
* @exception IndexOutOfBoundsException (unchecked exception) Thrown if
* <TT>theMatrix</TT>'s allocation does not include <TT>theColRange</TT>.
*/
public static Signed8BitIntegerBuf colSliceBuffer(int[][] theMatrix, Range theColRange) {
if (theMatrix == null) {
throw new NullPointerException("Signed8BitIntegerBuf.colSliceBuffer(): theMatrix is null");
}
int nr = Arrays.rowLength(theMatrix);
int nc = Arrays.colLength(theMatrix, 0);
if (0 > theColRange.lb() || theColRange.ub() >= nc) {
throw new IndexOutOfBoundsException("Signed8BitIntegerBuf.colSliceBuffer(): theMatrix column index range = 0.." + (nc - 1) + ", theColRange = " + theColRange);
}
if (theColRange.stride() == 1) {
return new Signed8BitIntegerMatrixBuf_1(theMatrix, new Range(0, nr - 1), theColRange);
} else {
return new Signed8BitIntegerMatrixBuf(theMatrix, new Range(0, nr - 1), theColRange);
}
}
use of edu.rit.util.Range in project ffx by mjschnie.
the class Signed8BitIntegerBuf method rowSliceBuffer.
/**
* Create a buffer for one row slice of the given integer matrix. The
* returned buffer encompasses <TT>theRowRange</TT> of rows, and all the
* columns, in <TT>theMatrix</TT>. The range's stride may be 1 or greater
* than 1.
*
* @param theMatrix Matrix.
* @param theRowRange Range of rows to include.
* @return Buffer.
* @exception NullPointerException (unchecked exception) Thrown if
* <TT>theMatrix</TT> is null or
* <TT>theRowRange</TT> is null.
* @exception IndexOutOfBoundsException (unchecked exception) Thrown if
* <TT>theMatrix</TT>'s allocation does not include <TT>theRowRange</TT>.
*/
public static Signed8BitIntegerBuf rowSliceBuffer(int[][] theMatrix, Range theRowRange) {
if (theMatrix == null) {
throw new NullPointerException("Signed8BitIntegerBuf.rowSliceBuffer(): theMatrix is null");
}
int nr = Arrays.rowLength(theMatrix);
if (0 > theRowRange.lb() || theRowRange.ub() >= nr) {
throw new IndexOutOfBoundsException("Signed8BitIntegerBuf.rowSliceBuffer(): theMatrix row index range = 0.." + (nr - 1) + ", theRowRange = " + theRowRange);
}
int nc = Arrays.colLength(theMatrix, theRowRange.lb());
if (theRowRange.stride() == 1) {
return new Signed8BitIntegerMatrixBuf_1(theMatrix, theRowRange, new Range(0, nc - 1));
} else {
return new Signed8BitIntegerMatrixBuf(theMatrix, theRowRange, new Range(0, nc - 1));
}
}
use of edu.rit.util.Range in project ffx by mjschnie.
the class Signed8BitIntegerBuf method patchBuffers.
/**
* Create an array of buffers for multiple patches of the given integer
* matrix. The length of the returned buffer array is equal to the length of
* <TT>theRowRanges</TT> times the length of <TT>theColRanges</TT>. Each
* element of the returned buffer array encompasses the rows given in one
* element of <TT>theRowRanges</TT> array, and the columns given in one
* element of <TT>theColRanges</TT> array, in all possible combinations, of
* <TT>theMatrix</TT>. Each range's stride may be 1 or greater than 1.
*
* @param theMatrix Matrix.
* @param theRowRanges Array of ranges of rows to include.
* @param theColRanges Array of ranges of columns to include.
* @return Array of buffers.
* @exception NullPointerException (unchecked exception) Thrown if
* <TT>theMatrix</TT> is null,
* <TT>theRowRanges</TT> or any element thereof is null, or
* <TT>theColRanges</TT> or any element thereof is null.
* @exception IndexOutOfBoundsException (unchecked exception) Thrown if
* <TT>theMatrix</TT>'s allocation does not include any element of
* <TT>theRowRanges</TT> or
* <TT>theColRanges</TT>.
*/
public static Signed8BitIntegerBuf[] patchBuffers(int[][] theMatrix, Range[] theRowRanges, Range[] theColRanges) {
int m = theRowRanges.length;
int n = theColRanges.length;
Signed8BitIntegerBuf[] result = new Signed8BitIntegerBuf[m * n];
int k = 0;
for (int i = 0; i < m; ++i) {
Range rowrange = theRowRanges[i];
for (int j = 0; j < n; ++j) {
result[k++] = patchBuffer(theMatrix, rowrange, theColRanges[j]);
}
}
return result;
}
Aggregations