#include "gr.h"
#include "gr_mat.h"
int
gr_mat_add_scalar(gr_mat_t res, const gr_mat_t mat, gr_srcptr x, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_scalar_add(gr_mat_t res, gr_srcptr x, const gr_mat_t mat, gr_ctx_t ctx)
{
return gr_mat_add_scalar(res, mat, x, ctx);
}
int
gr_mat_add_scalar_other(gr_mat_t res, const gr_mat_t mat, gr_srcptr x, gr_ctx_t x_ctx, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add_other(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, x_ctx, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add_other(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, x_ctx, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_scalar_other_add(gr_mat_t res, gr_srcptr x, gr_ctx_t x_ctx, const gr_mat_t mat, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_other_add(GR_MAT_ENTRY(res, i, i, sz), x, x_ctx, GR_MAT_ENTRY(res, i, i, sz), ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_other_add(GR_MAT_ENTRY(res, i, j, sz), x, x_ctx, GR_MAT_ENTRY(mat, i, j, sz), ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_add_ui(gr_mat_t res, const gr_mat_t mat, ulong x, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add_ui(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add_ui(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_add_si(gr_mat_t res, const gr_mat_t mat, slong x, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add_si(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add_si(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_add_fmpz(gr_mat_t res, const gr_mat_t mat, const fmpz_t x, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add_fmpz(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add_fmpz(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}
int
gr_mat_add_fmpq(gr_mat_t res, const gr_mat_t mat, const fmpq_t x, gr_ctx_t ctx)
{
slong i, j, r, c;
slong sz = ctx->sizeof_elem;
int status = GR_SUCCESS;
r = gr_mat_nrows(res, ctx);
c = gr_mat_ncols(res, ctx);
if (res == mat)
{
for (i = 0; i < FLINT_MIN(r, c); i++)
status |= gr_add_fmpq(GR_MAT_ENTRY(res, i, i, sz), GR_MAT_ENTRY(res, i, i, sz), x, ctx);
}
else
{
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (i == j)
status |= gr_add_fmpq(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), x, ctx);
else
status |= gr_set(GR_MAT_ENTRY(res, i, j, sz), GR_MAT_ENTRY(mat, i, j, sz), ctx);
}
}
}
return status;
}