Giter Club home page Giter Club logo

grenier's Introduction

grenier — A collection of various algorithms in OCaml.

Licensed under ISC license.

baltree : Generic balanced-tree

A binary tree with smart constructors that ensure the resulting tree is balanced.

This data structure can be used as a primitive on top of which one can easily build balanced data structures, including but not limited to binary search trees.

For instance, implementing stdlib-like Set/Map is trivial and suffers only a ~5 % overhead (and one gains a O(1) length/cardinal operation).

balmap : Alternative to Map & Set implemented on top of baltree

These two modules can be used as a drop-in replacement for Map and Set. The performance characteristics are slightly different: cardinal is now O(1), some operations use that as a shortcut (compare, subset, ...).

In addition, the representation is exposed (the internal structure of the tree can be pattern matched). It is protected by a private modifier, such that invariants cannot be broken. However, custom operations are much easier to implement (e.g. rank to access the n'th element, which enables uniform sampling in O(log n)).

binder introducer: transform graphs into trees by introducing binding nodes

A generic algorithm that turns a directed graph intro a tree. It finds where binding nodes should be introduced to make the resulting tree readable. The idea is described in this blog post.

For instance, this is useful to print cyclic values (see Cmon).

dbseq: fast sequence datastructure for DeBruijn-indexed environments

Dbseq is a small data structure that offers operations halfway between a list and an immutable array. Most operations have a logarithmic cost. In practice, it is a log with base 4 and small constant factors.

The name comes from the fact that the data structure is particularly suitable to associate metadata to variables in De-Bruijn notation when traversing terms.

trope : Track objects accross rope-like operations

This data structure allows efficient implementation of text markers for text editors (see Emacs Markers).

More generally it allows to track the movement of objects on a line where chunks are added and removed, with queries O(log n) amortized time.

Finally, it is persistent so you easily compare markers movement between different revisions.

orderme : Order-maintenance problem

See Order-maintenance problem for a detailed description of what this intent to solve.

Main algorithm follows the amortized solution from "Two Simplified Algorithms for Maintaining Order in a List", Michael A. Bender, Richard Cole, Erik D. Demaine, Martín Farach-Colton, and Jack Zito.

A managed implementation provide finer integration with OCaml GC to collect items that are no longer reachable via the public API.

binpacking : Maxrects rectangle packing implementation

An implementation of Maxrects packing algorithm in 2D. This algorithm try to pack a maximum number of 2d boxes inside a 2d rectangle.

See Even More Rectangle Bin Packing

Useful for generating spritesheets, texture atlases, etc.

doubledouble : Floating points with around 107-bits precision

An implementation of double-double arithmetic.

Code is translated from DD by Martin Davis. See tsusiatsoftware for more information.

hll : HyperLogLog

An implementation of the HyperLogLog probabilistic cardinality estimator. See HyperLogLog.

jmphash : Jump consistent hashing

An implementation of "A Fast, Minimal Memory, Consistent Hash Algorithm" from John Lamping and Eric Veach.

physh : Physical hashtable

Hashtables indexing OCaml values by their physical indentities. A proof-of-concept, playing with the GC in tricky ways.

Its main purpose is to efficiently observe sharing, detect cycles, etc, in arbitrary OCaml values without having to stop and stay out of the OCaml runtime.

Can be used to experiment and learn about the GC but do expect bugs and don't expect any kind of compatibility with future OCaml versions. (Would be nice to have proper upstream support for such feature though!)

state elimination : convert an e-nfa to a regex

This library converts e-NFA (including NFA and DFA) to regular expressions.

Unfortunately the regular expression is often of exponential size, unless you extend the language to allow sharing sub-expressions (for instance with let binders).

strong : Some strongly typed primitives (typed equality, ordering, finite sets)

This library defines a few strongly typed idioms that are sometimes useful in OCaml codebase:

  • type-level equality and ordering
  • unhabitated type
  • an encoding of type-level naturals
  • finite sets (the set of numbers less than a given constant)

valmari : Valmari's DFA minimization algorithm

An implementation of the algorithm desribed in Fast brief practical DFA minimization by Valmari et al.

The tests and some fixes come from WalkerCodeRanger/dfaMinimizationComparison, thanks!

fastdom

An implementation of A Simple, Fast Dominance Algorithm by Keith D. Cooper, Timothy J. Harvey, and Ken Kennedy.

congre

A congruence closure algorithm, inspired by Fast congruence closure and extensions by Robert Nieuwenhuis and Albert Oliveras. Support backtracking and interpretation of equivalence classes to OCaml value.

grenier's People

Contributors

kit-ty-kate avatar let-def avatar rgrinberg avatar squiddev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

grenier's Issues

Serialize hll state

I'm using HyperLogLog in a long-running program and would like to save its state to a file, so it would be useful if the module could provide conversion functions to a visible type or make the Hll.t type visible.

OCaml 4.10 support

The beta release of OCaml 4.10 is around the corner, and currently, the latest version of grenier does not support 4.10 and fails with the following error message:

+ /home/opam/.opam/4.10.0+trunk/bin/dune "build" "-p" "grenier" "-j" "71" (CWD=/home/opam/.opam/4.10.0+trunk/.opam-switch/build/grenier.0.8)
-       ocamlc physh/ml_physh_set.o (exit 2)
- (cd _build/default/physh && /home/opam/.opam/4.10.0+trunk/bin/ocamlc.opt -g -ccopt -O2 -ccopt -fno-strict-aliasing -ccopt -fwrapv -ccopt -fPIC -ccopt -g -o ml_physh_set.o ml_physh_set.c)
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:67,
-                  from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_set.c:3:
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/domain_state.h:55:43: error: expected ')' before '->' token
-    55 | #define Caml_state_field(field) Caml_state->_##field
-       |                                           ^~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/compatibility.h:30:25: note: in expansion of macro 'Caml_state_field'
-    30 | #define caml_young_ptr (Caml_state_field(young_ptr))
-       |                         ^~~~~~~~~~~~~~~~
- ml_physh_set.c:9:15: note: in expansion of macro 'caml_young_ptr'
-     9 | extern value *caml_young_ptr, *caml_young_start, *caml_young_end;
-       |               ^~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/domain_state.h:55:43: error: expected ')' before '->' token
-    55 | #define Caml_state_field(field) Caml_state->_##field
-       |                                           ^~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/compatibility.h:27:29: note: in expansion of macro 'Caml_state_field'
-    27 | #define caml_stat_heap_wsz (Caml_state_field(stat_heap_wsz))
-       |                             ^~~~~~~~~~~~~~~~
- ml_physh_set.c:14:6: note: in expansion of macro 'caml_stat_heap_wsz'
-    14 |      caml_stat_heap_wsz,
-       |      ^~~~~~~~~~~~~~~~~~
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_set.c:3:
- ml_physh_set.c: In function 'ml_physh_set_alloc':
- ml_physh_set.c:72:25: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-    72 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:75:47: note: in definition of macro 'Val_long'
-    75 | #define Val_long(x)     ((intnat) (((uintnat)(x) << 1)) + 1)
-       |                                               ^
- ml_physh_set.c:72:17: note: in expansion of macro 'Val_int'
-    72 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~
- ml_physh_set.c:72:25: note: each undeclared identifier is reported only once for each function it appears in
-    72 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:75:47: note: in definition of macro 'Val_long'
-    75 | #define Val_long(x)     ((intnat) (((uintnat)(x) << 1)) + 1)
-       |                                               ^
- ml_physh_set.c:72:17: note: in expansion of macro 'Val_int'
-    72 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~
- ml_physh_set.c: In function 't_major_is_valid':
- ml_physh_set.c:132:35: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-   132 |   return (Int_val(Field(t, 3)) == caml_stat_compactions);
-       |                                   ^~~~~~~~~~~~~~~~~~~~~
-       |                                   caml_stat_major_collections
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_set.c:3:
- ml_physh_set.c: In function 't_major_set_valid':
- ml_physh_set.c:137:25: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-   137 |   Field(t, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:75:47: note: in definition of macro 'Val_long'
-    75 | #define Val_long(x)     ((intnat) (((uintnat)(x) << 1)) + 1)
-       |                                               ^
- ml_physh_set.c:137:17: note: in expansion of macro 'Val_int'
-   137 |   Field(t, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~
-       ocamlc physh/ml_physh_map.o (exit 2)
- (cd _build/default/physh && /home/opam/.opam/4.10.0+trunk/bin/ocamlc.opt -g -ccopt -O2 -ccopt -fno-strict-aliasing -ccopt -fwrapv -ccopt -fPIC -ccopt -g -o ml_physh_map.o ml_physh_map.c)
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:67,
-                  from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_map.c:3:
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/domain_state.h:55:43: error: expected ')' before '->' token
-    55 | #define Caml_state_field(field) Caml_state->_##field
-       |                                           ^~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/compatibility.h:30:25: note: in expansion of macro 'Caml_state_field'
-    30 | #define caml_young_ptr (Caml_state_field(young_ptr))
-       |                         ^~~~~~~~~~~~~~~~
- ml_physh_map.c:10:15: note: in expansion of macro 'caml_young_ptr'
-    10 | extern value *caml_young_ptr, *caml_young_start, *caml_young_end;
-       |               ^~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/domain_state.h:55:43: error: expected ')' before '->' token
-    55 | #define Caml_state_field(field) Caml_state->_##field
-       |                                           ^~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/compatibility.h:27:29: note: in expansion of macro 'Caml_state_field'
-    27 | #define caml_stat_heap_wsz (Caml_state_field(stat_heap_wsz))
-       |                             ^~~~~~~~~~~~~~~~
- ml_physh_map.c:15:6: note: in expansion of macro 'caml_stat_heap_wsz'
-    15 |      caml_stat_heap_wsz,
-       |      ^~~~~~~~~~~~~~~~~~
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_map.c:3:
- ml_physh_map.c: In function 'ml_physh_map_alloc':
- ml_physh_map.c:75:25: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-    75 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:79:20: note: in expansion of macro 'Val_long'
-    79 | #define Val_int(x) Val_long(x)
-       |                    ^~~~~~~~
- ml_physh_map.c:75:17: note: in expansion of macro 'Val_int'
-    75 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~
- ml_physh_map.c:75:25: note: each undeclared identifier is reported only once for each function it appears in
-    75 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:79:20: note: in expansion of macro 'Val_long'
-    79 | #define Val_int(x) Val_long(x)
-       |                    ^~~~~~~~
- ml_physh_map.c:75:17: note: in expansion of macro 'Val_int'
-    75 |   Field(v, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~
- ml_physh_map.c: In function 't_major_is_valid':
- ml_physh_map.c:135:35: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-   135 |   return (Int_val(Field(t, 3)) == caml_stat_compactions);
-       |                                   ^~~~~~~~~~~~~~~~~~~~~
-       |                                   caml_stat_major_collections
- In file included from /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/alloc.h:24,
-                  from ml_physh_map.c:3:
- ml_physh_map.c: In function 't_major_set_valid':
- ml_physh_map.c:140:25: error: 'caml_stat_compactions' undeclared (first use in this function); did you mean 'caml_stat_major_collections'?
-   140 |   Field(t, 3) = Val_int(caml_stat_compactions);
-       |                         ^~~~~~~~~~~~~~~~~~~~~
- /home/opam/.opam/4.10.0+trunk/lib/ocaml/caml/mlvalues.h:75:47: note: in definition of macro 'Val_long'
-    75 | #define Val_long(x)     ((intnat) (((uintnat)(x) << 1)) + 1)
-       |                                               ^
- ml_physh_map.c:140:17: note: in expansion of macro 'Val_int'
-   140 |   Field(t, 3) = Val_int(caml_stat_compactions);
-       |                 ^~~~~~~

Judging from the error message, painless support will require ocaml/ocaml#9202

Issue installing grenier

via opam install

=-=- Processing actions -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=  🐫
[ERROR] The compilation of grenier failed at "make install".
Processing  1/1: [grenier: ocamlfind remove]
#=== ERROR while installing grenier.0.1 =======================================#
# opam-version 1.2.2
# os           darwin
# command      make install
# path         /Users/isaachodes/.opam/system/build/grenier.0.1
# compiler     system (4.02.3)
# exit-code    2
# env-file     /Users/isaachodes/.opam/system/build/grenier.0.1/grenier-68931-ad8886.env
# stdout-file  /Users/isaachodes/.opam/system/build/grenier.0.1/grenier-68931-ad8886.out
# stderr-file  /Users/isaachodes/.opam/system/build/grenier.0.1/grenier-68931-ad8886.err
### stdout ###
# [...]
# make[2]: `doubledouble.cma' is up to date.
# make[2]: `doubledouble.cmxa' is up to date.
# make[1]: Nothing to be done for `all'.
# make[2]: `baltree.cma' is up to date.
# make[2]: `baltree.cmxa' is up to date.
# make[2]: `trope.cma' is up to date.
# make[2]: `trope.cmxa' is up to date.
#
# Installing library with ocamlfind
# ocamlfind install  grenier META hll/hll.mli hll/hll.cmi hll/hll_consts.cmi hll/hll.a hll/hll.cma hll/hll.cmxa jmphash/jmphash.mli jmphash/jmphash.cmi jmphash/jmphash.a jmphash/jmphash.cma jmphash/jmphash.cmxa pcg/pcg.mli pcg/pcg.cmi pcg/pcg.a pcg/pcg.cma pcg/pcg.cmxa orderme/order_list.mli orderme/order_indir.mli orderme/order_managed.mli orderme/order_list.cmi orderme/order_indir.cmi orderme/order_managed.cmi orderme/orderme.a orderme/orderme.cma orderme/orderme.cmxa orderme/dllorderme_stubs.so orderme/liborderme_stubs.a doubledouble/doubledouble.mli doubledouble/doubledouble.cmi doubledouble/doubledouble.cmo doubledouble/doubledouble.cmx physh/physh.mli physh/physh.cmi physh/physh.a physh/physh.cma physh/physh.cmxa physh/lib_physh_stubs.a physh/dll_physh_stubs.so baltree/baltree.a baltree/baltree.cma baltree/baltree.cmxa baltree/bt1.mli baltree/bt1.cmi baltree/bt2.mli baltree/bt2.cmi baltree/mbt.mli baltree/mbt.cmi trope/trope.a trope/trope.cma trope/trope.cmxa trope/trope.mli trope/trope.cmi
### stderr ###
# [...]
# Installed /Users/isaachodes/.opam/system/lib/grenier/physh.cma
# Installed /Users/isaachodes/.opam/system/lib/grenier/physh.a
# Installed /Users/isaachodes/.opam/system/lib/grenier/physh.cmi
# Installed /Users/isaachodes/.opam/system/lib/grenier/physh.mli
# Installed /Users/isaachodes/.opam/system/lib/grenier/doubledouble.cmx
# Installed /Users/isaachodes/.opam/system/lib/grenier/doubledouble.cmo
# Installed /Users/isaachodes/.opam/system/lib/grenier/doubledouble.cmi
# Installed /Users/isaachodes/.opam/system/lib/grenier/doubledouble.mli
# ocamlfind: orderme/liborderme_stubs.a: No such file or directory
# make: *** [libinstall] Error 2

OCaml 5.1 support

There are a few errors in balmap:

File "balmap/map.ml", lines 12-371, characters 0-3:
 12 | struct
 13 |   type key = O.t
 14 | 
 15 |   type 'a t = (O.t, 'a) balmap
 16 | 
...
368 | 
369 |   let of_seq seq =
370 |     add_seq seq empty
371 | end
Error: Signature mismatch:
       ...
       The value `add_to_list' is required but not provided
       File "map.mli", line 88, characters 4-56: Expected declaration
       The value `to_list' is required but not provided
       File "map.mli", line 333, characters 4-41: Expected declaration
       The value `of_list' is required but not provided
       File "map.mli", line 337, characters 4-41: Expected declaration

and physh:

In file included from alloc.h:21,
                 from ml_physh_map.c:6:
ml_physh_map.c: In function ‘ml_physh_map_alloc’:
ml_physh_map.c:64:25: error: ‘caml_stat_minor_collections’ undeclared (first use in this function); did you mean ‘caml_stat_major_collections’?
   64 |   Field(v, 0) = Val_int(caml_stat_minor_collections);
      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.