Skip to content

Commit

Permalink
Add 32-bit methods
Browse files Browse the repository at this point in the history
  • Loading branch information
endrebak committed Nov 13, 2018
1 parent 473a396 commit 3ff42ad
Show file tree
Hide file tree
Showing 13 changed files with 4,416 additions and 1,327 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ pip install ncls
## Changelog

```
# 2018.13.11 (0.0.29)
- add 32-bit methods
# 2018.01.06 (0.0.23)
- NCLS started segfaulting in travis build for pyranges. Probably due to bad string definition files in travis.
Expand Down
14 changes: 13 additions & 1 deletion ncls/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
from ncls.src.ncls import NCLS
from ncls.src.ncls import NCLS64
from ncls.src.ncls32 import NCLS32

import numpy as np

def NCLS(starts, ends, ids):

if starts.dtype == np.int64:
return NCLS64(starts, ends, ids)
elif starts.dtype == np.int32:
return NCLS32(starts, ends, ids)
else:
raise Exception("Starts/Ends not int64 or int32: " + str(starts.dtype))
3 changes: 1 addition & 2 deletions ncls/src/cncls.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ cdef extern from "ncls/src/intervaldb.h":
int start
int end
int target_id
int target_start
int target_end
int sublist

ctypedef struct IntervalIterator:
Expand All @@ -53,6 +51,7 @@ cdef extern from "ncls/src/intervaldb.h":
int start
int len

int find_overlap_start(int start, int end, IntervalMap im[], int n)
int imstart_qsort_cmp(void *void_a,void *void_b)
# int target_qsort_cmp(void *void_a,void *void_b)
IntervalMap *read_intervals(int n,FILE *ifile)
Expand Down
77 changes: 77 additions & 0 deletions ncls/src/cncls32.pxd
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@

from libc.stdint cimport int32_t

cdef extern from "stdlib.h":
void free(void *)
void *malloc(size_t)
void *calloc(size_t,size_t)
void *realloc(void *,size_t)
int c_abs "abs" (int)
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(void *,void *))

cdef extern from "stdio.h":
ctypedef struct FILE:
pass

FILE *fopen(char *,char *)
FILE *open_memstream(void *, size_t *)
FILE *fmemopen (void *, size_t, const char *)

int fclose(FILE *)
int fflush(FILE *)
int sscanf(char *str,char *fmt,...)
int sprintf(char *str,char *fmt,...)
int fprintf(FILE *ifile,char *fmt,...)
char *fgets(char *str,int size,FILE *ifile)


cdef extern from "ncls/src/intervaldb32.h":
ctypedef struct IntervalMap:
int32_t start
int32_t end
int32_t target_id
int32_t sublist

ctypedef struct IntervalIterator:
pass

ctypedef struct SublistHeader:
int start
int len

int find_overlap_start(int32_t start, int32_t end, IntervalMap im[], int n)
int imstart_qsort_cmp(void *void_a,void *void_b)
# int target_qsort_cmp(void *void_a,void *void_b)
IntervalMap *read_intervals(int n,FILE *ifile)
SublistHeader *build_nested_list(IntervalMap im[],int n,int *p_n,int *p_nlists)
SublistHeader *build_nested_list_inplace(IntervalMap im[],int n,int *p_n,int *p_nlists)
IntervalMap *interval_map_alloc(int n)
IntervalIterator *interval_iterator_alloc()
int free_interval_iterator(IntervalIterator *it)
IntervalIterator *reset_interval_iterator(IntervalIterator *it)
int *alloc_array(int n)
int find_intervals_stack(int start_stack[], int end_stack[], int sp, int start32_t,
int end32_t, IntervalMap im[], int n,
SublistHeader subheader[], IntervalMap buf[],
int *nfound)

int find_intervals(IntervalIterator *it0,
int start,
int end,
IntervalMap im[],
int n,
SublistHeader subheader[],
int nlists,
IntervalMap buf[],
int nbuf,
int *p_nreturn,
IntervalIterator **it_return)

void find_k_next(int start, int end,
IntervalMap im[], int n,
SublistHeader subheader[], int nlists,
IntervalMap buf[], int ktofind,
int *p_nreturn)

int read_imdiv(FILE *ifile,IntervalMap imdiv[],int div,int i_div,int ntop)
7 changes: 6 additions & 1 deletion ncls/src/intervaldb.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,12 +257,15 @@ SublistHeader *build_nested_list(IntervalMap im[],int n,
CALLOC(imsub,nsub,IntervalMap); /* TEMPORARY ARRAY FOR REPACKING SUBLISTS */
for (i=j=0;i<n;i++) { /* GENERATE LIST FOR SORTING; ASSIGN HEADER INDEXES*/
parent=im[i].sublist;
printf("Interval %i has parent %d\n", i, parent);
if (parent>=0) {/* IN A SUBLIST */
imsub[j].start=i;
imsub[j].sublist=parent;
j++;
if (im[parent].sublist<0) /* A NEW PARENT! SET HIS SUBLIST HEADER INDEX */
if (im[parent].sublist<0){ /* A NEW PARENT! SET HIS SUBLIST HEADER INDEX */
printf("Setting parent %d to sublist %d\n", parent, nlists += 1);
im[parent].sublist=nlists++;
}
}
im[i].sublist= -1; /* RESET TO DEFAULT VALUE: NO SUBLIST */
}
Expand All @@ -272,9 +275,11 @@ SublistHeader *build_nested_list(IntervalMap im[],int n,
CALLOC(subheader,nlists,SublistHeader); /* SUBLIST HEADER INDEX */
for (i=0;i<nsub;i++) { /* COPY SUBLIST ENTRIES TO imsub */
j=imsub[i].start;
printf("j: %d\n", j);
parent=imsub[i].sublist;
memcpy(imsub+i,im+j,sizeof(IntervalMap)); /* COPY INTERVAL */
k=im[parent].sublist;
printf("k is %d\n", k);
if (subheader[k].len==0) /* START A NEW SUBLIST */
subheader[k].start=i;
subheader[k].len++; /* COUNT THE SUBLIST ENTRIES */
Expand Down
1 change: 1 addition & 0 deletions ncls/src/intervaldb.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ typedef struct {

extern int *alloc_array(int n);

extern int find_overlap_start(int start,int end,IntervalMap im[],int n);
extern int imstart_qsort_cmp(const void *void_a,const void *void_b);
extern int target_qsort_cmp(const void *void_a,const void *void_b);
extern IntervalMap *read_intervals(int n,FILE *ifile);
Expand Down
Loading

0 comments on commit 3ff42ad

Please sign in to comment.