Skip to content

Commit

Permalink
feat(radon): include empty median in RADON
Browse files Browse the repository at this point in the history
  • Loading branch information
lrubiorod committed Aug 30, 2021
1 parent a87a52c commit a1785c4
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 16 deletions.
14 changes: 9 additions & 5 deletions rad/src/operators/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ pub fn count(input: &RadonArray) -> RadonInteger {
RadonInteger::from(input.value().len() as i128)
}

pub fn reduce(input: &RadonArray, args: &[Value]) -> Result<RadonTypes, RadError> {
pub fn reduce(
input: &RadonArray,
args: &[Value],
context: &mut ReportContext<RadonTypes>,
) -> Result<RadonTypes, RadError> {
let wrong_args = || RadError::WrongArguments {
input_type: RadonArray::radon_type_name(),
operator: "Reduce".to_string(),
Expand All @@ -39,7 +43,7 @@ pub fn reduce(input: &RadonArray, args: &[Value]) -> Result<RadonTypes, RadError
let reducer_integer = from_value::<u8>(arg).map_err(|_| wrong_args())?;
let reducer_code = RadonReducers::try_from(reducer_integer).map_err(|_| wrong_args())?;

reducers::reduce(input, reducer_code)
reducers::reduce(input, reducer_code, context)
}

pub fn get(input: &RadonArray, args: &[Value]) -> Result<RadonTypes, RadError> {
Expand Down Expand Up @@ -395,7 +399,7 @@ mod tests {
]);
let args = &[];

let result = reduce(input, args);
let result = reduce(input, args, &mut ReportContext::default());

assert_eq!(
&result.unwrap_err().to_string(),
Expand All @@ -411,7 +415,7 @@ mod tests {
]);
let args = &[Value::Text(String::from("wrong"))]; // This is RadonReducers::AverageMean

let result = reduce(input, args);
let result = reduce(input, args, &mut ReportContext::default());

assert_eq!(
&result.unwrap_err().to_string(),
Expand All @@ -427,7 +431,7 @@ mod tests {
]);
let args = &[Value::Integer(-1)]; // This doesn't match any reducer code in RadonReducers

let result = reduce(input, args);
let result = reduce(input, args, &mut ReportContext::default());

assert_eq!(
&result.unwrap_err().to_string(),
Expand Down
22 changes: 14 additions & 8 deletions rad/src/reducers/average.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,11 @@ pub fn mean(input: &RadonArray, return_policy: MeanReturnPolicy) -> Result<Radon
}
}

pub fn median(_input: &RadonArray) -> Result<RadonTypes, RadError> {
// TODO: implement
Ok(RadonTypes::Array(RadonArray::from(vec![])))
}

#[cfg(test)]
mod tests {
use serde_cbor::Value;
Expand All @@ -135,6 +140,7 @@ mod tests {
};

use super::*;
use witnet_data_structures::radon_report::ReportContext;

#[test]
fn test_reduce_average_mean_float() {
Expand All @@ -145,7 +151,7 @@ mod tests {
let args = &[Value::Integer(RadonReducers::AverageMean as i128)];
let expected = RadonTypes::from(RadonFloat::from(1.5f64));

let output = reduce(input, args).unwrap();
let output = reduce(input, args, &mut ReportContext::default()).unwrap();

assert_eq!(output, expected);
}
Expand All @@ -168,7 +174,7 @@ mod tests {
]));

let args = &[Value::Integer(0x03)]; // This is RadonReducers::AverageMean
let output = reduce(&input, args).unwrap();
let output = reduce(&input, args, &mut ReportContext::default()).unwrap();

assert_eq!(output, expected);
}
Expand All @@ -193,7 +199,7 @@ mod tests {
};

let args = &[Value::Integer(0x03)]; // This is RadonReducers::AverageMean
let output = reduce(&input, args).unwrap_err();
let output = reduce(&input, args, &mut ReportContext::default()).unwrap_err();

assert_eq!(output, expected);
}
Expand Down Expand Up @@ -244,7 +250,7 @@ mod tests {
let expected = RadonTypes::from(RadonArray::from(vec![array_e1, array_e2, array_e3]));

let args = &[Value::Integer(0x03)]; // This is RadonReducers::AverageMean
let output = reduce(&input, args).unwrap();
let output = reduce(&input, args, &mut ReportContext::default()).unwrap();

assert_eq!(output, expected);
}
Expand All @@ -265,7 +271,7 @@ mod tests {
let args = &[Value::Integer(RadonReducers::AverageMean as i128)];
let expected = RadonTypes::Integer(RadonInteger::from(2));

let output = reduce(input, args).unwrap();
let output = reduce(input, args, &mut ReportContext::default()).unwrap();

assert_eq!(output, expected);
}
Expand All @@ -288,7 +294,7 @@ mod tests {
]));

let args = &[Value::Integer(RadonReducers::AverageMean as i128)];
let output = reduce(&input, args).unwrap();
let output = reduce(&input, args, &mut ReportContext::default()).unwrap();

assert_eq!(output, expected);
}
Expand All @@ -300,7 +306,7 @@ mod tests {
RadonString::from("world").into(),
]);
let args = &[Value::Integer(0x03)]; // This is RadonReducers::AverageMean
let output = reduce(input, args).unwrap_err();
let output = reduce(input, args, &mut ReportContext::default()).unwrap_err();

let expected = RadError::UnsupportedReducer {
array: input.clone(),
Expand Down Expand Up @@ -329,7 +335,7 @@ mod tests {
};

let args = &[Value::Integer(0x03)]; // This is RadonReducers::AverageMean
let output = reduce(&input, args).unwrap_err();
let output = reduce(&input, args, &mut ReportContext::default()).unwrap_err();

assert_eq!(output, expected);
}
Expand Down
13 changes: 11 additions & 2 deletions rad/src/reducers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use crate::{
error::RadError,
types::{array::RadonArray, RadonType, RadonTypes},
};
use witnet_data_structures::radon_report::ReportContext;

pub mod average;
pub mod deviation;
Expand All @@ -17,13 +18,13 @@ pub enum RadonReducers {
// Implemented
Mode = 0x02,
AverageMean = 0x03,
AverageMedian = 0x05,
DeviationStandard = 0x07,

// Not implemented
Min = 0x00,
Max = 0x01,
AverageMeanWeighted = 0x04,
AverageMedian = 0x05,
AverageMedianWeighted = 0x06,
DeviationAverageAbsolute = 0x08,
DeviationMedianAbsolute = 0x09,
Expand All @@ -36,7 +37,11 @@ impl fmt::Display for RadonReducers {
}
}

pub fn reduce(input: &RadonArray, reducer_code: RadonReducers) -> Result<RadonTypes, RadError> {
pub fn reduce(
input: &RadonArray,
reducer_code: RadonReducers,
context: &mut ReportContext<RadonTypes>,
) -> Result<RadonTypes, RadError> {
let error = || {
Err(RadError::UnsupportedReducer {
array: input.clone(),
Expand All @@ -51,6 +56,10 @@ pub fn reduce(input: &RadonArray, reducer_code: RadonReducers) -> Result<RadonTy
}
RadonReducers::Mode => mode::mode(input),
RadonReducers::DeviationStandard => deviation::standard(input),
RadonReducers::AverageMedian => match &context.active_wips {
Some(active_wips) if active_wips.wip0017() => average::median(input),
_ => error(),
},
_ => error(),
}
} else {
Expand Down
5 changes: 4 additions & 1 deletion rad/src/types/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ impl Operable for RadonArray {
array_operators::map(self, args.as_slice(), &mut ReportContext::default())
}
(RadonOpCodes::ArrayReduce, Some(args)) => {
array_operators::reduce(self, args.as_slice())
array_operators::reduce(self, args.as_slice(), &mut ReportContext::default())
}
(RadonOpCodes::ArraySort, Some(args)) => {
array_operators::sort(self, args.as_slice(), &mut ReportContext::default())
Expand All @@ -175,6 +175,9 @@ impl Operable for RadonArray {
(RadonOpCodes::ArrayMap, Some(args)) => {
array_operators::map(self, args.as_slice(), context)
}
(RadonOpCodes::ArrayReduce, Some(args)) => {
array_operators::reduce(self, args.as_slice(), context)
}
(RadonOpCodes::ArraySort, Some(args)) => {
array_operators::sort(self, args.as_slice(), context)
}
Expand Down

0 comments on commit a1785c4

Please sign in to comment.