10
1
mirror of https://gitlab.com/scemama/QCaml.git synced 2024-07-26 04:37:26 +02:00

Compressed integrals

This commit is contained in:
Anthony Scemama 2019-04-05 15:36:47 +02:00
parent 0e34c3adca
commit ee98fbb33a

View File

@ -44,6 +44,13 @@ let dense_index i j size =
(j-1)*size + i (j-1)*size + i
let sym_index i j =
if i < j then
(j*(j-1))/2 + i
else
(i*(i-1))/2 + j
let unsafe_get_four_index ~r1 ~r2 t = let unsafe_get_four_index ~r1 ~r2 t =
let open Bigarray.Array2 in let open Bigarray.Array2 in
@ -78,7 +85,7 @@ let unsafe_get_four_index ~r1 ~r2 t =
else else
match t.four_index with match t.four_index with
| Dense a -> unsafe_get a (dense_index i j t.size) (dense_index k l t.size) | Dense a -> unsafe_get a (dense_index i k t.size) (sym_index j l)
| Sparse a -> let key = key_of_indices ~r1 ~r2 in | Sparse a -> let key = key_of_indices ~r1 ~r2 in
try Hashtbl.find a key try Hashtbl.find a key
with Not_found -> 0. with Not_found -> 0.
@ -152,24 +159,18 @@ let unsafe_set_four_index ~r1 ~r2 ~value t =
else else
match t.four_index with match t.four_index with
| Dense a -> let ij = (dense_index i j t.size) | Dense a -> let ik = (dense_index i k t.size)
and kl = (dense_index k l t.size) and jl = (dense_index j l t.size)
and il = (dense_index i l t.size) and ki = (dense_index k i t.size)
and kj = (dense_index k j t.size) and lj = (dense_index l j t.size)
and ji = (dense_index j i t.size) and ik_s = (sym_index i k)
and lk = (dense_index l k t.size) and jl_s = (sym_index j l)
and li = (dense_index l i t.size)
and jk = (dense_index j k t.size)
in in
begin begin
unsafe_set a ij kl value; unsafe_set a ik jl_s value;
unsafe_set a kj il value; unsafe_set a ki jl_s value;
unsafe_set a il kj value; unsafe_set a jl ik_s value;
unsafe_set a kl ij value; unsafe_set a lj ik_s value;
unsafe_set a ji lk value;
unsafe_set a li jk value;
unsafe_set a jk li value;
unsafe_set a lk ji value
end end
| Sparse a -> let key = key_of_indices ~r1 ~r2 in | Sparse a -> let key = key_of_indices ~r1 ~r2 in
Hashtbl.replace a key value Hashtbl.replace a key value
@ -233,7 +234,7 @@ let create ~size ?(temp_dir="/dev/shm") sparsity =
let four_index = let four_index =
match sparsity with match sparsity with
| `Dense -> let result = | `Dense -> let result =
SharedMemory.create ~temp_dir Float64 [| size*size ; size*size |] SharedMemory.create ~temp_dir Float64 [| size*size ; (size*(size+1))/2 |]
|> Bigarray.array2_of_genarray |> Bigarray.array2_of_genarray
in in
Dense result Dense result