import numpy as np
import pandas as pd
import sys
import symnmf_c as symnmf
np.random.seed(1234)
def init_h(n, k, m):
"""
Initialize the H matrix.
Args:
n (int): Number of data points (rows).
k (int): Number of clusters (columns).
m (float): Mean value of the norm matrix.
Returns:
numpy.ndarray: Randomly initialized H matrix of shape (n, k).
"""
return np.random.uniform(
low=0.0,
high=2 * np.sqrt(m/k),
size=(n, k)
)
def m_val(norm_matrix):
"""
Returns the mean value of the norm matrix.
Args:
norm_matrix (numpy.ndarray): Norm matrix.
Returns:
float: Mean of norm_matrix.
"""
m = np.mean(norm_matrix)
return m
def ex_funcs(goal_str, p_matrix, n, k):
"""
Returns a matrix based on requested operation.
Args:
goal_str (str): Type of matrix to compute based on user's input.
p_matrix (list[list[float]]): Input points array.
n (int): Number of data points.
k (int): Number of clusters.
Returns:
list[list[float]]: requested matrix.
"""
match goal_str:
case "sym":
a_mat = symnmf.sym(p_matrix)
return a_mat
case "ddg":
d_mat = symnmf.ddg(p_matrix)
return d_mat
case "norm":
norm_mat = symnmf.norm(p_matrix)
return norm_mat
case _:
norm = symnmf.norm(p_matrix)
norm_mat = np.array(norm)
m = m_val(norm_mat)
h_in = init_h(n, k, m)
h_mat = symnmf.symnmf(h_in.tolist(), norm, n, k)
return h_mat
def print_d(mat, n):
"""
Print the Diagonal Degree matrix given its diagonal values.
Args:
mat (np.ndarray): 1D array of Diagonal values.
n (int): Number of data points.
Returns:
None
"""
for i in range(n):
for j in range(n):
if i == j:
print(f"{mat[i]:.4f}", end="")
else:
print("0.0000", end="")
if j < n - 1:
print(",", end="")
print()
def main():
try:
args = sys.argv
k = int(args[1])
goal = args[2]
filename = args[3]
file = pd.read_csv(filename, header=None)
points_arr = file.to_numpy()
n = points_arr.shape[0]
points = points_arr.tolist()
res = ex_funcs(goal, points, n, k)
res_mat = np.array(res)
if(goal == "ddg"):
print_d(res_mat, n)
else:
for row in res_mat:
print(','.join(f"{val:.4f}" for val in row))
except Exception as e:
print("An Error Has Occurred")
if __name__ == "__main__":
main()