pub struct Division { /* private fields */ }Expand description
CompressedDivision is a compressed representation of a data points in sliding window. It is used to reduce the gas cost of storing, retriving & cleaning up data points in sliding window.
The structure of the compression is as follows:
§======= CompressedSMADivision =======
| |
| . latest_value |
^ started_at ^ updated_at ^ ended_at[1]
|████████████████ |
| ^ integral = sum(value * elapsed_time) til latest update
———————————––> time
It is a lossy compression of the data points in the window, it keeps the integral of the data points until latest update of the division, which is enough to calculate the average of the data points in the window. But the average will become approximate once the window edge is within the integral region (before latest update of the division).
[1] ended_at is not defined in the struct because it can be calculated by started_at + division_size
where division_size is defined at the CompressedSMALimiter
Implementations§
Source§impl Division
impl Division
pub fn new( started_at: Timestamp, updated_at: Timestamp, value: Decimal, prev_value: Decimal, ) -> Result<Self, TransmuterMathError>
pub fn unchecked_new( started_at: Timestamp, updated_at: Timestamp, latest_value: Decimal, integral: Decimal, ) -> Self
pub fn update( &self, updated_at: Timestamp, value: Decimal, ) -> Result<Self, TransmuterMathError>
pub fn is_outdated( &self, block_time: Timestamp, window_size: Uint64, division_size: Uint64, ) -> Result<bool, TransmuterMathError>
pub fn elapsed_time( &self, block_time: Timestamp, ) -> Result<Uint64, TransmuterMathError>
pub fn ended_at( &self, division_size: Uint64, ) -> Result<Uint64, TransmuterMathError>
Sourcepub fn next_started_at(
&self,
division_size: Uint64,
block_time: Timestamp,
) -> Result<Timestamp, TransmuterMathError>
pub fn next_started_at( &self, division_size: Uint64, block_time: Timestamp, ) -> Result<Timestamp, TransmuterMathError>
Find the next started_at time based on the division size.
In the following graphic, each division is division_size long.
| self | | | | ^ block_time ^ next_started_at
Sourcepub fn compressed_moving_average(
latest_removed_division: Option<Self>,
divisions: &[Division],
division_size: Uint64,
window_size: Uint64,
block_time: Timestamp,
) -> Result<Decimal, TransmuterMathError>
pub fn compressed_moving_average( latest_removed_division: Option<Self>, divisions: &[Division], division_size: Uint64, window_size: Uint64, block_time: Timestamp, ) -> Result<Decimal, TransmuterMathError>
This function calculates the arithmatic mean of the divisions in a specified window
The window is defined by the window_size and division_size
The calculation is done by accumulating the sum of value * elapsed_time (integral) then divide by the total elapsed time (integral range)
As this is CompressionDivision, not all the data points in the window is stored for gas optimization
When the window covers portion of the first division, it needs to readjust the integral
based on how far the window start time eats in to the first division proportionally.
§Assumptions
- Divisions are sorted by started_at
- Last division’s updated_at is less than block_time
- All divisions are within the window or at least overlap with the window
- All divisions are of the same size
The above assumptions are guaranteed by the CompressedSMALimiter
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Division
impl<'de> Deserialize<'de> for Division
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for Division
impl JsonSchema for Division
Source§fn schema_name() -> String
fn schema_name() -> String
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn is_referenceable() -> bool
fn is_referenceable() -> bool
$ref keyword. Read more