% The following causes a compiler abort in hl* grades. % Compile with: mmc -C -O0 --common-struct --loop-invariants % (The code is derived from g12/solvers/colgen/colgen_dw.m, r4657 of G12.) % :- module colgen_dw. :- interface. :- import_module array. :- import_module array2d. :- import_module map. :- type sparse_matrix == array(map(int, float)). :- pred create_a_matrix0(int::in, int::in, array(int)::in, int::in, array(array2d(float))::in, array(sparse_matrix)::array_di, array(sparse_matrix)::array_uo) is det. :- implementation. :- import_module float. :- import_module int. create_a_matrix0(H, S, N, M, AA, A0, A) :- ( H < S -> create_a_matrix1(0, N ^ elem(H), M, AA ^ elem(H), array.init(M, map.init), PartA), array.set(A0, H, PartA, A1), create_a_matrix0(H+1, S, N, M, AA, A1, A) ; A = A0 ). :- pred create_a_matrix1(int::in, int::in, int::in, array2d(float)::in, sparse_matrix::array_di, sparse_matrix::array_uo) is det. create_a_matrix1(I, N, M, AA, A0, A) :- ( I < M -> array.set(A0, I, map.init, A1), create_a_matrix2(0, I, N, AA, A1, A2), create_a_matrix1(I+1, N, M, AA, A2, A) ; A = A0 ). :- pred create_a_matrix2(int::in, int::in, int::in, array2d(float)::in, sparse_matrix::array_di, sparse_matrix::array_uo) is det. create_a_matrix2(J, I, N, AA, A0, A) :- ( J < N -> Coeff = AA ^ elem(I, J), ( Coeff = 0.0 -> A1 = A0 ; Map0 = A0 ^ elem(I), map.det_insert(Map0, J, Coeff, Map), array.set(A0, I, Map, A1) ), create_a_matrix2(J+1, I, N, AA, A1, A) ; A = A0 ).