#!/bin/sh

if [ -z "$2" ]
then
    printf "Usage: $0 tensor constrained-dim [min-membership-degree]

Every line in tensor must be either empty or specify a tuple and its
membership degree, all space-separated.  No repeated tuple is allowed.

By default, min-membership-degree is the density of tensor.
" 1>&2
    exit 64
fi

if [ $2 -lt 1 ]
then
    printf "constrained-dim must be an integer greater or equal to 1.
"
    exit 64
fi

if [ -z "$3" ]
then
    min=$(gawk '
{
    for (i = 1; i < NF; ++i)
        dim[i][$i]
    sum += $NF }

END {
    for (i in dim)
        sum /= length(dim[i])
    print sum }' "$1")
else
    min=$3
fi

# if [ -x /usr/bin/gawk ]
# then
    gawk -v i=$2 -v min=$min '
function dim_as_string() {
    dim = ""
    for (f in a[e][j])
	dim = dim "," f
    return substr(dim, 2) }

i < NF && $NF > min {
    for (j = 1; j != i; ++j)
	a[$i][j][$j]
    while (++j != NF)
	a[$i][j][$j] }

END {
    for (e in a) {
	for (j = 1; j != i; ++j)
	    printf "%s ", dim_as_string()
	printf "%s", e
	while (++j != NF)
	    printf " %s", dim_as_string()
	print "" } }' "$1"
    exit
# fi

# awk -v i=$2 -v min=$min '
# function print_dim(k) {
#     printf "%s", b[k]
#     c[b[k]]
#     for (k += NF - 2; k <= n; k += NF - 2)
# 	if (!(b[k] in c)) {
# 	    printf ",%s", b[k]
# 	    c[b[k]] }
#     delete c }

# i < NF && $NF > min {
#     for (j = 1; j != i; ++j)
# 	a[$i] = a[$i] FS $j
#     while (++j != NF)
# 	a[$i] = a[$i] FS $j }

# END {
#     for (e in a) {
# 	n = split(a[e], b)
# 	for (j = 1; j != i; ++j) {
# 	    print_dim(j)
# 	    printf " " }
# 	printf "%s", e
# 	while (++j != NF) {
# 	    printf " "
# 	    print_dim(j - 1) }
# 	print "" } }' "$1"
