Skip to content

Commit f34d6db

Browse files
authored
Merge pull request #6 from dgoeries/ltob-fix
fix: LTOB works now with fmin and cleanup
2 parents ff60ae0 + b0214bb commit f34d6db

3 files changed

Lines changed: 22 additions & 20 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ build-backend = "setuptools.build_meta"
88

99
[project]
1010
name = "downsample"
11-
version = "0.0.2"
11+
version = "0.0.4"
1212
readme = {file = "README.txt", content-type = "text/markdown"}
1313
description = "Downsample algorithms module for Python written in C"
1414
requires-python = ">=3.10"

src/downsample/_ltob.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "utils.h"
99

10+
1011
static PyObject *largest_triangle_one_bucket(PyObject *self, PyObject *args) {
1112
PyObject *x_obj, *y_obj;
1213
PyArrayObject *x_array = NULL, *y_array = NULL;
@@ -76,10 +77,10 @@ static PyObject *largest_triangle_one_bucket(PyObject *self, PyObject *args) {
7677
double bucket_size = (double)(len_points - 2) / (double)(threshold - 2);
7778

7879
// Main loop
79-
for (Py_ssize_t i = 1; i < threshold - 1; i++) {
80+
for (npy_intp i = 1; i < threshold - 1; i++) {
8081
npy_intp start_index = (npy_intp)floor((double)i * bucket_size);
8182
npy_intp end_index =
82-
(npy_intp)min(len_points - 1, (double)(i + 1) * bucket_size);
83+
(npy_intp)fmin(len_points - 1, (double)(i + 1) * bucket_size);
8384

8485
double max_area = -1.0;
8586
npy_intp max_area_index = -1;
@@ -121,7 +122,7 @@ static PyMethodDef LTOBMethods[] = {{"largest_triangle_one_bucket",
121122

122123
static struct PyModuleDef LTOBModule = {
123124
PyModuleDef_HEAD_INIT, "_ltob",
124-
"Module for LTD downsampling using the NumPy C API", -1, LTOBMethods};
125+
"Module for LTOB downsampling using the NumPy C API", -1, LTOBMethods};
125126

126127
PyMODINIT_FUNC PyInit__ltob(void) {
127128
import_array();

src/downsample/_lttb.c

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
2+
#include "utils.h"
23
#include <Python.h>
34
#include <math.h>
45
#include <numpy/arrayobject.h>
56
#include <numpy/npy_math.h>
6-
#include "utils.h"
77

88

9-
static PyObject *largest_triangle_three_buckets(PyObject *self, PyObject *args) {
9+
static PyObject *largest_triangle_three_buckets(PyObject *self,
10+
PyObject *args) {
1011
PyObject *x_obj, *y_obj;
1112
PyArrayObject *x_array = NULL, *y_array = NULL;
1213
int threshold;
@@ -56,14 +57,14 @@ static PyObject *largest_triangle_three_buckets(PyObject *self, PyObject *args)
5657
// Create an empty output array with shape and dim for the output!
5758
npy_intp dims[1];
5859
dims[0] = threshold;
59-
PyArrayObject *result_x = (PyArrayObject *)PyArray_Empty(1, dims,
60-
PyArray_DescrFromType(NPY_DOUBLE), 0);
61-
PyArrayObject *result_y = (PyArrayObject *)PyArray_Empty(1, dims,
62-
PyArray_DescrFromType(NPY_DOUBLE), 0);
60+
PyArrayObject *result_x = (PyArrayObject *)PyArray_Empty(
61+
1, dims, PyArray_DescrFromType(NPY_DOUBLE), 0);
62+
PyArrayObject *result_y = (PyArrayObject *)PyArray_Empty(
63+
1, dims, PyArray_DescrFromType(NPY_DOUBLE), 0);
6364

6465
// Get a pointer to its data
65-
double *result_x_data = (double*)PyArray_DATA(result_x);
66-
double *result_y_data = (double*)PyArray_DATA(result_y);
66+
double *result_x_data = (double *)PyArray_DATA(result_x);
67+
double *result_y_data = (double *)PyArray_DATA(result_y);
6768

6869
// The main loop here!
6970
const double every = (double)(len_points - 2) / (threshold - 2);
@@ -82,14 +83,14 @@ static PyObject *largest_triangle_three_buckets(PyObject *self, PyObject *args)
8283
// Calculate point average for next bucket (containing c)
8384
double avg_x = 0;
8485
double avg_y = 0;
85-
npy_intp avg_start = (npy_intp)(floor((i + 1)* every) + 1);
86+
npy_intp avg_start = (npy_intp)(floor((i + 1) * every) + 1);
8687
npy_intp avg_end = (npy_intp)(floor((i + 2) * every) + 1);
87-
if (avg_end >= len_points){
88+
if (avg_end >= len_points) {
8889
avg_end = len_points;
8990
}
9091
npy_intp avg_length = avg_end - avg_start;
9192

92-
for (;avg_start < avg_end; avg_start++){
93+
for (; avg_start < avg_end; avg_start++) {
9394
avg_x += x[avg_start];
9495
avg_y += y[avg_start];
9596
}
@@ -105,13 +106,14 @@ static PyObject *largest_triangle_three_buckets(PyObject *self, PyObject *args)
105106
double point_a_y = y[a];
106107

107108
double max_area = -1.0;
108-
for (; k < range_to; k++){
109+
for (; k < range_to; k++) {
109110
// Calculate triangle area over three buckets
110111
double point_data[2] = {point_a_x, point_a_y};
111112
double avg_data[2] = {avg_y, avg_y};
112113
double next_data[2] = {x[k], y[k]};
113-
double area = calculate_triangle_area(point_data, avg_data, next_data);
114-
if (area > max_area){
114+
double area =
115+
calculate_triangle_area(point_data, avg_data, next_data);
116+
if (area > max_area) {
115117
max_area = area;
116118
max_area_point_x = x[k];
117119
max_area_point_y = y[k];
@@ -149,8 +151,7 @@ static PyObject *largest_triangle_three_buckets(PyObject *self, PyObject *args)
149151

150152

151153
static PyMethodDef LTTBMethods[] = {
152-
{"largest_triangle_three_buckets",
153-
largest_triangle_three_buckets,
154+
{"largest_triangle_three_buckets", largest_triangle_three_buckets,
154155
METH_VARARGS,
155156
"Compute the largest triangle three buckets (LTTB) algorithm in a C "
156157
"extension."},

0 commit comments

Comments
 (0)