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);
}
Example #2
0
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);
}