#include "gr_vec.h"
#include "gr_mat.h"
#include "perm.h"
int
gr_mat_permute_rows(gr_mat_t mat, slong * perm_store, const slong * perm_act, gr_ctx_t ctx)
{
int status = GR_SUCCESS;
slong i;
slong sz = ctx->sizeof_elem;
gr_mat_t mat_tmp;
mat_tmp->entries = GR_TMP_ALLOC(mat->r * mat->c * sz);
mat_tmp->r = mat->r;
mat_tmp->c = mat->c;
mat_tmp->stride = mat->stride;
for (i = 0; i < mat->r; i++)
_gr_vec_set_shallow(GR_MAT_ENTRY(mat_tmp, i, 0, sz), GR_MAT_ENTRY(mat, perm_act[i], 0, sz), mat->c, ctx);
for (i = 0; i < mat->r; i++)
_gr_vec_set_shallow(GR_MAT_ENTRY(mat, i, 0, sz), GR_MAT_ENTRY(mat_tmp, i, 0, sz), mat->c, ctx);
GR_TMP_FREE(mat_tmp->entries, mat->r * mat->c * sz);
if (perm_store)
_perm_compose(perm_store, perm_store, perm_act, mat->r);
return status;
}
int
gr_mat_permute_rows_inv(gr_mat_t mat, slong * perm_store, const slong * perm_act, gr_ctx_t ctx)
{
int status = GR_SUCCESS;
slong i;
slong sz = ctx->sizeof_elem;
gr_mat_t mat_tmp;
mat_tmp->entries = GR_TMP_ALLOC(mat->r * mat->c * sz);
mat_tmp->r = mat->r;
mat_tmp->c = mat->c;
mat_tmp->stride = mat->stride;
for (i = 0; i < mat->r; i++)
_gr_vec_set_shallow(GR_MAT_ENTRY(mat_tmp, perm_act[i], 0, sz), GR_MAT_ENTRY(mat, i, 0, sz), mat->c, ctx);
for (i = 0; i < mat->r; i++)
_gr_vec_set_shallow(GR_MAT_ENTRY(mat, i, 0, sz), GR_MAT_ENTRY(mat_tmp, i, 0, sz), mat->c, ctx);
GR_TMP_FREE(mat_tmp->entries, mat->r * mat->c * sz);
if (perm_store)
_perm_compose_inv2(perm_store, perm_store, perm_act, mat->r);
return status;
}