use approx::assert_abs_diff_eq;
use rustpython_vm::Interpreter;
fn rumpy_interp() -> Interpreter {
let b = Interpreter::builder(Default::default());
let def = rumpy::module_def(&b.ctx);
b.add_native_module(def).build()
}
#[test]
fn large_sum_axis_correct() {
let interp = rumpy_interp();
let r = interp.enter(|vm| -> rustpython_vm::PyResult<f64> {
let scope = vm.new_scope_with_builtins();
let src = r#"
import numpy as np
a = np.arange(10000.0).reshape(100, 100)
result = float(a.sum(axis=1).sum())
"#;
let code = vm
.compile(src, rustpython_vm::compiler::Mode::Exec, "<t>".into())
.map_err(|e| vm.new_syntax_error(&e, Some(src)))?;
vm.run_code_obj(code, scope.clone())?;
let r = scope.globals.get_item("result", vm).unwrap();
Ok(r.try_float(vm)?.to_f64())
});
let r = r.expect("rumpy");
assert_abs_diff_eq!(r, 49995000.0, epsilon = 1.0);
}
#[test]
fn large_binary_op_same_dtype_no_clone() {
let interp = rumpy_interp();
let r = interp.enter(|vm| -> rustpython_vm::PyResult<f64> {
let scope = vm.new_scope_with_builtins();
let src = r#"
import numpy as np
a = np.arange(50000.0)
b = np.arange(50000.0)
c = a + b
result = float(c.sum())
"#;
let code = vm
.compile(src, rustpython_vm::compiler::Mode::Exec, "<t>".into())
.map_err(|e| vm.new_syntax_error(&e, Some(src)))?;
vm.run_code_obj(code, scope.clone())?;
let r = scope.globals.get_item("result", vm).unwrap();
Ok(r.try_float(vm)?.to_f64())
});
let r = r.expect("rumpy");
assert_abs_diff_eq!(r, 2_499_950_000.0, epsilon = 100.0);
}
#[test]
fn cumsum_axis_correct_on_2d() {
let interp = rumpy_interp();
let r = interp.enter(|vm| -> rustpython_vm::PyResult<f64> {
let scope = vm.new_scope_with_builtins();
let src = r#"
import numpy as np
a = np.arange(2500.0).reshape(50, 50)
result = float(np.cumsum(a, axis=1).sum())
"#;
let code = vm
.compile(src, rustpython_vm::compiler::Mode::Exec, "<t>".into())
.map_err(|e| vm.new_syntax_error(&e, Some(src)))?;
vm.run_code_obj(code, scope.clone())?;
let r = scope.globals.get_item("result", vm).unwrap();
Ok(r.try_float(vm)?.to_f64())
});
let r = r.expect("rumpy");
assert_abs_diff_eq!(r, 79_135_000.0, epsilon = 1.0);
}