# La crate obicompactvector

Le code actuelle est ce qu'il est. Ce n'est pad la vrérité absolue, c'est un premier effort d'implémentation rien de plus. Ci-dessous je vais décrire les objectif et la structure qui devrait être. LA VERITE A ATTEINDRE.

La crate fournie des représentations les plus compact possible en mémoire de matrice de comptage ou de présence de k-mer dans des génomes. Chaque colonne représente un génome chaque ligne un kmer. une matrice est une collection de vecteur ou chacun des vecteur est un colonne de la matrice. 

Les matrices comme les colonnes ont vocation à être persistante. Les données sont stockées dans des fichiers binaires. Les données sont mappées en mémoire via `mmap`

Les structure sont par essence immutables. Il existe des représentations mutables des colonnes qui permettent leur construction. À la fin de leur construction, les colonnes sont fermée ce qui les rends immutable. 

Les matrices peuvent êtres représenté de deux façons:
    - via un répertoire contenant une collection de fichier colonnes
    - via un fichier matrix qui est la concatenation de plusieurs fichiers colonnes.


## Les matrices de comptage 

Ce sont des matrice d'entiers positif la plus part du temps de petites valeurs (inferieurs à 255). On assume que toutes les valeurs sont représentables sur un `u32`

## Les matrices de presence

Ce sont des matrices de boolean représenté comme des champs de bits

Il existe une forme implicite des vecteur de présence, qui n'est représenté par aucun fichier pour lequel toutes les valeurs sont vraies

## représentation légère des colonnes

Les colonnes qu'elles soient de unitiaire (fichier colonne) ou partie d'un fichier composite matrice peuvent être représenté par un objet léger donnant acces à ces valeurs ainsi qu'à la longeur du vecteurs. Toutes les méthodes de calcules doivent uniquement travailler à partir de ces représentations légère unifiées des colonnes.

### Représentation légère d'un vecteur de présence

Le vecteur est représenté par 
    - un champs de bits encodé comme un [u64]
    - un usize encodant la longeur du champs de bits
    
###  Représentation légère d'un vecteur de présence

Le vecteur est représenté par 
    - un vecteur [u8] encodant directement les valeur faibe du vecteur [0,255[
      La valeur 255 est une valeur sentinelle indiquant que la valeure vraie est >=255
      et se trouvent dans une structure d'overflow
    - un iterateur de (usize,u32) listant les valeurs d'overflow coorespondant aux valeurs
      sentinels (255) du [u8]
    - un usize encodant la longeur du champs de bits
