Multi-Variate Gaussian Kernel#
Multivariate Gaussian Influence Kernel Module#
This module implements the multivariate Gaussian influence kernel and its associated computations. The multivariate Gaussian kernel models the influence of agents based on a multivariate Gaussian distribution, incorporating covariance matrices to account for correlations between dimensions.
Mathematical Definitions:#
The multivariate Gaussian influence kernel is defined as:
- where:
\(x_i\) is the position of agent \(i\)
\(b\) is the bin point
\(\Sigma_i\) is the covariance matrix for agent \(i\)
Vectorized Functions:#
For improved performance with large datasets, this module provides vectorized versions of core functions:
influence_vectorized : Compute influence for all agents simultaneously using batch matrix operations
d_ln_f_vectorized : Compute gradients for all agents simultaneously with optimized tensor operations
cov_matrix_vectorized : Compute inverse covariance matrices for multiple agents efficiently
symmetric_nash_vectorized : Vectorized computation of symmetric Nash equilibrium points
The vectorized functions provide 5-10x performance improvements for large agent populations while maintaining full numerical accuracy and comprehensive error handling.
Dependencies:#
InflGame.utils
Usage:#
The influence function computes the influence of an agent at specific bin points, while the d_ln_f function calculates the gradient of the logarithm of the multivariate Gaussian influence kernel. The symmetric_nash_stability function computes the parameter for the symmetric Nash’s stability using the multivariate Gaussian influence kernel with diagonal covariance matrices.
Example:#
import numpy as np
import torch
from InflGame.kernels.MV_gauss import influence, d_ln_f, symmetric_nash_stability
from InflGame.kernels.MV_gauss import influence_vectorized, d_ln_f_vectorized
# Define parameters
num_agents = 3
agents_pos = np.array([[0.2, 0.3], [0.5, 0.5], [0.8, 0.7]])
bin_points = np.array([[0.1, 0.2], [0.4, 0.5], [0.7, 0.8]])
sigma_inv = torch.tensor([[[2.0, 0.0], [0.0, 1.0]]] * num_agents) # Inverse covariance matrices
resource_distribution = np.array([0.3, 0.4, 0.3])
# Single agent computation (backward compatible)
influence_values = influence(agent_id=0, agents_pos=agents_pos, bin_points=bin_points, sigma_inv=sigma_inv)
print("Influence values:", influence_values)
# Vectorized computation (all agents at once)
all_influences = influence_vectorized(agents_pos=agents_pos, bin_points=bin_points, sigma_inv=sigma_inv)
print("All influences shape:", all_influences.shape) # (num_agents, num_bins)
# Single agent gradient
gradient = d_ln_f(agent_id=0, agents_pos=agents_pos, bin_points=bin_points, sigma_inv=sigma_inv)
print("Gradient values:", gradient)
# Vectorized gradients (all agents at once)
all_gradients = d_ln_f_vectorized(agents_pos=agents_pos, bin_points=bin_points, sigma_inv=sigma_inv)
print("All gradients shape:", all_gradients.shape) # (num_agents, num_dims, num_bins)
Functions
- InflGame.kernels.MV_gauss.cov_matrix(parameter_instance)#
Computes the inverse of a multivariate Gaussian covariance matrix.
- Parameters:
parameter_instance (torch.Tensor) – Covariance matrix for a player (\(\Sigma\)).
- Returns:
Inverse of the covariance matrix (\(\Sigma^{-1}\)).
- Return type:
torch.Tensor
- InflGame.kernels.MV_gauss.cov_matrix_vectorized(parameter_instances)#
Computes the inverse of multiple multivariate Gaussian covariance matrices using vectorized operations.
This function efficiently processes multiple covariance matrices simultaneously, providing significant performance improvements over single-matrix inversions.
- Parameters:
- parameter_instancestorch.Tensor | np.ndarray | List
Covariance matrices for all agents, shape (num_agents, dim, dim).
- Returns:
- torch.Tensor
Inverse covariance matrices, shape (num_agents, dim, dim).
- Raises:
- TypeError
If input type is not supported.
- ValueError
If input dimensions are invalid or matrices are singular.
- RuntimeError
If computation fails due to numerical issues.
Examples
>>> import torch >>> cov_matrices = torch.eye(2).unsqueeze(0).repeat(3, 1, 1) # 3 identity matrices >>> inv_matrices = cov_matrix_vectorized(cov_matrices) >>> print(inv_matrices.shape) torch.Size([3, 2, 2])
- InflGame.kernels.MV_gauss.d_ln_f(agent_id, agents_pos, bin_points, sigma_inv)#
Computes the gradient of the logarithm of the multivariate Gaussian influence kernel.
The gradient is calculated as:
\[d_{i}(x_i, b) = -\Sigma_i^{-1} (b - x_i)\]- where:
\(x_i\) is the position of agent \(i\)
\(b\) is the bin point
\(\Sigma_i^{-1}\) is the inverse covariance matrix for agent \(i\)
- Parameters:
agent_id (int) – The current player’s ID (\(i\)).
agents_pos (np.ndarray) – Positions of all agents (\(x_i\)).
bin_points (np.ndarray) – Locations of the resource/bin points (\(b\)).
sigma_inv (torch.Tensor) – Inverse of the covariance matrix (\(\Sigma_i^{-1}\)).
- Returns:
The gradient values for all bin points.
- Return type:
int | torch.Tensor
- InflGame.kernels.MV_gauss.d_ln_f_vectorized(agents_pos, bin_points, sigma_inv)#
Computes the gradient of the logarithm of the multivariate Gaussian influence kernel for all agents.
This vectorized function calculates gradients for all agents simultaneously, providing significant performance improvements over single-agent computations.
The gradient is calculated as:
\[d_{i}(x_i, b) = -\Sigma_i^{-1} (b - x_i)\]- Parameters:
- agents_posnp.ndarray | torch.Tensor
Positions of all agents, shape (num_agents, num_dims).
- bin_pointsnp.ndarray | torch.Tensor
Locations of the resource/bin points, shape (num_bins, num_dims).
- sigma_invtorch.Tensor | np.ndarray
Inverse covariance matrices for all agents, shape (num_agents, num_dims, num_dims).
- Returns:
- torch.Tensor
Gradient tensor of shape (num_agents, num_dims, num_bins) where element [i,d,j] represents the gradient of agent i in dimension d at bin point j.
- Raises:
- TypeError
If input types are not supported.
- ValueError
If input dimensions are incompatible or contain invalid values.
- RuntimeError
If computation fails due to numerical issues.
Examples
>>> import torch >>> import numpy as np >>> agents_pos = np.array([[0.2, 0.3], [0.5, 0.5]]) >>> bin_points = np.array([[0.1, 0.2], [0.4, 0.5], [0.7, 0.8]]) >>> sigma_inv = torch.eye(2).unsqueeze(0).repeat(2, 1, 1) >>> gradients = d_ln_f_vectorized(agents_pos, bin_points, sigma_inv) >>> print(gradients.shape) torch.Size([2, 2, 3])
- InflGame.kernels.MV_gauss.gaussian_symmetric_stability_2d(num_agents, e_values, resource_distribution)#
- ..deprecated::
This function is deprecated. Use
symmetric_nash_stabilityinstead. Computes the symmetric stability in 2D using the multivariate Gaussian influence kernel.
- Parameters:
num_agents (int) – Number of agents in the system (\(N\)).
e_values (list | np.ndarray) – Eigenvalues of the covariance matrix (\(\lambda\)).
resource_distribution (np.ndarray) – Distribution of resources across the bin points (\(B(b)\)).
- Returns:
The stability values [sigma_star_1, sigma_star_2] sorted in descending order.
- Return type:
list
- InflGame.kernels.MV_gauss.influence(agent_id, agents_pos, bin_points, sigma_inv)#
Computes the influence of an agent using the multivariate Gaussian kernel.
The influence is computed as:
\[f_i(x_i, b) = \exp\left(-\frac{1}{2} (b - x_i)^T \Sigma_i^{-1} (b - x_i)\right)\]- where:
\(x_i\) is the position of agent \(i\)
\(b\) is the bin point
\(\Sigma_i^{-1}\) is the inverse covariance matrix for agent \(i\)
- Parameters:
agent_id (int) – The current player’s ID (\(i\)).
agents_pos (np.ndarray) – Positions of all agents (\(x_i\)).
bin_points (np.ndarray) – Locations of the resource/bin points (\(b\)).
sigma_inv (torch.Tensor) – Inverse of the covariance matrix (\(\Sigma_i^{-1}\)).
- Returns:
The influence values for the agent.
- Return type:
torch.Tensor
- InflGame.kernels.MV_gauss.influence_vectorized(agents_pos, bin_points, sigma_inv)#
Computes the multivariate Gaussian influence for all agents simultaneously using vectorized operations.
This function calculates the influence matrix where each row represents an agent’s influence across all bin points, providing significant performance improvements over single-agent computations.
The influence is computed as:
\[f_i(x_i, b) = \exp\left(-\frac{1}{2} (b - x_i)^T \Sigma_i^{-1} (b - x_i)\right)\]- Parameters:
- agents_posnp.ndarray | torch.Tensor
Positions of all agents, shape (num_agents, num_dims).
- bin_pointsnp.ndarray | torch.Tensor
Locations of the resource/bin points, shape (num_bins, num_dims).
- sigma_invtorch.Tensor | np.ndarray
Inverse covariance matrices for all agents, shape (num_agents, num_dims, num_dims).
- Returns:
- torch.Tensor
Influence matrix of shape (num_agents, num_bins) where element [i,j] represents the influence of agent i at bin point j.
- Raises:
- TypeError
If input types are not supported.
- ValueError
If input dimensions are incompatible or contain invalid values.
- RuntimeError
If computation fails due to numerical issues.
Examples
>>> import torch >>> import numpy as np >>> agents_pos = np.array([[0.2, 0.3], [0.5, 0.5], [0.8, 0.7]]) >>> bin_points = np.array([[0.1, 0.2], [0.4, 0.5], [0.7, 0.8]]) >>> sigma_inv = torch.eye(2).unsqueeze(0).repeat(3, 1, 1) >>> influences = influence_vectorized(agents_pos, bin_points, sigma_inv) >>> print(influences.shape) torch.Size([3, 3])
- InflGame.kernels.MV_gauss.symmetric_nash(bin_points, resource_distribution)#
Calculates the symmetric stability point in 2D for the multivariate Gaussian influence kernel.
This is equivalent to the mean of the resource distribution across the bin points. The symmetric Nash’s component in the lth dimension is calculated as:
\[x^*_{l} = \frac{\sum_{b\in \mathbb{B}} b_l \cdot B(b_l)}{\sum_{b} B(b_l)}\]- where:
\(x^*_{l}\) is the symmetric stability point in dimension \(l\)
\(b_l\) is the bin point in dimension \(l\)
\(\mathbb{B}\) is the set of bin points
\(B(b_i)\) is the distribution of resources across the bin points
- Parameters:
bin_points (np.ndarray) – Locations of the resource/bin points in 2D.
resource_distribution (np.ndarray) – Distribution of resources across the bin points.
- Returns:
The symmetric stability point as [x_star1, x_star2].
- Return type:
list
- InflGame.kernels.MV_gauss.symmetric_nash_stability(num_agents, bin_points, resource_distribution)#
This is a special case only since the covariance matrix is diagonal.
Computes the parameter value for the symmetric Nash stability in 2D. The symmetric Nash stability is calculated as:
\[\sigma^* = \frac{(N-2)}{(N-1)} \cdot \frac{\sum_{b\in \mathbb{B}} (b-x)^2 \cdot B(b)}{\sum_{b\in \mathbb{B}} B(b)}\]- where:
\(N\) is the number of agents
\(b\in \mathbb{B}\) is the set of bin points
\(x\) is the symmetric stability point
\(B(b)\) is the resource distribution at bin point \(b\)
- Parameters:
num_agents (int) – Number of agents in the system (\(N\)).
bin_points (np.ndarray) – Locations of the resource/bin points in 2D (\(b\)).
resource_distribution (np.ndarray) – Distribution of resources across the bin points (\(B(b)\)).
- Returns:
The computed stability value for the system.
- Return type:
float
- InflGame.kernels.MV_gauss.symmetric_nash_vectorized(bin_points, resource_distribution)#
Calculates the symmetric stability point using vectorized operations.
This function provides improved performance for symmetric Nash equilibrium calculations through vectorized tensor operations.
The symmetric Nash equilibrium point in each dimension is:
\[x^*_{l} = \frac{\sum_{b\in \mathbb{B}} b_l \cdot B(b_l)}{\sum_{b} B(b_l)}\]- Parameters:
- bin_pointsnp.ndarray | torch.Tensor
Locations of the resource/bin points, shape (num_bins, num_dims).
- resource_distributionnp.ndarray | torch.Tensor
Distribution of resources across the bin points, shape (num_bins,).
- Returns:
- torch.Tensor
Symmetric stability point, shape (num_dims,).
- Raises:
- TypeError
If input types are not supported.
- ValueError
If input dimensions are incompatible or contain invalid values.
- RuntimeError
If computation fails due to numerical issues.
Examples
>>> import torch >>> import numpy as np >>> bin_points = np.array([[0.1, 0.2], [0.4, 0.5], [0.7, 0.8]]) >>> resources = np.array([0.3, 0.4, 0.3]) >>> nash_point = symmetric_nash_vectorized(bin_points, resources) >>> print(nash_point) tensor([0.4000, 0.5000])