Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 138 additions & 131 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion asap-common/sketch-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ serde.workspace = true
rmp-serde = "1.1"
xxhash-rust = { version = "0.8", features = ["xxh32"] }
dsrs = { git = "https://github.com/ProjectASAP/datasketches-rs", rev = "d748ec75c80fff21f7b24897244dd1c895df2e9a" }
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }
clap = { version = "4.0", features = ["derive"] }

[dev-dependencies]
Expand Down
32 changes: 16 additions & 16 deletions asap-common/sketch-core/report.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Report

Compares the **legacy** sketch implementations in `sketch-core` vs the **sketchlib-rust** backends (Count-Min Sketch, Count-Min-With-Heap, KLL, HydraKLL).
Compares the **legacy** sketch implementations in `sketch-core` vs the **asap_sketchlib** backends (Count-Min Sketch, Count-Min-With-Heap, KLL, HydraKLL).

## Fidelity harness

Expand Down Expand Up @@ -32,23 +32,23 @@ cargo test -p sketch-core
| width | n | domain | Mode | Pearson corr | MAPE (%) | RMSE (%) |
|-------|--------|--------|----------------|----------------|----------|----------|
| 1024 | 100000 | 1000 | Legacy | 0.9998451189 | 24.48 | 52.76 |
| 1024 | 100000 | 1000 | sketchlib-rust | 0.9998387103 | 24.36 | 54.11 |
| 1024 | 100000 | 1000 | asap_sketchlib | 0.9998387103 | 24.36 | 54.11 |

#### depth=5

| width | n | domain | Mode | Pearson corr | MAPE (%) | RMSE (%) |
|-------|--------|--------|----------------|----------------|----------|----------|
| 2048 | 200000 | 2000 | Legacy | 0.9999733814 | 8.75 | 29.94 |
| 2048 | 200000 | 2000 | sketchlib-rust | 0.9999744627 | 8.37 | 28.84 |
| 2048 | 200000 | 2000 | asap_sketchlib | 0.9999744627 | 8.37 | 28.84 |
| 2048 | 50000 | 500 | Legacy | 1.0000000000 | 0.00 | 0.00 |
| 2048 | 50000 | 500 | sketchlib-rust | 1.0000000000 | 0.00 | 0.00 |
| 2048 | 50000 | 500 | asap_sketchlib | 1.0000000000 | 0.00 | 0.00 |

#### depth=7

| width | n | domain | Mode | Pearson corr | MAPE (%) | RMSE (%) |
|-------|--------|--------|----------------|----------------|----------|----------|
| 4096 | 200000 | 2000 | Legacy | 0.9999993694 | 0.20 | 3.69 |
| 4096 | 200000 | 2000 | sketchlib-rust | 0.9999993499 | 0.21 | 4.27 |
| 4096 | 200000 | 2000 | asap_sketchlib | 0.9999993499 | 0.21 | 4.27 |

---

Expand All @@ -61,16 +61,16 @@ The heap is maintained by local updates; recall is measured against the **true**
| width | n | domain | heap_size | Mode | Top-k recall | Pearson (top-k) | MAPE (%) | RMSE (%) |
|-------|--------|--------|-----------|----------------|--------------|-----------------|----------|----------|
| 1024 | 100000 | 1000 | 10 | Legacy | 0.40 | 0.9571 | 0.174 | 0.319 |
| 1024 | 100000 | 1000 | 10 | sketchlib-rust | 0.80 | 1.0000 | 0.000 | 0.000 |
| 1024 | 100000 | 1000 | 10 | asap_sketchlib | 0.80 | 1.0000 | 0.000 | 0.000 |

#### depth=5

| width | n | domain | heap_size | Mode | Top-k recall | Pearson (top-k) | MAPE (%) | RMSE (%) |
|-------|--------|--------|-----------|----------------|--------------|-----------------|----------|----------|
| 2048 | 200000 | 2000 | 20 | Legacy | 0.60 | 0.9964 | 0.045 | 0.101 |
| 2048 | 200000 | 2000 | 20 | sketchlib-rust | 1.00 | 0.9982 | 0.021 | 0.067 |
| 2048 | 200000 | 2000 | 20 | asap_sketchlib | 1.00 | 0.9982 | 0.021 | 0.067 |
| 2048 | 200000 | 2000 | 50 | Legacy | 0.40 | 0.9999983 | 5.60 | 16.49 |
| 2048 | 200000 | 2000 | 50 | sketchlib-rust | 0.48 | 0.9999990 | 3.90 | 12.95 |
| 2048 | 200000 | 2000 | 50 | asap_sketchlib | 0.48 | 0.9999990 | 3.90 | 12.95 |

---

Expand All @@ -84,23 +84,23 @@ For each quantile \(q\), we compute the sketch estimate `est_value`, then:
| n_updates | Mode | q=0.5 | q=0.9 | q=0.99 |
|-----------|----------------|---------|---------|---------|
| 200000 | Legacy | 0.0104 | 0.0145 | 0.0028 |
| 200000 | sketchlib-rust | 0.0275 | 0.0470 | 0.0061 |
| 200000 | asap_sketchlib | 0.0275 | 0.0470 | 0.0061 |
| 50000 | Legacy | 0.0131 | 0.0091 | 0.0054 |
| 50000 | sketchlib-rust | 0.0110 | 0.0116 | 0.0031 |
| 50000 | asap_sketchlib | 0.0110 | 0.0116 | 0.0031 |

#### k=50

| n_updates | Mode | q=0.5 | q=0.9 | q=0.99 |
|-----------|----------------|---------|---------|---------|
| 200000 | Legacy | 0.0013 | 0.0021 | 0.0012 |
| 200000 | sketchlib-rust | 0.0101 | 0.0044 | 0.0074 |
| 200000 | asap_sketchlib | 0.0101 | 0.0044 | 0.0074 |

#### k=200

| n_updates | Mode | q=0.5 | q=0.9 | q=0.99 |
|-----------|----------------|---------|---------|---------|
| 200000 | Legacy | 0.0021 | 0.0036 | 0.0000 |
| 200000 | sketchlib-rust | 0.0015 | 0.0001 | 0.0002 |
| 200000 | asap_sketchlib | 0.0015 | 0.0001 | 0.0002 |

---

Expand All @@ -111,15 +111,15 @@ For each quantile \(q\), we compute the sketch estimate `est_value`, then:
| k | n | domain | Mode | q=0.5 (mean / max) | q=0.9 (mean / max) |
|-----|--------|--------|----------------|--------------------|--------------------|
| 20 | 200000 | 200 | Legacy | 0.0170 / 0.0546 | 0.0165 / 0.0452 |
| 20 | 200000 | 200 | sketchlib-rust | 0.0254 / 0.0629 | 0.0546 / 0.0942 |
| 20 | 200000 | 200 | asap_sketchlib | 0.0254 / 0.0629 | 0.0546 / 0.0942 |

#### rows=3, cols=128

| k | n | domain | Mode | q=0.5 (mean / max) | q=0.9 (mean / max) |
|-----|--------|--------|----------------|--------------------|--------------------|
| 20 | 200000 | 200 | Legacy | 0.0166 / 0.0591 | 0.0114 / 0.0304 |
| 20 | 200000 | 200 | sketchlib-rust | 0.0216 / 0.0534 | 0.0238 / 0.1087 |
| 20 | 200000 | 200 | asap_sketchlib | 0.0216 / 0.0534 | 0.0238 / 0.1087 |
| 50 | 200000 | 200 | Legacy | 0.0099 / 0.0352 | 0.0087 / 0.0330 |
| 50 | 200000 | 200 | sketchlib-rust | 0.0119 / 0.0458 | 0.0119 / 0.0296 |
| 50 | 200000 | 200 | asap_sketchlib | 0.0119 / 0.0458 | 0.0119 / 0.0296 |
| 20 | 100000 | 100 | Legacy | 0.0141 / 0.0574 | 0.0149 / 0.0471 |
| 20 | 100000 | 100 | sketchlib-rust | 0.0202 / 0.0621 | 0.0287 / 0.0779 |
| 20 | 100000 | 100 | asap_sketchlib | 0.0202 / 0.0621 | 0.0287 / 0.0779 |
6 changes: 3 additions & 3 deletions asap-common/sketch-core/src/bin/sketchlib_fidelity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -337,17 +337,17 @@ fn main() {
let cms_mode = if matches!(args.cms_impl, ImplMode::Legacy) {
"Legacy"
} else {
"sketchlib-rust"
"asap_sketchlib"
};
let cmwh_mode = if matches!(args.cmwh_impl, ImplMode::Legacy) {
"Legacy"
} else {
"sketchlib-rust"
"asap_sketchlib"
};
let kll_mode = if matches!(args.kll_impl, ImplMode::Legacy) {
"Legacy"
} else {
"sketchlib-rust"
"asap_sketchlib"
};

// CountMinSketch: multiple (depth, width, n, domain)
Expand Down
8 changes: 4 additions & 4 deletions asap-common/sketch-core/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::sync::OnceLock;
pub enum ImplMode {
/// Use the original hand-written implementations.
Legacy,
/// Use sketchlib-rust backed implementations.
/// Use asap_sketchlib backed implementations.
Sketchlib,
}

Expand All @@ -19,21 +19,21 @@ pub const DEFAULT_CMWH_IMPL: ImplMode = ImplMode::Sketchlib;

static COUNTMIN_MODE: OnceLock<ImplMode> = OnceLock::new();

/// Returns true if Count-Min operations should use sketchlib-rust internally.
/// Returns true if Count-Min operations should use asap_sketchlib internally.
pub fn use_sketchlib_for_count_min() -> bool {
*COUNTMIN_MODE.get_or_init(|| DEFAULT_CMS_IMPL) == ImplMode::Sketchlib
}

static KLL_MODE: OnceLock<ImplMode> = OnceLock::new();

/// Returns true if KLL operations should use sketchlib-rust internally.
/// Returns true if KLL operations should use asap_sketchlib internally.
pub fn use_sketchlib_for_kll() -> bool {
*KLL_MODE.get_or_init(|| DEFAULT_KLL_IMPL) == ImplMode::Sketchlib
}

static COUNTMIN_WITH_HEAP_MODE: OnceLock<ImplMode> = OnceLock::new();

/// Returns true if Count-Min-With-Heap operations should use sketchlib-rust internally for the
/// Returns true if Count-Min-With-Heap operations should use asap_sketchlib internally for the
/// Count-Min portion.
pub fn use_sketchlib_for_count_min_with_heap() -> bool {
*COUNTMIN_WITH_HEAP_MODE.get_or_init(|| DEFAULT_CMWH_IMPL) == ImplMode::Sketchlib
Expand Down
2 changes: 1 addition & 1 deletion asap-common/sketch-core/src/count_min.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct WireFormat {
pub enum CountMinBackend {
/// Original hand-written matrix implementation.
Legacy(Vec<Vec<f64>>),
/// sketchlib-rust backed implementation.
/// asap_sketchlib backed implementation.
Sketchlib(SketchlibCms),
}

Expand Down
4 changes: 2 additions & 2 deletions asap-common/sketch-core/src/count_min_sketchlib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use sketchlib_rust::{CountMin, RegularPath, SketchInput, Vector2D};
use asap_sketchlib::{CountMin, RegularPath, SketchInput, Vector2D};

/// Concrete Count-Min type from sketchlib-rust when sketchlib backend is enabled.
/// Concrete Count-Min type from asap_sketchlib when sketchlib backend is enabled.
/// Uses f64 counters (Vector2D<f64>) for weighted updates without integer rounding.
pub type SketchlibCms = CountMin<Vector2D<f64>, RegularPath>;

Expand Down
2 changes: 1 addition & 1 deletion asap-common/sketch-core/src/count_min_with_heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ pub enum CountMinWithHeapBackend {
sketch: Vec<Vec<f64>>,
heap: Vec<HeapItem>,
},
/// sketchlib-rust CMSHeap implementation.
/// asap_sketchlib CMSHeap implementation.
Sketchlib(SketchlibCMSHeap),
}

Expand Down
12 changes: 6 additions & 6 deletions asap-common/sketch-core/src/count_min_with_heap_sketchlib.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
//! Sketchlib-rust CMSHeap integration for CountMinSketchWithHeap.
//! asap_sketchlib CMSHeap integration for CountMinSketchWithHeap.
//!
//! Uses CMSHeap (CountMin + HHHeap) from sketchlib-rust instead of CountMin + local heap,
//! Uses CMSHeap (CountMin + HHHeap) from asap_sketchlib instead of CountMin + local heap,
//! providing automatic top-k tracking during insert and merge.

use sketchlib_rust::RegularPath;
use sketchlib_rust::{CMSHeap, SketchInput, Vector2D};
use asap_sketchlib::RegularPath;
use asap_sketchlib::{CMSHeap, SketchInput, Vector2D};

/// Wire-format heap item (key, value) to avoid circular dependency with count_min_with_heap.
pub struct WireHeapItem {
pub key: String,
pub value: f64,
}

/// Concrete Count-Min-with-Heap type from sketchlib-rust (CMS + HHHeap).
/// Concrete Count-Min-with-Heap type from asap_sketchlib (CMS + HHHeap).
pub type SketchlibCMSHeap = CMSHeap<Vector2D<i64>, RegularPath>;

/// Creates a fresh CMSHeap with the given dimensions and heap capacity.
Expand Down Expand Up @@ -81,7 +81,7 @@ pub fn heap_to_wire(cms_heap: &SketchlibCMSHeap) -> Vec<WireHeapItem> {
.iter()
.map(|hh_item| {
let key = match &hh_item.key {
sketchlib_rust::HeapItem::String(s) => s.clone(),
asap_sketchlib::HeapItem::String(s) => s.clone(),
other => format!("{:?}", other),
};
WireHeapItem {
Expand Down
2 changes: 1 addition & 1 deletion asap-common/sketch-core/src/kll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub struct KllSketchData {
pub enum KllBackend {
/// dsrs (DataSketches) implementation.
Legacy(KllDoubleSketch),
/// sketchlib-rust backed implementation.
/// asap_sketchlib backed implementation.
Sketchlib(SketchlibKll),
}

Expand Down
4 changes: 2 additions & 2 deletions asap-common/sketch-core/src/kll_sketchlib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use sketchlib_rust::{SketchInput, KLL};
use asap_sketchlib::{SketchInput, KLL};

/// Concrete KLL type from sketchlib-rust when sketchlib backend is enabled.
/// Concrete KLL type from asap_sketchlib when sketchlib backend is enabled.
pub type SketchlibKll = KLL;

/// Creates a fresh sketchlib KLL sketch with the requested accuracy parameter `k`.
Expand Down
2 changes: 1 addition & 1 deletion asap-query-engine/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ zstd = "0.13"
reqwest = { version = "0.11", features = ["json"] }
tracing-appender = "0.2"
elastic_dsl_utilities.workspace = true
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }

[[bin]]
name = "precompute_engine"
Expand Down
2 changes: 1 addition & 1 deletion asap-query-engine/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ LABEL description="QueryEngine Rust service for SketchDB"

WORKDIR /code

# Required by prost-build dependencies (e.g., sketchlib-rust) during cargo build
# Required by prost-build dependencies (e.g., asap_sketchlib) during cargo build
RUN apt-get update && apt-get install -y --no-install-recommends \
protobuf-compiler \
&& rm -rf /var/lib/apt/lists/*
Expand Down
2 changes: 1 addition & 1 deletion asap-query-engine/src/drivers/ingest/otel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use std::collections::HashMap;
use std::io::Read;

use asap_sketchlib::proto::sketchlib::{sketch_envelope, SketchEnvelope};
use axum::{body::Bytes, extract::State, routing::post, Json, Router};
use flate2::read::GzDecoder;
use opentelemetry_proto::tonic::collector::metrics::v1::{
Expand All @@ -16,7 +17,6 @@ use opentelemetry_proto::tonic::collector::metrics::v1::{
use opentelemetry_proto::tonic::common::v1::any_value::Value as AnyValueVariant;
use opentelemetry_proto::tonic::metrics::v1::number_data_point::Value as NumberValue;
use prost::Message;
use sketchlib_rust::proto::sketchlib::{sketch_envelope, SketchEnvelope};
use tonic::{Request, Response, Status};
use tracing::{debug, error, info};

Expand Down
4 changes: 2 additions & 2 deletions asap-query-engine/src/stores/promsketch_store/query.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use sketchlib_rust::{EHSketchList, SketchInput, UniformSampling};
use asap_sketchlib::{EHSketchList, SketchInput, UniformSampling};

use super::series::PromSketchMemSeries;

Expand Down Expand Up @@ -86,7 +86,7 @@ fn eval_kll_quantile(

/// Evaluate sampling-based functions (avg, count, sum, sum2, stddev, stdvar).
///
/// Since sketchlib-rust's `UniformSampling` exposes `samples()` and `total_seen()`
/// Since asap_sketchlib's `UniformSampling` exposes `samples()` and `total_seen()`
/// but not dedicated query methods like the Go version, we compute statistics
/// from the raw merged samples.
fn eval_sampling_stat(
Expand Down
2 changes: 1 addition & 1 deletion asap-query-engine/src/stores/promsketch_store/series.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use sketchlib_rust::{
use asap_sketchlib::{
EHSketchList, EHUnivOptimized, ExponentialHistogram, SketchInput, UniformSampling, KLL,
};

Expand Down
6 changes: 3 additions & 3 deletions asap-summary-ingest/templates/udfs/countminsketch_count.rs.j2
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
rmp-serde = "1.1"
serde = { version = "1.0", features = ["derive"] }
twox-hash = "2.1.0"
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }
*/

use arroyo_udf_plugin::udf;
use rmp_serde::Serializer;
use serde::{Deserialize, Serialize};
use twox_hash::XxHash32;

use sketchlib_rust::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};
use asap_sketchlib::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};

// Count-Min Sketch parameters
const DEPTH: usize = {{ depth }}; // Number of hash functions
Expand Down Expand Up @@ -62,7 +62,7 @@ impl CountMinSketch {
#[udf]
fn countminsketch_count(keys: Vec<&str>, values: Vec<f64>) -> Option<Vec<u8>> {
if use_sketchlib_for_cms() {
// sketchlib-rust backed implementation: integer counters + internal hashing.
// asap_sketchlib backed implementation: integer counters + internal hashing.
let mut inner = SketchlibCms::with_dimensions(DEPTH, WIDTH);

for &key in keys.iter() {
Expand Down
6 changes: 3 additions & 3 deletions asap-summary-ingest/templates/udfs/countminsketch_sum.rs.j2
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
rmp-serde = "1.1"
serde = { version = "1.0", features = ["derive"] }
twox-hash = "2.1.0"
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }
*/

use arroyo_udf_plugin::udf;
use rmp_serde::Serializer;
use serde::{Deserialize, Serialize};
use twox_hash::XxHash32;

use sketchlib_rust::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};
use asap_sketchlib::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};

// Count-Min Sketch parameters
const DEPTH: usize = {{ depth }}; // Number of hash functions
Expand Down Expand Up @@ -67,7 +67,7 @@ fn countminsketch_sum(keys: Vec<&str>, values: Vec<f64>) -> Option<Vec<u8>> {
}

if use_sketchlib_for_cms() {
// sketchlib-rust backed implementation: integer counters + internal hashing.
// asap_sketchlib backed implementation: integer counters + internal hashing.
let mut inner = SketchlibCms::with_dimensions(DEPTH, WIDTH);

for (i, &key) in keys.iter().enumerate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
rmp-serde = "1.1"
serde = { version = "1.0", features = ["derive"] }
twox-hash = "2.1.0"
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }
*/

use std::cmp::Ordering;
Expand All @@ -14,7 +14,7 @@ use rmp_serde::Serializer;
use serde::{Deserialize, Serialize};
use twox_hash::XxHash32;

use sketchlib_rust::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};
use asap_sketchlib::{CountMin as SketchlibCountMin, RegularPath, SketchInput, Vector2D};

// Count-Min Sketch with Heap parameters
const DEPTH: usize = {{ depth }}; // Number of hash functions
Expand Down Expand Up @@ -114,7 +114,7 @@ impl PartialOrd for HeapItem {
struct CountMinSketchWithHeap {
// Legacy wire-format matrix representation.
sketch: CountMinSketch,
// Optional sketchlib-rust Count-Min used when ARROYO_SKETCH_CMWH_IMPL selects sketchlib mode.
// Optional asap_sketchlib Count-Min used when ARROYO_SKETCH_CMWH_IMPL selects sketchlib mode.
sketchlib: Option<SketchlibCms>,
topk_heap: BinaryHeap<HeapItem>, // Maintain as heap during processing
heap_size: usize,
Expand Down
4 changes: 2 additions & 2 deletions asap-summary-ingest/templates/udfs/datasketcheskll_.rs.j2
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
/*
[dependencies]
sketchlib-rust = { git = "https://github.com/ProjectASAP/sketchlib-rust", rev = "440427438fdaf3ac2298b53ee148f9e12a64ffcc" }
asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib" }
arroyo-udf-plugin = "0.1"
rmp-serde = "1.1"
serde = { version = "1.0", features = ["derive"] }
*/

use arroyo_udf_plugin::udf;
use serde::{Deserialize, Serialize};
use sketchlib_rust::{KLL, SketchInput};
use asap_sketchlib::{KLL, SketchInput};

const DEFAULT_K: u16 = {{ k }};

Expand Down
Loading
Loading