Skip to content
Snippets Groups Projects

Testcase Generator for Toeplitz Extractor

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Joakim Argillander

    Generates testcases, all in one file, for Toeplitz extraction.

    Edited
    testcase-generator.py 4.56 KiB
    ############################################
    # This script generates a random Toeplitz matrix and a random vector, and multiplies them together.
    # The matrix and vector can be binary or not.
    # The script is used to generate test cases for the hardware implementation of the Toeplitz matrix-vector multiplication.
    # The generated test cases are saved in a file.
    # The script is used as follows:
    #
    #
    # usage: testcase-generator.py [-h] [-n CASES] [-j MINDIM] [-k MAXDIM] [-o OUTPUT] [-b BINARY] [-v]
    # Generate test cases for the Toeplitz matrix-vector multiplication 
    # options:
    #  -h, --help            show this help message and exit
    #  -n CASES, --cases CASES
    #                        Number of test cases to generate
    #  -j MINDIM, --mindim MINDIM
    #                        Minimum dimension of the Toeplitz matrix
    #  -k MAXDIM, --maxdim MAXDIM
    #                        Maximum dimension of the Toeplitz matrix
    #  -o OUTPUT, --output OUTPUT
    #                        Name of the file to save the test cases
    #  -b BINARY, --binary BINARY
    #                        Boolean indicating if the matrix and vector should be binary
    #  -v, --verbose         Boolean indicating if the matrices should be printed
    ############################################
    
    
    import numpy as np
    import sys
    import argparse
     
    """The following function generates a random n x m binary Toeplitz matrix. Takes the parameter 'binary' to indicate if the vector should be binary."""
    def generate_toeplitz(n, m, binary=True):
        # Generate a random vector of length n
        vector = np.random.randint(2, size=n) if binary else np.random.randint(100, size=n)
        
        # Generate the Toeplitz matrix
        matrix = np.zeros((n, m))
        for i in range(n):
            for j in range(m):
                if i > j:
                    matrix[i][j] = vector[i-j]
                else:
                    matrix[i][j] = vector[j-i]
        return matrix
    
    
    """Generate a random n x 1 vector. Takes the parameter binary to indicate if the vector should be binary"""
    def generate_vector(n, binary=True):
        if binary:
            return np.random.randint(0, 2, n)
        else:
            return np.random.randint(0, 255, n)
    
    
    
    
    """Helper function to pretty print matrices"""
    def print_matrix(matrix):
        for row in matrix:
            print(row)
        print("\n")
    
    """Multiply a matrix by a vector. Takes the parameter binary to indicate if the matrix and vector are binary"""
    def multiply_matrix_vector(matrix, vector, binary=True):
        if not binary:
            return np.matmul(matrix, vector)
        else:
            return np.matmul(matrix, vector) % 2
        
    
    def verbose_print(verbose, data):
        if verbose:
            print(data)
    
    
    if __name__ == "__main__":
        # Parse the command line arguments
        parser = argparse.ArgumentParser(prog='testcase-generator.py', description='Generate test cases for the Toeplitz matrix-vector multiplication', epilog='Enjoy the program! :)')
        parser.add_argument('-n', '--cases', type=int, default=1, help='Number of test cases to generate')
        parser.add_argument('-j', '--mindim', type=int, default=2, help='Minimum dimension of the Toeplitz matrix')
        parser.add_argument('-k', '--maxdim', type=int, default=3, help='Maximum dimension of the Toeplitz matrix')
        parser.add_argument('-o', '--output', type=str, default="testcases.txt", help='Name of the file to save the test cases')
        parser.add_argument('-b', '--binary', type=int, default=False, help='Boolean indicating if the matrix and vector should be binary')
        parser.add_argument('-v', '--verbose', action='store_true', default=False, help='Boolean indicating if the matrices should be printed')
        args = parser.parse_args()
    
        with open(args.output, "w") as f:
            for i in range(args.cases):
                # Generate a random Toeplitz matrix
                n = np.random.randint(args.mindim, args.maxdim)
                m = np.random.randint(args.mindim, args.maxdim)
                matrix = generate_toeplitz(n, m, args.binary)
                # Generate a random vector
                vector = generate_vector(n, args.binary)
                # Multiply the matrix by the vector
                result = multiply_matrix_vector(matrix, vector, args.binary)
                # Write the test case to the file
                np.savetxt(f, vector, fmt="%d")
                f.write("\n")
                np.savetxt(f, matrix, fmt="%d")
                f.write("\n")
                np.savetxt(f, result, fmt="%d")
                f.write("\n")
                f.write("---\n")
    
                # Print the test case if verbose is set
                if args.verbose:
                    print_matrix(vector)
                    print_matrix(matrix)
                    print_matrix(result)
                    print("---\n")
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment