void construct_C2_i(polymatrix_t *game, strategy_profile_t *x, int *scount, int i, int sKx, int k, double *b, matrix_t *C2) { int j; C2->data[k][0] = -1; C2->data[k][k + 1] = 1; matrix_t *vi = polymatrix_compute_vi(game, x, i); matrix_t *xt = matrix_trans(x->strategies[i]); matrix_t *u = matrix_mul_vec_mat(xt, vi); *b = -u->data[0][0]; matrix_free(u); int c_off = sKx + 1; for (j = 0; j < game->players; ++j) { matrix_t *Ax; //printf("+++x++\n"); //matrix_print(matrix_trans(x->strategies[j])); if (i == j) { Ax = matrix_trans(vi); matrix_mul_const_in(Ax, -1); } else if (game->payoffs[i][j]) { Ax = matrix_mul_vec_mat(xt, game->payoffs[i][j]); matrix_mul_const_in(Ax, -1); } else { Ax = matrix_alloc(1, scount[j]); } matrix_copy_to_offset(C2, Ax, i, c_off); c_off += Ax->ncols; matrix_free(Ax); } matrix_free(vi); matrix_free(xt); }
int sa_lu_psinvert(double **out, double **in, int m, int n) { int rv = 0; double **tr; double **sq; tr = dmatrix(0, n-1, 0, m-1); matrix_trans(tr, in, m, n); if (m > n) { sq = dmatrix(0, n-1, 0, n-1); if ((rv = matrix_mult(sq, n, n, tr, n, m, in, m, n)) == 0) { if ((rv = sa_lu_invert(sq, n)) == 0) { rv = matrix_mult(out, n, m, sq, n, n, tr, n, m); } } free_dmatrix(sq, 0, n-1, 0, n-1); } else { sq = dmatrix(0, m-1, 0, m-1); if ((rv = matrix_mult(sq, m, m, in, m, n, tr, n, m)) == 0) { if ((rv = sa_lu_invert(sq, m)) == 0) { rv = matrix_mult(out, n, m, tr, n, m, sq, m, m); } } free_dmatrix(sq, 0, m-1, 0, m-1); } free_dmatrix(tr, 0, n-1, 0, m-1); return rv; }
void bayesian_set_game(bayesian_t *game, int i, int j, matrix_t **bimat) { game->payoffs[i][j] = matrix_copy(bimat[0]); game->payoffs[j+game->m][i] = matrix_trans(bimat[1]); matrix_free(bimat[0]); matrix_free(bimat[1]); free(bimat); }