Package io.deephaven.base.ringbuffer
Class AggregatingDoubleRingBuffer
java.lang.Object
io.deephaven.base.ringbuffer.AggregatingDoubleRingBuffer
A ring buffer which aggregates its contents according to a user-defined aggregation function. This aggregation
calculation is performed lazily, when the user calls evaluate(). Internally the class manages a tree of intermediate
aggregation values. This allows the class to efficiently update the final aggregated value when entries enter and
leave the buffer, without necessarily running the calculation over the whole buffer.
-
Nested Class Summary
-
Constructor Summary
ConstructorDescriptionAggregatingDoubleRingBuffer
(int capacity, double identityVal, @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggFunction) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function.AggregatingDoubleRingBuffer
(int capacity, double identityVal, @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggTreeFunction, @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggInitialFunction) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function.AggregatingDoubleRingBuffer
(int capacity, double identityVal, @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggTreeFunction, @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggInitialFunction, boolean growable) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function. -
Method Summary
Modifier and TypeMethodDescriptionvoid
add
(double e) Adds an entry to the ring buffer.void
Adds the identity element to the ring buffer.double
addOverwrite
(double e, double notFullResult) Adds an entry to the ring buffer.void
addUnsafe
(double e) Adds a value without overflow detection.double
back()
Returns the element at the tail of the ring bufferint
capacity()
void
clear()
Removes all elements from the ring buffer and resets the data structure.double
element()
Returns the element at the head of the ring buffer if the ring buffer is non-empty.void
ensureRemaining
(int count) Ensures that there is sufficient empty space to storecount
additional items in the buffer.double
evaluate()
Return the result of aggregation function applied to the contents of the aggregating ring buffer.double
front()
Returns the element at the head of the ring bufferdouble
front
(int offset) Returns the element at the specified offset from the head in the ring buffer.double[]
getAll()
Returns an array containing all elements in the ring buffer.protected void
grow
(int increase) Increases the capacity of the aggregating ring buffer.boolean
isEmpty()
boolean
isFull()
boolean
offer
(double e) Attempts to add an entry to the ring buffer.double
peek
(double onEmpty) Returns the element at the head of the ring buffer if the ring buffer is non-empty.double
peekBack
(double onEmpty) Returns the element at the tail of the ring buffer if the ring buffer is non-empty.double
poll
(double onEmpty) Removes the element at the head of the ring buffer if the ring buffer is non-empty.int
double
remove()
Removes one element from the head of the ring buffer.double[]
remove
(int count) Removes multiple elements from the front of the ring buffer and returns the items as an array.double
Removes an element without empty buffer detection.int
size()
-
Constructor Details
-
AggregatingDoubleRingBuffer
public AggregatingDoubleRingBuffer(int capacity, double identityVal, @NotNull @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggFunction) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function. This aggregation calculation is performed lazily, when the user calls evaluate(). Internally the class manages a tree of intermediate aggregation values. This allows the class to efficiently update the final aggregated value when entries enter and leave the buffer, without necessarily running the calculation over the whole buffer.The buffer expands its capacity as needed, employing a capacity-doubling strategy. However, note that the data structure never gives back storage: i.e. its capacity never shrinks.
- Parameters:
capacity
- the minimum size for the structure to holdidentityVal
- The identity value associated with the aggregation function. This is a value e that satisfies f(x,e) == x and f(e,x) == x for all x. For example, for the AggregatingFloatRingBuffer, if the aggFunction is addition, multiplication, Math.min, or Math.max, the corresponding identity values would be 0.0f, 1.0f, Float.MAX_VALUE, and -Float.MAX_VALUE respectively.aggFunction
- A function used to aggregate the data in the ring buffer. The function must be associative: that is it must satisfy f(f(a, b), c) == f(a, f(b, c)). For example, addition is associative, because (a + b) + c == a + (b + c). Some examples of associative functions are addition, multiplication, Math.min(), and Math.max(). This data structure maintains a tree of partially-evaluated subranges of the data, combining them efficiently whenever the data changes.
-
AggregatingDoubleRingBuffer
public AggregatingDoubleRingBuffer(int capacity, double identityVal, @NotNull @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggTreeFunction, @NotNull @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggInitialFunction) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function. This aggregation calculation is performed lazily, when the user calls evaluate(). Internally the class manages a tree of intermediate aggregation values. This allows the class to efficiently update the final aggregated value when entries enter and leave the buffer, without necessarily running the calculation over the whole buffer.The buffer expands its capacity as needed, employing a capacity-doubling strategy. However, note that the data structure never gives back storage: i.e. its capacity never shrinks.
- Parameters:
capacity
- the minimum size for the structure to holdidentityVal
- The identity value associated with the aggregation function. This is a value e that satisfies f(x,e) == x and f(e,x) == x for all x. For example, for the AggregatingFloatRingBuffer, if the aggFunction is addition, multiplication, Math.min, or Math.max, the corresponding identity values would be 0.0f, 1.0f, Float.MAX_VALUE, and -Float.MAX_VALUE respectively.aggTreeFunction
- A function used to aggregate the data in the ring buffer. The function must be associative: that is it must satisfy f(f(a, b), c) == f(a, f(b, c)). For example, addition is associative, because (a + b) + c == a + (b + c). Some examples of associative functions are addition, multiplication, Math.min(), and Math.max(). This data structure maintains a tree of partially-evaluated subranges of the data, combining them efficiently whenever the data changes.aggInitialFunction
- An associative function separate fromaggTreeFunction
to be applied only to the user-supplied values in the ring buffer. The results of this function will be populated into the tree for later evaluation byaggTreeFunction
. This function could be used to filter or translate data values at the leaf of the tree without affecting later computation.
-
AggregatingDoubleRingBuffer
public AggregatingDoubleRingBuffer(int capacity, double identityVal, @NotNull @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggTreeFunction, @NotNull @NotNull AggregatingDoubleRingBuffer.DoubleFunction aggInitialFunction, boolean growable) Creates a ring buffer for double values which aggregates its contents according to a user-defined aggregation function. This aggregation calculation is performed lazily, when the user calls evaluate(). Internally the class manages a tree of intermediate aggregation values. This allows the class to efficiently update the final aggregated value when entries enter and leave the buffer, without necessarily running the calculation over the whole buffer.If
growable = true
, the buffer expands its capacity as needed, employing a capacity-doubling strategy. However, note that the data structure never gives back storage: i.e. its capacity never shrinks.- Parameters:
capacity
- the minimum size for the structure to holdidentityVal
- The identity value associated with the aggregation function. This is a value e that satisfies f(x,e) == x and f(e,x) == x for all x. For example, for the AggregatingFloatRingBuffer, if the aggFunction is addition, multiplication, Math.min, or Math.max, the corresponding identity values would be 0.0f, 1.0f, Float.MAX_VALUE, and -Float.MAX_VALUE respectively.aggTreeFunction
- A function used to aggregate the data in the ring buffer. The function must be associative: that is it must satisfy f(f(a, b), c) == f(a, f(b, c)). For example, addition is associative, because (a + b) + c == a + (b + c). Some examples of associative functions are addition, multiplication, Math.min(), and Math.max(). This data structure maintains a tree of partially-evaluated subranges of the data, combining them efficiently whenever the data changes.aggInitialFunction
- An associative function separate fromaggTreeFunction
to be applied only to the user-supplied values in the ring buffer. The results of this function will be populated into the tree for later evaluation byaggTreeFunction
. This function could be used to filter or translate data values at the leaf of the tree without affecting later computation.growable
- whether to allow growth when the buffer is full.
-
-
Method Details
-
grow
protected void grow(int increase) Increases the capacity of the aggregating ring buffer.- Parameters:
increase
- Increase amount. The ring buffer's capacity will be increased by at least this amount.
-
isFull
public boolean isFull() -
isEmpty
public boolean isEmpty() -
size
public int size() -
capacity
public int capacity() -
remaining
public int remaining() -
add
public void add(double e) Adds an entry to the ring buffer. Throws an exception if buffer is full and growth is disabled. For a graceful failure, useoffer(double)
- Parameters:
e
- the double to be added to the buffer- Throws:
UnsupportedOperationException
- whengrowable
isfalse
and buffer is full
-
ensureRemaining
public void ensureRemaining(int count) Ensures that there is sufficient empty space to storecount
additional items in the buffer. If the buffer isgrowable
, this may result in an internal growth operation. This call should be used in conjunction withaddUnsafe(double)
.- Parameters:
count
- the minimum number of empty entries in the buffer after this call- Throws:
UnsupportedOperationException
- whengrowable
isfalse
and the buffer's available space is less thancount
-
addOverwrite
public double addOverwrite(double e, double notFullResult) Adds an entry to the ring buffer. If the buffer is full, overwrites the oldest entry with the new one.- Parameters:
e
- the double to be added to the buffernotFullResult
- value to return if the buffer is not full- Returns:
- the overwritten entry if the buffer is full, the provided value otherwise
-
offer
public boolean offer(double e) Attempts to add an entry to the ring buffer. If the buffer is full, the add fails and the buffer will not grow even if growable.- Parameters:
e
- the double to be added to the buffer- Returns:
- true if the value was added successfully, false otherwise
-
remove
public double remove()Removes one element from the head of the ring buffer.- Returns:
- The removed element if the ring buffer was non-empty
- Throws:
NoSuchElementException
- if the buffer is empty
-
poll
public double poll(double onEmpty) Removes the element at the head of the ring buffer if the ring buffer is non-empty. Otherwise returnsonEmpty
.- Parameters:
onEmpty
- the value to return if the ring buffer is empty- Returns:
- The removed element if the ring buffer was non-empty, otherwise the value of
onEmpty
.
-
element
public double element()Returns the element at the head of the ring buffer if the ring buffer is non-empty.- Returns:
- The head element if the ring buffer is non-empty
- Throws:
NoSuchElementException
- if the buffer is empty
-
peek
public double peek(double onEmpty) Returns the element at the head of the ring buffer if the ring buffer is non-empty. Otherwise returnsonEmpty
.- Parameters:
onEmpty
- the value to return if the ring buffer is empty- Returns:
- The head element if the ring buffer is non-empty
-
front
public double front()Returns the element at the head of the ring buffer- Returns:
- The element at the head of the ring buffer
- Throws:
NoSuchElementException
- if the buffer is empty
-
front
public double front(int offset) Returns the element at the specified offset from the head in the ring buffer.- Parameters:
offset
- The specified offset.- Returns:
- The element at the specified offset
- Throws:
NoSuchElementException
- if the buffer is empty
-
back
public double back()Returns the element at the tail of the ring buffer- Returns:
- The element at the tail of the ring buffer
- Throws:
NoSuchElementException
- if the buffer is empty
-
peekBack
public double peekBack(double onEmpty) Returns the element at the tail of the ring buffer if the ring buffer is non-empty. Otherwise returnsonEmpty
.- Parameters:
onEmpty
- the value to return if the ring buffer is empty- Returns:
- The element at the tail of the ring buffer, otherwise the value of
onEmpty
.
-
getAll
public double[] getAll()Returns an array containing all elements in the ring buffer.- Returns:
- An array containing a copy of the elements in the ring buffer.
-
addUnsafe
public void addUnsafe(double e) Adds a value without overflow detection. The caller must ensure that there is at least one element of free space in the ring buffer before calling this method. The caller may useensureRemaining(int)
orremaining()
for this purpose.- Parameters:
e
- the value to add to the buffer
-
addIdentityValue
public void addIdentityValue()Adds the identity element to the ring buffer. Throws an exception if the buffer is full and not growable.- Throws:
UnsupportedOperationException
- whengrowable
isfalse
and buffer is full
-
removeUnsafe
public double removeUnsafe()Removes an element without empty buffer detection. The caller must ensure that there is at least one element in the ring buffer. Thesize()
method may be used for this purpose.- Returns:
- the value removed from the buffer
-
remove
public double[] remove(int count) Removes multiple elements from the front of the ring buffer and returns the items as an array.- Parameters:
count
- The number of elements to remove.- Throws:
NoSuchElementException
- if the buffer is empty
-
clear
public void clear()Removes all elements from the ring buffer and resets the data structure. This may require resetting all entries in the storage buffer and evaluation tree and should be considered to be of complexity O(capacity) instead of O(size). -
evaluate
public double evaluate()Return the result of aggregation function applied to the contents of the aggregating ring buffer.- Returns:
- The result of (@code aggFunction()} applied to each value in the buffer
-