From 3598efbc3fd2fd3f7e9518263cc64aa661affde0 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Tue, 18 Jun 2024 20:38:39 +0300 Subject: [PATCH] plotters - ln from framework --- Cargo.lock | 26 +++++++-------- .../base/src/types/managed/basic/big_uint.rs | 13 ++++++-- .../types/managed/wrapped/managed_decimal.rs | 4 +++ tools/plotter/Cargo.toml | 3 +- tools/plotter/src/lib.rs | 4 ++- tools/plotter/src/logarithm.rs | 33 ++++++++++++++++--- tools/plotter/src/plot3d.rs | 2 +- tools/plotter/www/index.js | 8 +---- vm/src/tx_mock/blockchain_rng_unsupported.rs | 2 +- 9 files changed, 64 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5db0b7851..c0df51b5a8 100755 --- a/Cargo.lock +++ b/Cargo.lock @@ -2457,7 +2457,6 @@ version = "0.50.3" dependencies = [ "base64", "bech32", - "clap", "colored", "hex", "itertools", @@ -2473,7 +2472,6 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "tokio", "unwrap-infallible", ] @@ -3488,6 +3486,19 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "sc-plotter-wasm" +version = "0.1.0" +dependencies = [ + "multiversx-sc", + "multiversx-sc-scenario", + "plotters", + "plotters-canvas", + "wasm-bindgen", + "web-sys", + "wee_alloc", +] + [[package]] name = "scenario-tester" version = "0.0.0" @@ -4341,17 +4352,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "wasm-demo" -version = "0.1.0" -dependencies = [ - "plotters", - "plotters-canvas", - "wasm-bindgen", - "web-sys", - "wee_alloc", -] - [[package]] name = "wasmparser" version = "0.208.1" diff --git a/framework/base/src/types/managed/basic/big_uint.rs b/framework/base/src/types/managed/basic/big_uint.rs index 110a6b46d1..2ad3fd6701 100644 --- a/framework/base/src/types/managed/basic/big_uint.rs +++ b/framework/base/src/types/managed/basic/big_uint.rs @@ -240,10 +240,17 @@ impl BigUint { api.bi_log2(self.handle.clone()) } - pub fn ln(&self) -> ManagedDecimal> { + /// Natural logarithm of a number. + /// + /// Returns `None` for 0. + pub fn ln(&self) -> Option>> { + if self == &0u32 { + return None; + } + let bit_log2 = self.log2(); // aproximate, based on position of the most significant bit let scaling_factor_9 = ConstDecimals::<9>.scaling_factor(); - let divisor = BigUint::from(1u64 << bit_log2); + let divisor = BigUint::from(1u64) << bit_log2 as usize; let normalized = self * &*scaling_factor_9 / divisor; let x = normalized @@ -279,7 +286,7 @@ impl BigUint { let mut result_bi = normalized; // reuse handle result_bi.overwrite_u64(result as u64); - ManagedDecimal::const_decimals_from_raw(result_bi) + Some(ManagedDecimal::const_decimals_from_raw(result_bi)) } } diff --git a/framework/base/src/types/managed/wrapped/managed_decimal.rs b/framework/base/src/types/managed/wrapped/managed_decimal.rs index 2ca276ca9c..1775a9e75c 100644 --- a/framework/base/src/types/managed/wrapped/managed_decimal.rs +++ b/framework/base/src/types/managed/wrapped/managed_decimal.rs @@ -96,6 +96,10 @@ impl ManagedDecimal { self.decimals.num_decimals() } + pub fn scaling_factor(&self) -> ManagedRef<'static, M, BigUint> { + self.decimals.scaling_factor() + } + pub fn rescale(self, scale_to: T) -> ManagedDecimal where M: ManagedTypeApi, diff --git a/tools/plotter/Cargo.toml b/tools/plotter/Cargo.toml index bd428ce3e2..9f116ae4a5 100644 --- a/tools/plotter/Cargo.toml +++ b/tools/plotter/Cargo.toml @@ -1,8 +1,9 @@ [package] -name = "wasm-demo" +name = "sc-plotter-wasm" version = "0.1.0" authors = ["Hao Hou "] edition = "2018" +publish = false [lib] crate-type=["cdylib"] diff --git a/tools/plotter/src/lib.rs b/tools/plotter/src/lib.rs index 838fea4ab7..0ab413c9db 100644 --- a/tools/plotter/src/lib.rs +++ b/tools/plotter/src/lib.rs @@ -1,9 +1,11 @@ +#![allow(clippy::type_complexity)] + use wasm_bindgen::prelude::*; use web_sys::HtmlCanvasElement; mod func_plot; +pub mod logarithm; mod plot3d; -mod logarithm; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; diff --git a/tools/plotter/src/logarithm.rs b/tools/plotter/src/logarithm.rs index 6e2453c2e0..f8cf4ab4cd 100644 --- a/tools/plotter/src/logarithm.rs +++ b/tools/plotter/src/logarithm.rs @@ -1,13 +1,18 @@ use crate::DrawResult; +use multiversx_sc::types::BigUint; +use multiversx_sc_scenario::api::StaticApi; use plotters::prelude::*; use plotters_canvas::CanvasBackend; use web_sys::HtmlCanvasElement; -pub fn draw(canvas: HtmlCanvasElement, max_x: f32) -> DrawResult Option<(f32, f32)>> { +pub fn draw( + canvas: HtmlCanvasElement, + max_x: f32, +) -> DrawResult Option<(f32, f32)>> { let root = CanvasBackend::with_canvas_object(canvas) .unwrap() .into_drawing_area(); - + let font: FontDesc = ("sans-serif", 20.0).into(); root.fill(&WHITE)?; @@ -17,7 +22,7 @@ pub fn draw(canvas: HtmlCanvasElement, max_x: f32) -> DrawResult DrawResult f32 { + let bu = BigUint::::from(x as u32); + if let Some(ln_dec) = bu.ln() { + let ln_units = ln_dec.into_raw_units().to_u64().unwrap(); + let ln_sf = ln_dec.scaling_factor().to_u64().unwrap(); + (ln_units as f64 / ln_sf as f64) as f32 + } else { + 0.0 + } +} + +#[cfg(test)] +mod test { + #[test] + fn sc_ln_test() { + let y = super::sc_ln(0.0); + println!("{y}"); + } +} diff --git a/tools/plotter/src/plot3d.rs b/tools/plotter/src/plot3d.rs index 06d0190d19..15cfa1b907 100644 --- a/tools/plotter/src/plot3d.rs +++ b/tools/plotter/src/plot3d.rs @@ -25,7 +25,7 @@ pub fn draw(canvas: HtmlCanvasElement, pitch: f64, yaw: f64) -> DrawResult<()> { chart.configure_axes().draw()?; chart.draw_series( - SurfaceSeries::xoz(x_axis.values(), z_axis.values(), |x:f64, z:f64| { + SurfaceSeries::xoz(x_axis.values(), z_axis.values(), |x: f64, z: f64| { (x * x + z * z).cos() }) .style(&BLUE.mix(0.2)), diff --git a/tools/plotter/www/index.js b/tools/plotter/www/index.js index ac24813e59..5a50bbccd6 100644 --- a/tools/plotter/www/index.js +++ b/tools/plotter/www/index.js @@ -81,9 +81,6 @@ function updatePlot3d() { coord.innerText = `Pitch:${pitch_value}, Yaw:${yaw_value}` } -function updateLogarithm() { -} - /** Redraw currently selected plot. */ function updatePlot() { const selected = plotType.selectedOptions[0]; @@ -94,11 +91,8 @@ function updatePlot() { case "logarithm": control.classList.add("hide"); logControl.classList.remove("hide"); - updateLogarithm(); let logMaxValue = Number(logMax.value); - status.innerText = `Updated log: ${logMaxValue}` chart = Chart.logarithm(canvas, Number(logMaxValue)); - coord.innerText = `Updated log: ${logMaxValue}` break; case "3d-plot": control.classList.remove("hide"); @@ -112,5 +106,5 @@ function updatePlot() { } const end = performance.now(); - // status.innerText = `Rendered ${selected.innerText} in ${Math.ceil(end - start)}ms`; + status.innerText = `Rendered ${selected.innerText} in ${Math.ceil(end - start)}ms`; } diff --git a/vm/src/tx_mock/blockchain_rng_unsupported.rs b/vm/src/tx_mock/blockchain_rng_unsupported.rs index cc97bace3c..698be4ac11 100644 --- a/vm/src/tx_mock/blockchain_rng_unsupported.rs +++ b/vm/src/tx_mock/blockchain_rng_unsupported.rs @@ -5,7 +5,7 @@ pub struct BlockchainRng; impl BlockchainRng { pub fn new(_tx_input: &TxInput, _tx_cache: &TxCache) -> Self { - panic!("BlockchainRng not supported for wasm builds, feature `wasm-incopatible` needs to be enabled") + BlockchainRng } pub fn next_bytes(&mut self, _length: usize) -> Vec {