Path: blob/main/crates/polars-ops/src/series/ops/linear_space.rs
6939 views
use polars_core::prelude::*;1use polars_core::series::IsSorted;2#[cfg(feature = "serde")]3use serde::{Deserialize, Serialize};4use strum_macros::IntoStaticStr;56#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Default, IntoStaticStr)]7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]8#[cfg_attr(feature = "dsl-schema", derive(schemars::JsonSchema))]9#[strum(serialize_all = "snake_case")]10pub enum ClosedInterval {11#[default]12Both,13Left,14Right,15None,16}1718pub fn new_linear_space_f32(19start: f32,20end: f32,21n: u64,22closed: ClosedInterval,23name: PlSmallStr,24) -> PolarsResult<Float32Chunked> {25let mut ca = match n {260 => Float32Chunked::full_null(name, 0),271 => match closed {28ClosedInterval::None => Float32Chunked::from_slice(name, &[(end + start) * 0.5]),29ClosedInterval::Left | ClosedInterval::Both => {30Float32Chunked::from_slice(name, &[start])31},32ClosedInterval::Right => Float32Chunked::from_slice(name, &[end]),33},34_ => Float32Chunked::from_iter_values(name, {35let span = end - start;3637let (start, d, end) = match closed {38ClosedInterval::None => {39let d = span / (n + 1) as f32;40(start + d, d, end - d)41},42ClosedInterval::Left => (start, span / n as f32, end - span / n as f32),43ClosedInterval::Right => (start + span / n as f32, span / n as f32, end),44ClosedInterval::Both => (start, span / (n - 1) as f32, end),45};46(0..n - 1)47.map(move |v| (v as f32 * d) + start)48.chain(std::iter::once(end)) // ensures floating point accuracy of final value49}),50};5152let is_sorted = if end < start {53IsSorted::Descending54} else {55IsSorted::Ascending56};57ca.set_sorted_flag(is_sorted);58Ok(ca)59}6061pub fn new_linear_space_f64(62start: f64,63end: f64,64n: u64,65closed: ClosedInterval,66name: PlSmallStr,67) -> PolarsResult<Float64Chunked> {68let mut ca = match n {690 => Float64Chunked::full_null(name, 0),701 => match closed {71ClosedInterval::None => Float64Chunked::from_slice(name, &[(end + start) * 0.5]),72ClosedInterval::Left | ClosedInterval::Both => {73Float64Chunked::from_slice(name, &[start])74},75ClosedInterval::Right => Float64Chunked::from_slice(name, &[end]),76},77_ => Float64Chunked::from_iter_values(name, {78let span = end - start;7980let (start, d, end) = match closed {81ClosedInterval::None => {82let d = span / (n + 1) as f64;83(start + d, d, end - d)84},85ClosedInterval::Left => (start, span / n as f64, end - span / n as f64),86ClosedInterval::Right => (start + span / n as f64, span / n as f64, end),87ClosedInterval::Both => (start, span / (n - 1) as f64, end),88};89(0..n - 1)90.map(move |v| (v as f64 * d) + start)91.chain(std::iter::once(end)) // ensures floating point accuracy of final value92}),93};9495let is_sorted = if end < start {96IsSorted::Descending97} else {98IsSorted::Ascending99};100ca.set_sorted_flag(is_sorted);101Ok(ca)102}103104105