Skip to content

Commit

Permalink
New resize functions, plus sample asserts/allocation of inputs
Browse files Browse the repository at this point in the history
  • Loading branch information
kartikv committed Jul 7, 2020
1 parent ddf48e7 commit 8bbe943
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 11 deletions.
136 changes: 127 additions & 9 deletions fmpz_sparse_mat.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ void fmpz_sparse_mat_set (fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M)
{
slong i, rmax = FLINT_MIN(M->r, M->r);
if (M==N) return;
for (i = 0; i < rmax; ++i) fmpz_sparse_vec_set(&N->rows[i], &M->rows[i], M->c_off);
for (i = 0; i < rmax; ++i)
fmpz_sparse_vec_set(&N->rows[i], &M->rows[i], M->c_off);
}

FMPZ_SPARSE_MAT_INLINE
Expand All @@ -96,6 +97,27 @@ void fmpz_sparse_mat_clear (fmpz_sparse_mat_t M)
flint_free(M->rows);
memset(M, 0, sizeof(*M));
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_resize (fmpz_sparse_mat_t M, slong rows, slong cols)
{
slong i;
if (rows == 0)
{
fmpz_sparse_mat_clear(M);
}
else
{
for (i = rows; i < M->r; ++i)
fmpz_sparse_vec_clear(&M->rows[i]);
M->rows = flint_realloc(M->rows, rows*sizeof(*M->rows));
for (i = M->r; i < rows; ++i)
fmpz_sparse_vec_init(&M->rows[i]);
}
M->c = cols;
M->r = rows;
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_swap (fmpz_sparse_mat_t M1, fmpz_sparse_mat_t M2)
{
Expand Down Expand Up @@ -236,16 +258,15 @@ int fmpz_sparse_mat_is_square (const fmpz_sparse_mat_t M)
FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_set_fmpz_mat (fmpz_sparse_mat_t M, const fmpz_mat_t dM)
{
slong i, rmax = FLINT_MIN(M->r, dM->r);
if (M->c == 0 || dM->c == 0) {fmpz_sparse_mat_zero(M); return;}
for (i = 0; i < rmax; ++i) fmpz_sparse_vec_set_fmpz_vec(&M->rows[i], dM->rows[i], dM->c);
slong i;
for (i = 0; i < FLINT_MIN(M->r, dM->r); ++i)
fmpz_sparse_vec_set_fmpz_vec(&M->rows[i], dM->rows[i], dM->c);
}
FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_get_fmpz_mat (fmpz_mat_t dM, const fmpz_sparse_mat_t M)
{
slong i, rmax = FLINT_MIN(M->r, dM->r);
if (M->c == 0 || dM->c == 0) {fmpz_mat_zero(dM); return;}
for (i = 0; i < rmax; ++i)
slong i;
for (i = 0; i < FLINT_MIN(M->r, dM->r); ++i)
fmpz_sparse_vec_get_fmpz_vec(dM->rows[i], dM->c, &M->rows[i]);
}

Expand All @@ -254,6 +275,10 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_get_nmod_sparse_mat(nmod_sparse_mat_t Amod, const fmpz_sparse_mat_t A)
{
slong i;
if (Amod->r == 0 && Amod->c == 0)
nmod_sparse_mat_init(Amod, A->r, A->c, Amod->mod);
else
FLINT_ASSERT(A->r == Amod->r && A->c == Amod->c);
for (i = 0; i < A->r; i++)
fmpz_sparse_vec_get_nmod_sparse_vec(&Amod->rows[i], &A->rows[i], Amod->mod);
}
Expand All @@ -262,6 +287,10 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_set_nmod_sparse_mat_unsigned(fmpz_sparse_mat_t A, const nmod_sparse_mat_t Amod)
{
slong i;
if (A->r == 0 && A->c == 0)
fmpz_sparse_mat_init(A, Amod->r, Amod->c);
else
FLINT_ASSERT(A->r == Amod->r && A->c == Amod->c);
for (i = 0; i < A->r; i++)
fmpz_sparse_vec_set_nmod_sparse_vec_unsigned(&A->rows[i], &Amod->rows[i]);
}
Expand All @@ -270,6 +299,10 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_set_nmod_sparse_mat(fmpz_sparse_mat_t A, const nmod_sparse_mat_t Amod)
{
slong i;
if (A->r == 0 && A->c == 0)
fmpz_sparse_mat_init(A, Amod->r, Amod->c);
else
FLINT_ASSERT(A->r == Amod->r && A->c == Amod->c);
for (i = 0; i < A->r; i++)
fmpz_sparse_vec_set_nmod_sparse_vec(&A->rows[i], &Amod->rows[i], Amod->mod);
}
Expand Down Expand Up @@ -328,6 +361,11 @@ void fmpz_sparse_mat_concat_horizontal(fmpz_sparse_mat_t B,
const fmpz_sparse_mat_t M1, const fmpz_sparse_mat_t M2)
{
slong i;
FLINT_ASSERT(M1->r == M2->r);
if (B->r == 0)
fmpz_sparse_mat_init(B, M1->r, 0);
else
FLINT_ASSERT(B->r == M1->r);
B->c = M1->c + M2->c;
for (i = 0; i < B->r; ++i)
fmpz_sparse_vec_concat(&B->rows[i], &M1->rows[i], &M2->rows[i], M1->c);
Expand All @@ -336,6 +374,10 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_concat_vertical (fmpz_sparse_mat_t B, const fmpz_sparse_mat_t M1, const fmpz_sparse_mat_t M2)
{
slong i;
if (B->r == 0)
fmpz_sparse_mat_init(B, M1->r + M2->r, UWORD(0));
else
FLINT_ASSERT(B->r == M1->r + M2->r);
B->c = FLINT_MAX(M1->c, M2->c);
for (i = 0; i < M1->r; ++i)
fmpz_sparse_vec_set(&B->rows[i], &M1->rows[i], M1->c_off);
Expand All @@ -347,6 +389,16 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_split_horizontal (fmpz_sparse_mat_t M1, fmpz_sparse_mat_t M2, const fmpz_sparse_mat_t B, slong c)
{
slong i;
if (M1->r == 0 && M2->r == 0)
{
fmpz_sparse_mat_init(M1, B->r, c);
fmpz_sparse_mat_init(M2, B->r, B->c-c);
}
else
{
FLINT_ASSERT(B->r == M1->r && B->r == M2->r);
M1->c = c, M2->c = B->c - c;
}
for (i = 0; i < B->r; ++i) fmpz_sparse_vec_split(&M1->rows[i], &M2->rows[i], &B->rows[i], c);
}

Expand All @@ -355,6 +407,17 @@ void fmpz_sparse_mat_split_vertical (fmpz_sparse_mat_t M1, fmpz_sparse_mat_t M2,
{
slong i;
r = FLINT_MIN(r, B->r);
if (M1->r == 0 && M2->r == 0)
{
fmpz_sparse_mat_init(M1, r, B->c - B->c_off);
fmpz_sparse_mat_init(M2, B->r - r, B->c - B->c_off);
}
else
{
FLINT_ASSERT(M1->r == r && M2->r == B->r - r);
M1->c = M2->c = B->c - B->c_off;
}

for (i = 0; i < r; ++i) fmpz_sparse_vec_set(&M1->rows[i], &B->rows[i], B->c_off);
for (i = r; i < B->r; ++i) fmpz_sparse_vec_set(&M2->rows[i-r], &B->rows[i], B->c_off);
}
Expand All @@ -373,11 +436,11 @@ void fmpz_sparse_mat_swap_rows(fmpz_sparse_mat_t M, slong * P, slong r, slong s)
}

FMPZ_MAT_INLINE
void fmpz_sparse_mat_invert_rows(fmpz_mat_t M, slong * P)
void fmpz_sparse_mat_invert_rows(fmpz_sparse_mat_t M, slong * P)
{
slong i;
for (i = 0; i < M->r/2; i++)
fmpz_mat_swap_rows(M, P, i, M->r - i - 1);
fmpz_sparse_mat_swap_rows(M, P, i, M->r - i - 1);
}

FMPZ_SPARSE_MAT_INLINE
Expand Down Expand Up @@ -453,20 +516,33 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_neg (fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);

for (i = 0; i < N->r; ++i) fmpz_sparse_vec_neg(&N->rows[i], &M->rows[i]);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_mul_fmpz(fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M, const fmpz_t c)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);
for (i = 0; i < N->r; ++i) fmpz_sparse_vec_scalar_mul_fmpz(&N->rows[i], &M->rows[i], c);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_mul_diag_fmpz(fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M, fmpz * D)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);
for (i = 0; i < N->r; ++i) fmpz_sparse_vec_scalar_mul_fmpz(&N->rows[i], &M->rows[i], &D[i]);
}

Expand All @@ -475,6 +551,10 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_divexact_fmpz(fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M, const fmpz_t c)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);
for (i = 0; i < N->r; ++i) fmpz_sparse_vec_scalar_divexact_fmpz(&N->rows[i], &M->rows[i], c);
}

Expand All @@ -483,13 +563,21 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_mod_fmpz(fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M, const fmpz_t mod)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);
for (i = 0; i < N->r; ++i) fmpz_sparse_vec_scalar_mod_fmpz(&N->rows[i], &M->rows[i], mod);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_mods_fmpz(fmpz_sparse_mat_t N, const fmpz_sparse_mat_t M, const fmpz_t mod)
{
slong i;
if (N->r == 0 && N->c == 0)
fmpz_sparse_mat_init(N, M->r, M->c);
else
FLINT_ASSERT(M->r == N->r && M->c == N->c);
for (i = 0; i < N->r; ++i) fmpz_sparse_vec_scalar_mods_fmpz(&N->rows[i], &M->rows[i], mod);
}

Expand All @@ -498,27 +586,47 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_add (fmpz_sparse_mat_t O, const fmpz_sparse_mat_t M, const fmpz_sparse_mat_t N)
{
slong i;
FLINT_ASSERT(M->r == N->r && M->c == N->c);
if (O->r == 0 && O->c == 0)
fmpz_sparse_mat_init(O, M->r, M->c);
else
FLINT_ASSERT(M->r == O->r && M->c == O->c);
for (i = 0; i < O->r; ++i) fmpz_sparse_vec_add(&O->rows[i], &M->rows[i], &N->rows[i]);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_sub (fmpz_sparse_mat_t O, const fmpz_sparse_mat_t M, const fmpz_sparse_mat_t N)
{
slong i;
FLINT_ASSERT(M->r == N->r && M->c == N->c);
if (O->r == 0 && O->c == 0)
fmpz_sparse_mat_init(O, M->r, M->c);
else
FLINT_ASSERT(M->r == O->r && M->c == O->c);
for (i = 0; i < O->r; ++i) fmpz_sparse_vec_sub(&O->rows[i], &M->rows[i], &N->rows[i]);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_addmul_fmpz(fmpz_sparse_mat_t O, const fmpz_sparse_mat_t M, const fmpz_sparse_mat_t N, const fmpz_t c)
{
slong i;
FLINT_ASSERT(M->r == N->r && M->c == N->c);
if (O->r == 0 && O->c == 0)
fmpz_sparse_mat_init(O, M->r, M->c);
else
FLINT_ASSERT(M->r == O->r && M->c == O->c);
for (i = 0; i < O->r; ++i) fmpz_sparse_vec_scalar_addmul_fmpz(&O->rows[i], &M->rows[i], &N->rows[i], c);
}

FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_scalar_submul_fmpz(fmpz_sparse_mat_t O, const fmpz_sparse_mat_t M, const fmpz_sparse_mat_t N, const fmpz_t c)
{
slong i;
FLINT_ASSERT(M->r == N->r && M->c == N->c);
if (O->r == 0 && O->c == 0)
fmpz_sparse_mat_init(O, M->r, M->c);
else
FLINT_ASSERT(M->r == O->r && M->c == O->c);
for (i = 0; i < O->r; ++i) fmpz_sparse_vec_scalar_submul_fmpz(&O->rows[i], &M->rows[i], &N->rows[i], c);
}

Expand All @@ -535,6 +643,11 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_mul_fmpz_mat (fmpz_mat_t Y, const fmpz_sparse_mat_t M, const fmpz_mat_t X)
{
slong i, j;
FLINT_ASSERT(M->c == X->r);
if (Y->r == 0 && Y->c == 0)
fmpz_mat_init(Y, M->r, X->c);
else
FLINT_ASSERT(M->r == Y->r && X->c == Y->c);
fmpz_mat_zero (Y);
for (i = 0; i < M->r; ++i)
{
Expand All @@ -550,6 +663,11 @@ FMPZ_SPARSE_MAT_INLINE
void fmpz_sparse_mat_mul (fmpz_sparse_mat_t Y, const fmpz_sparse_mat_t M, const fmpz_sparse_mat_t X)
{
slong i, j;
FLINT_ASSERT(M->c == X->r);
if (Y->r == 0 && Y->c == 0)
fmpz_sparse_mat_init(Y, M->r, X->c);
else
FLINT_ASSERT(M->r == Y->r && X->c == Y->c);
fmpz_sparse_mat_zero (Y);
for (i = 0; i < M->r; ++i)
{
Expand Down
20 changes: 20 additions & 0 deletions fq_sparse_mat_templates.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,26 @@ void TEMPLATE(T, sparse_mat_clear) (TEMPLATE(T, sparse_mat_t) M, const TEMPLATE(
memset(M, 0, sizeof(*M));
}

FQ_SPARSE_MAT_TEMPLATES_INLINE
void TEMPLATE(T, sparse_mat_resize) (TEMPLATE(T, sparse_mat_t) M, slong rows, slong cols, const TEMPLATE(T, ctx_t) ctx)
{
slong i;
if (rows == 0)
{
TEMPLATE(T, sparse_mat_clear)(M, ctx);
}
else
{
for (i = rows; i < M->r; ++i)
TEMPLATE(T, sparse_vec_clear)(&M->rows[i], ctx);
M->rows = flint_realloc(M->rows, rows*sizeof(*M->rows));
for (i = M->r; i < rows; ++i)
TEMPLATE(T, sparse_vec_init)(&M->rows[i], ctx);
}
M->c = cols;
M->r = rows;
}

/* Swap */
FQ_SPARSE_MAT_TEMPLATES_INLINE
void TEMPLATE(T, sparse_mat_swap) (TEMPLATE(T, sparse_mat_t) M1, TEMPLATE(T, sparse_mat_t) M2, const TEMPLATE(T, ctx_t) ctx)
Expand Down
20 changes: 20 additions & 0 deletions nmod_sparse_mat.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ void nmod_sparse_mat_clear(nmod_sparse_mat_t M)
memset(M, 0, sizeof(*M));
}

NMOD_SPARSE_MAT_INLINE
void nmod_sparse_mat_resize (nmod_sparse_mat_t M, slong rows, slong cols)
{
slong i;
if (rows == 0)
{
nmod_sparse_mat_clear(M);
}
else
{
for (i = rows; i < M->r; ++i)
nmod_sparse_vec_clear(&M->rows[i]);
M->rows = flint_realloc(M->rows, rows*sizeof(*M->rows));
for (i = M->r; i < rows; ++i)
nmod_sparse_vec_init(&M->rows[i]);
}
M->c = cols;
M->r = rows;
}

/* Swap */
NMOD_SPARSE_MAT_INLINE
void nmod_sparse_mat_swap(nmod_sparse_mat_t M1, nmod_sparse_mat_t M2)
Expand Down
3 changes: 1 addition & 2 deletions nmod_sparse_mat/fprint.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,8 @@ int nmod_sparse_mat_fprint(FILE * file, const nmod_sparse_mat_t M)
int nmod_sparse_mat_fprint_pretty(FILE * file, const nmod_sparse_mat_t M)
{
int z;
slong i, j;
slong i;
slong r = M->r;
slong c = M->c;

if ((z = fputc('[', file)) <= 0) return z;
for (i = 0; i < r; i++)
Expand Down

0 comments on commit 8bbe943

Please sign in to comment.