Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Check if set of vectors constitute a tight frame #561

Open
vprusso opened this issue Apr 20, 2024 · 2 comments
Open

Feature: Check if set of vectors constitute a tight frame #561

vprusso opened this issue Apr 20, 2024 · 2 comments
Labels
feature request good first issue Good for newcomers help wanted Extra attention is needed
Milestone

Comments

@vprusso
Copy link
Owner

vprusso commented Apr 20, 2024

Provide a function that takes in as input a matrix (as a numpy array) and returns True if the matrix constitutes an equilangular tight frame and False otherwise.

A function like the following could be written:

import numpy as np


def is_etf(mat: np.ndarray) -> bool:
    """Determine if matrix forms an equilangular tight frame (ETF).
    
    Definition taken from the condition of:
    http://users.cms.caltech.edu/~jtropp/conf/Tro05-Complex-Equiangular-SPIE-preprint.pdf
    """
    # Each column has unit norm.
    nrows, ncols = mat.shape[0], mat.shape[1]
    for col in range(ncols):
        if not np.isclose(np.linalg.norm(mat[:][col]), 1):
            return False
    
    # Columns are equilangular.
    vals = []
    for i in range(ncols):
        for j in range(ncols):
            if i != j:                
                vals.append(np.abs(inner_product(mat[:][i], mat[:][j])))
    if len(set(vals)) > 1:
        return False
    
    # Matrix forms a tight frame.
    return np.allclose(mat @ mat.conj().T, (ncols / nrows) * np.identity(nrows * ncols))

One would also need to provide proper documentation, examples, and unit tests for this function.

Additional Option

Provide a function that takes in as input a matrix (as a numpy array) and returns True if the set of vectors constitute as a tight frame and False otherwise.

A function like the following could be written:

import numpy as np


def is_tight_frame(vectors: list[np.ndarray]) -> bool:
    """Check if list of vectors constitutes a tight frame."""
    n, d = len(vectors), vectors[0].shape[0]
    col_sum = 0
    for i in range(n):
        col_sum += np.linalg.norm(vectors[i])
    return np.isclose(sum(overlaps(vectors)), 1/np.sqrt(d) * col_sum**2)

One would also need to provide proper documentation, examples, and unit tests for this function.

Note that this requires the overlaps function to be defined from:
#556

@vprusso vprusso added help wanted Extra attention is needed good first issue Good for newcomers feature request labels Apr 20, 2024
@purva-thakre purva-thakre modified the milestones: v1.0.8, v1.0.9 Jun 22, 2024
@purva-thakre purva-thakre self-assigned this Aug 3, 2024
@purva-thakre
Copy link
Collaborator

@vprusso Do we want to combine this issue and #562 into 1 issue?

@vprusso
Copy link
Owner Author

vprusso commented Aug 7, 2024

Yeah, I think combining these two makes sense.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request good first issue Good for newcomers help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants