jsr166y.forkjoin
Class ParallelDoubleArray

java.lang.Object
  extended by jsr166y.forkjoin.ParallelDoubleArray

public class ParallelDoubleArray
extends java.lang.Object

An array of doubles supporting parallel operations. This class provides methods supporting the same operations as ParallelArray, but specialized for scalar doubles. It additionally provides a few methods specific to numerical values.


Nested Class Summary
static interface ParallelDoubleArray.SummaryStatistics
          Summary statistics for a possibly bounded, filtered, and/or mapped ParallelDoubleArray.
static class ParallelDoubleArray.WithBounds
          A restriction of parallel array operations to apply only within a given range of indices.
static class ParallelDoubleArray.WithDoubleMapping
          A modifier for parallel array operations to apply to mappings of elements to doubles, not to the elements themselves
static class ParallelDoubleArray.WithFilter
          A restriction of parallel array operations to apply only to elements for which a selector returns true
static class ParallelDoubleArray.WithLongMapping
          A modifier for parallel array operations to apply to mappings of elements to longs, not to the elements themselves
static class ParallelDoubleArray.WithMapping<U>
          A modifier for parallel array operations to apply to mappings of elements, not to the elements themselves
 
Constructor Summary
protected ParallelDoubleArray(ForkJoinExecutor executor, double[] array, int limit)
          Constructor for use by subclasses to create a new ParallelDoubleArray using the given executor, and initially using the supplied array, with effective size bound by the given limit.
 
Method Summary
 void addAll(double[] other)
          Equivalent to AsList.addAll but specialized for array arguments and likely to be more efficient.
 void addAll(ParallelDoubleArray.WithBounds other)
          Equivalent to AsList.addAll but specialized for ParallelDoubleArray arguments and likely to be more efficient.
 void addAll(ParallelDoubleArray other)
          Equivalent to AsList.addAll but specialized for ParallelDoubleArray arguments and likely to be more efficient.
 ParallelDoubleArray all()
          Returns a new ParallelDoubleArray holding all elements
 ParallelDoubleArray allUniqueElements()
          Returns a new ParallelDoubleArray containing only the unique elements of this array (that is, without any duplicates).
 void apply(Ops.DoubleProcedure procedure)
          Applies the given procedure to elements
 java.util.List<java.lang.Double> asList()
          Returns a view of this ParallelDoubleArray as a List.
 int binarySearch(double target)
          Assuming this array is sorted, returns the index of an element equal to given target, or -1 if not present.
 int binarySearch(double target, Ops.DoubleComparator comparator)
          Assuming this array is sorted with respect to the given comparator, returns the index of an element equal to given target, or -1 if not present.
 ParallelDoubleArray combine(double[] other, Ops.DoubleReducer combiner)
          Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.
<U,V> ParallelDoubleArray
combine(ParallelDoubleArray.WithBounds other, Ops.DoubleReducer combiner)
          Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.
<U,V> ParallelDoubleArray
combine(ParallelDoubleArray other, Ops.DoubleReducer combiner)
          Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.
static ParallelDoubleArray create(int size, ForkJoinExecutor executor)
          Creates a new ParallelDoubleArray using the given executor and an array of the given size
static ParallelDoubleArray createEmpty(int size, ForkJoinExecutor executor)
          Creates a new ParallelDoubleArray using the given executor and an array of the given size, but with an initial effective size of zero, enabling incremental insertion via asList() operations.
static ParallelDoubleArray createFromCopy(double[] source, ForkJoinExecutor executor)
          Creates a new ParallelDoubleArray using the given executor and initially holding copies of the given source elements.
static ParallelDoubleArray createFromCopy(int size, double[] source, ForkJoinExecutor executor)
          Creates a new ParallelDoubleArray using an array of the given size, initially holding copies of the given source truncated or padded with zeros to obtain the specified length.
static ParallelDoubleArray createUsingHandoff(double[] handoff, ForkJoinExecutor executor)
          Creates a new ParallelDoubleArray initially using the given array and executor.
 void cumulate(Ops.DoubleReducer reducer, double base)
          Replaces each element with the running cumulation of applying the given reducer.
 void cumulateSum()
          Replaces each element with the running sum
static ForkJoinExecutor defaultExecutor()
          Returns a common default executor for use in ParallelArrays.
 double get(int i)
          Returns the element of the array at the given index
 double[] getArray()
          Returns the underlying array used for computations
 ForkJoinExecutor getExecutor()
          Returns the executor used for computations
 int indexOf(double target)
          Returns the index of some element equal to given target, or -1 if not present
 java.util.Iterator<java.lang.Double> iterator()
          Returns an iterator stepping through each element of the array up to the current limit.
 double max()
          Returns the maximum element, or -Double.MAX_VALUE if empty
 double max(Ops.DoubleComparator comparator)
          Returns the maximum element, or -Double.MAX_VALUE if empty
 double min()
          Returns the minimum element, or Double.MAX_VALUE if empty,
 double min(Ops.DoubleComparator comparator)
          Returns the minimum element, or Double.MAX_VALUE if empty
 double precumulate(Ops.DoubleReducer reducer, double base)
          Replaces each element with the cumulation of applying the given reducer to all previous values, and returns the total reduction.
 double precumulateSum()
          Replaces each element with its prefix sum
 double reduce(Ops.DoubleReducer reducer, double base)
          Returns reduction of elements
 void removeConsecutiveDuplicates()
          Removes consecutive elements that are equal, shifting others leftward, and possibly decreasing size.
 void replaceWithCombination(double[] other, Ops.DoubleReducer combiner)
          Replaces elements with results of applying combine(thisElement, otherElement)
 void replaceWithCombination(ParallelDoubleArray.WithBounds other, Ops.DoubleReducer combiner)
          Replaces elements with results of applying combine(thisElement, otherElement)
 void replaceWithCombination(ParallelDoubleArray other, Ops.DoubleReducer combiner)
          Replaces elements with results of applying combine(thisElement, otherElement)
 void replaceWithGeneratedValue(Ops.DoubleGenerator generator)
          Replaces elements with the results of applying the given generator.
 void replaceWithMappedIndex(Ops.MapperFromIntToDouble mapper)
          Replaces elements with the results of applying the given mapper to their indices.
 void replaceWithTransform(Ops.DoubleMapper mapper)
          Replaces elements with the results of applying the given mapper to their current values.
 void replaceWithValue(double value)
          Replaces elements with the given value.
 void set(int i, double x)
          Sets the element of the array at the given index to the given value
 void setLimit(int newLimit)
          Ensures that the underlying array can be accessed up to the given upper bound, reallocating and copying the underlying array to expand if necessary.
 int size()
          Returns the effective size of the underlying array.
 void sort()
          Sorts the array, assuming all elements are Comparable.
 void sort(Ops.DoubleComparator comparator)
          Sorts the array.
 double sum()
          Returns the sum of elements
 ParallelDoubleArray.SummaryStatistics summary()
          Returns summary statistics, using natural comparator
 ParallelDoubleArray.SummaryStatistics summary(Ops.DoubleComparator comparator)
          Returns summary statistics, using the given comparator to locate minimum and maximum elements.
 java.lang.String toString()
          Equivalent to asList().toString()
 ParallelDoubleArray.WithBounds withBounds(int firstIndex, int upperBound)
          Returns an operation prefix that causes a method to operate only on the elements of the array between firstIndex (inclusive) and upperBound (exclusive).
 ParallelDoubleArray.WithFilter withFilter(Ops.DoublePredicate selector)
          Returns an operation prefix that causes a method to operate only on the elements of the array for which the given selector returns true
 ParallelDoubleArray.WithDoubleMapping withMapping(Ops.DoubleMapper mapper)
          Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.
<U> ParallelDoubleArray.WithMapping<U>
withMapping(Ops.MapperFromDouble<? extends U> mapper)
          Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.
 ParallelDoubleArray.WithLongMapping withMapping(Ops.MapperFromDoubleToLong mapper)
          Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

ParallelDoubleArray

protected ParallelDoubleArray(ForkJoinExecutor executor,
                              double[] array,
                              int limit)
Constructor for use by subclasses to create a new ParallelDoubleArray using the given executor, and initially using the supplied array, with effective size bound by the given limit. This constructor is designed to enable extensions via subclassing. To create a ParallelDoubleArray, use create(int, jsr166y.forkjoin.ForkJoinExecutor), createEmpty(int, jsr166y.forkjoin.ForkJoinExecutor), createUsingHandoff(double[], jsr166y.forkjoin.ForkJoinExecutor) or createFromCopy(double[], jsr166y.forkjoin.ForkJoinExecutor).

Parameters:
executor - the executor
array - the array
limit - the upper bound limit
Method Detail

defaultExecutor

public static ForkJoinExecutor defaultExecutor()
Returns a common default executor for use in ParallelArrays. This executor arranges enough parallelism to use most, but not necessarily all, of the avaliable processors on this system.

Returns:
the executor

create

public static ParallelDoubleArray create(int size,
                                         ForkJoinExecutor executor)
Creates a new ParallelDoubleArray using the given executor and an array of the given size

Parameters:
size - the array size
executor - the executor

createUsingHandoff

public static ParallelDoubleArray createUsingHandoff(double[] handoff,
                                                     ForkJoinExecutor executor)
Creates a new ParallelDoubleArray initially using the given array and executor. In general, the handed off array should not be used for other purposes once constructing this ParallelDoubleArray. The given array may be internally replaced by another array in the course of methods that add or remove elements.

Parameters:
handoff - the array
executor - the executor

createFromCopy

public static ParallelDoubleArray createFromCopy(double[] source,
                                                 ForkJoinExecutor executor)
Creates a new ParallelDoubleArray using the given executor and initially holding copies of the given source elements.

Parameters:
source - the source of initial elements
executor - the executor

createFromCopy

public static ParallelDoubleArray createFromCopy(int size,
                                                 double[] source,
                                                 ForkJoinExecutor executor)
Creates a new ParallelDoubleArray using an array of the given size, initially holding copies of the given source truncated or padded with zeros to obtain the specified length.

Parameters:
source - the source of initial elements
size - the array size
executor - the executor

createEmpty

public static ParallelDoubleArray createEmpty(int size,
                                              ForkJoinExecutor executor)
Creates a new ParallelDoubleArray using the given executor and an array of the given size, but with an initial effective size of zero, enabling incremental insertion via asList() operations.

Parameters:
size - the array size
executor - the executor

getExecutor

public ForkJoinExecutor getExecutor()
Returns the executor used for computations

Returns:
the executor

apply

public void apply(Ops.DoubleProcedure procedure)
Applies the given procedure to elements

Parameters:
procedure - the procedure

reduce

public double reduce(Ops.DoubleReducer reducer,
                     double base)
Returns reduction of elements

Parameters:
reducer - the reducer
base - the result for an empty array
Returns:
reduction

all

public ParallelDoubleArray all()
Returns a new ParallelDoubleArray holding all elements

Returns:
a new ParallelDoubleArray holding all elements

combine

public ParallelDoubleArray combine(double[] other,
                                   Ops.DoubleReducer combiner)
Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.

Parameters:
other - the other array
combiner - the combiner
Returns:
the array of mappings
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other array is shorter than this array.

combine

public <U,V> ParallelDoubleArray combine(ParallelDoubleArray other,
                                         Ops.DoubleReducer combiner)
Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.

Parameters:
other - the other array
combiner - the combiner
Returns:
the array of mappings
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other array is not the same length as this array.

combine

public <U,V> ParallelDoubleArray combine(ParallelDoubleArray.WithBounds other,
                                         Ops.DoubleReducer combiner)
Returns a ParallelDoubleArray containing results of applying combine(thisElement, otherElement) for each element.

Parameters:
other - the other array segment
combiner - the combiner
Returns:
the array of mappings
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other segment is shorter than this array.

replaceWithTransform

public void replaceWithTransform(Ops.DoubleMapper mapper)
Replaces elements with the results of applying the given mapper to their current values.

Parameters:
mapper - the mapper

replaceWithMappedIndex

public void replaceWithMappedIndex(Ops.MapperFromIntToDouble mapper)
Replaces elements with the results of applying the given mapper to their indices.

Parameters:
mapper - the mapper

replaceWithGeneratedValue

public void replaceWithGeneratedValue(Ops.DoubleGenerator generator)
Replaces elements with the results of applying the given generator. For example, to fill the array with uniform random values, use replaceWithGeneratedValue(Ops.doubleRandom())

Parameters:
generator - the generator

replaceWithValue

public void replaceWithValue(double value)
Replaces elements with the given value.

Parameters:
value - the value

replaceWithCombination

public void replaceWithCombination(ParallelDoubleArray other,
                                   Ops.DoubleReducer combiner)
Replaces elements with results of applying combine(thisElement, otherElement)

Parameters:
other - the other array
combiner - the combiner
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other array has fewer elements than this array.

replaceWithCombination

public void replaceWithCombination(double[] other,
                                   Ops.DoubleReducer combiner)
Replaces elements with results of applying combine(thisElement, otherElement)

Parameters:
other - the other array
combiner - the combiner
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other array has fewer elements than this array.

replaceWithCombination

public void replaceWithCombination(ParallelDoubleArray.WithBounds other,
                                   Ops.DoubleReducer combiner)
Replaces elements with results of applying combine(thisElement, otherElement)

Parameters:
other - the other array segment
combiner - the combiner
Throws:
java.lang.ArrayIndexOutOfBoundsException - if other segment has fewer elements.than this array,

indexOf

public int indexOf(double target)
Returns the index of some element equal to given target, or -1 if not present

Parameters:
target - the element to search for
Returns:
the index or -1 if not present

binarySearch

public int binarySearch(double target)
Assuming this array is sorted, returns the index of an element equal to given target, or -1 if not present. If the array is not sorted, the results are undefined.

Parameters:
target - the element to search for
Returns:
the index or -1 if not present

binarySearch

public int binarySearch(double target,
                        Ops.DoubleComparator comparator)
Assuming this array is sorted with respect to the given comparator, returns the index of an element equal to given target, or -1 if not present. If the array is not sorted, the results are undefined.

Parameters:
target - the element to search for
comparator - the comparator
Returns:
the index or -1 if not present

summary

public ParallelDoubleArray.SummaryStatistics summary(Ops.DoubleComparator comparator)
Returns summary statistics, using the given comparator to locate minimum and maximum elements.

Parameters:
comparator - the comparator to use for locating minimum and maximum elements
Returns:
the summary.

summary

public ParallelDoubleArray.SummaryStatistics summary()
Returns summary statistics, using natural comparator

Returns:
the summary.

min

public double min(Ops.DoubleComparator comparator)
Returns the minimum element, or Double.MAX_VALUE if empty

Parameters:
comparator - the comparator
Returns:
minimum element, or Double.MAX_VALUE if empty

min

public double min()
Returns the minimum element, or Double.MAX_VALUE if empty,

Returns:
minimum element, or Double.MAX_VALUE if empty

max

public double max(Ops.DoubleComparator comparator)
Returns the maximum element, or -Double.MAX_VALUE if empty

Parameters:
comparator - the comparator
Returns:
maximum element, or -Double.MAX_VALUE if empty

max

public double max()
Returns the maximum element, or -Double.MAX_VALUE if empty

Returns:
maximum element, or -Double.MAX_VALUE if empty

cumulate

public void cumulate(Ops.DoubleReducer reducer,
                     double base)
Replaces each element with the running cumulation of applying the given reducer. For example, if the contents are the numbers 1, 2, 3, and the reducer operation adds numbers, then after invocation of this method, the contents would be 1, 3, 6 (that is, 1, 1+2, 1+2+3);

Parameters:
reducer - the reducer
base - the result for an empty array

precumulate

public double precumulate(Ops.DoubleReducer reducer,
                          double base)
Replaces each element with the cumulation of applying the given reducer to all previous values, and returns the total reduction. For example, if the contents are the numbers 1, 2, 3, and the reducer operation adds numbers, then after invocation of this method, the contents would be 0, 1, 3 (that is, 0, 0+1, 0+1+2, and the return value would be 6 (that is, 1+2+3);

Parameters:
reducer - the reducer
base - the result for an empty array
Returns:
the total reduction

sort

public void sort(Ops.DoubleComparator comparator)
Sorts the array. Unlike Arrays.sort, this sort does not guarantee that elements with equal keys maintain their relative position in the array.

Parameters:
comparator - the comparator to use

sort

public void sort()
Sorts the array, assuming all elements are Comparable. Unlike Arrays.sort, this sort does not guarantee that elements with equal keys maintain their relative position in the array.

Throws:
java.lang.ClassCastException - if any element is not Comparable.

removeConsecutiveDuplicates

public void removeConsecutiveDuplicates()
Removes consecutive elements that are equal, shifting others leftward, and possibly decreasing size. This method may be used after sorting to ensure that this ParallelDoubleArray contains a set of unique elements.


allUniqueElements

public ParallelDoubleArray allUniqueElements()
Returns a new ParallelDoubleArray containing only the unique elements of this array (that is, without any duplicates).

Returns:
the new ParallelDoubleArray

sum

public double sum()
Returns the sum of elements

Returns:
the sum of elements

cumulateSum

public void cumulateSum()
Replaces each element with the running sum


precumulateSum

public double precumulateSum()
Replaces each element with its prefix sum

Returns:
the total sum

withBounds

public ParallelDoubleArray.WithBounds withBounds(int firstIndex,
                                                 int upperBound)
Returns an operation prefix that causes a method to operate only on the elements of the array between firstIndex (inclusive) and upperBound (exclusive).

Parameters:
firstIndex - the lower bound (inclusive)
upperBound - the upper bound (exclusive)
Returns:
operation prefix

withFilter

public ParallelDoubleArray.WithFilter withFilter(Ops.DoublePredicate selector)
Returns an operation prefix that causes a method to operate only on the elements of the array for which the given selector returns true

Parameters:
selector - the selector
Returns:
operation prefix

withMapping

public <U> ParallelDoubleArray.WithMapping<U> withMapping(Ops.MapperFromDouble<? extends U> mapper)
Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.

Parameters:
mapper - the mapper
Returns:
operation prefix

withMapping

public ParallelDoubleArray.WithDoubleMapping withMapping(Ops.DoubleMapper mapper)
Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.

Parameters:
mapper - the mapper
Returns:
operation prefix

withMapping

public ParallelDoubleArray.WithLongMapping withMapping(Ops.MapperFromDoubleToLong mapper)
Returns an operation prefix that causes a method to operate on mapped elements of the array using the given mapper.

Parameters:
mapper - the mapper
Returns:
operation prefix

iterator

public java.util.Iterator<java.lang.Double> iterator()
Returns an iterator stepping through each element of the array up to the current limit. This iterator does not support the remove operation. However, a full ListIterator supporting add, remove, and set operations is available via asList().

Returns:
an iterator stepping through each element.

asList

public java.util.List<java.lang.Double> asList()
Returns a view of this ParallelDoubleArray as a List. This List has the same structural and performance characteristics as ArrayList, and may be used to modify, replace or extend the bounds of the array underlying this ParallelDoubleArray. The methods supported by this list view are not in general implemented as parallel operations. This list is also not itself thread-safe. In particular, performing list updates while other parallel operations are in progress has undefined (and surely undesired) effects.

Returns:
a list view

size

public int size()
Returns the effective size of the underlying array. The effective size is the current limit, if used (see setLimit(int)), or the length of the array otherwise.

Returns:
the effective size of array

getArray

public double[] getArray()
Returns the underlying array used for computations

Returns:
the array

get

public double get(int i)
Returns the element of the array at the given index

Parameters:
i - the index
Returns:
the element of the array at the given index

set

public void set(int i,
                double x)
Sets the element of the array at the given index to the given value

Parameters:
i - the index
x - the value

toString

public java.lang.String toString()
Equivalent to asList().toString()

Overrides:
toString in class java.lang.Object
Returns:
a string representation

addAll

public void addAll(double[] other)
Equivalent to AsList.addAll but specialized for array arguments and likely to be more efficient.

Parameters:
other - the elements to add

addAll

public void addAll(ParallelDoubleArray other)
Equivalent to AsList.addAll but specialized for ParallelDoubleArray arguments and likely to be more efficient.

Parameters:
other - the elements to add

addAll

public void addAll(ParallelDoubleArray.WithBounds other)
Equivalent to AsList.addAll but specialized for ParallelDoubleArray arguments and likely to be more efficient.

Parameters:
other - the elements to add

setLimit

public final void setLimit(int newLimit)
Ensures that the underlying array can be accessed up to the given upper bound, reallocating and copying the underlying array to expand if necessary. Or, if the given limit is less than the length of the underlying array, causes computations to ignore elements past the given limit.

Parameters:
newLimit - the new upper bound
Throws:
java.lang.IllegalArgumentException - if newLimit less than zero.