# -*- coding: utf-8 -*-
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE.txt', which is part of this source code package.
#
from numpy.typing import NDArray
import numpy as np
[docs]
def fullMetric(metric: NDArray) -> NDArray:
"""Convert upper triangular coeff metric (mmg format) to complete SDP metric
Parameters
----------
metric : NDArray
a field of metrics
a metric is a vector containing the dim2 = dim*(dim+1)/2 coefficients of the symmetric definite positive matrix
Returns
-------
metric : NDArray
a field of complete SDP matrices
"""
if len(metric.shape) == 1:
metric = metric[np.newaxis, :]
siz = metric.shape[0]
dimF = metric.shape[1]
if dimF == 3:
met = np.array([[metric[:, 0], metric[:, 1]], [metric[:, 1], metric[:, 2]]]).T
elif dimF == 6:
met = np.array([[metric[:, 0], metric[:, 1], metric[:, 3]], [metric[:, 1], metric[:, 2], metric[:, 4]], [metric[:, 3], metric[:, 4], metric[:, 5]]]).T
elif dimF == 1:
met = np.array([metric[:, 0]]).T
if siz == 1:
return met[0]
return met
[docs]
def flattenMetric(metric: NDArray) -> NDArray:
"""Convert complete SDP metric to upper triangular coeff metric (mmg format)
Parameters
----------
metric : NDArray
a field of complete SDP metric
Returns
-------
metric : NDArray
a field of metrics
a metric is a vector containing the dim2 = dim*(dim+1)/2 coefficients of the symmetric definite positive matrix
"""
if len(metric.shape) == 2:
metric = metric[np.newaxis, :]
siz = metric.shape[0]
dim = metric.shape[1]
if dim == 3:
met = np.array([metric[:, 0, 0], metric[:, 1, 0], metric[:, 1, 1], metric[:, 2, 0], metric[:, 2, 1], metric[:, 2, 2]]).T
elif dim == 2:
met = np.array([metric[:, 0, 0], metric[:, 1, 0], metric[:, 1, 1]]).T
elif dim == 1:
met = np.array([metric[:, 0, 0]]).T
if siz == 1:
return met[0]
return met
[docs]
def CheckIntegrity(GUI = False):
fumet1 = np.array([[2, 1],[1, 3]])
met1 = flattenMetric(fumet1)
fumet = fullMetric(met1)
if (fumet1 != fumet).any():
raise ValueError("flattenMetric and fullMetric do not keep the metric")
fumet2 = np.array([[2, 1, 4],[1, 3, 6],[4, 6, 1]])
met2 = flattenMetric(fumet2)
fumet = fullMetric(met2)
if (fumet2 != fumet).any():
raise ValueError("flattenMetric and fullMetric do not keep the metric")
fumet3 = np.array([[2]])
met3 = flattenMetric(fumet3)
fumet = fullMetric(met3)
if (fumet3 != fumet).any():
raise ValueError("flattenMetric and fullMetric do not keep the metric")
return "ok"
if __name__ == '__main__':
print(CheckIntegrity())