Skip to content
Snippets Groups Projects
modules_matrix.py 4.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    #!/usr/bin/env python3
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    # -*- coding: utf-8 -*-
    """ modules_matrix """
    
    import argparse
    import csv
    import itertools
    import json
    import os.path
    
    def arg_parse():
        """
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        Argument parser
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """
        parser = argparse.ArgumentParser(
            description="Module_matrix"
        )
        parser.add_argument('--json',
                            action='store_true',
                            help="get json")
        return parser.parse_args()
    
    def get_data(filename):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Function to read the data from the input CSV file to use in the analysis"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        reader = []  # Just in case the file open fails
        with open(filename, 'r') as fdata:
            reader = csv.reader(fdata, delimiter=',')
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            return list(reader)  # Only return the reader when you have finished.
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    def get_datalist():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Get data list"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        datalist = []
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        for name in ['karolina', 'dgx', 'barbora']:
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            path = os.path.join('scripts', f"{name}.csv")
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            datalist += get_data(path)
        return datalist
    
    def get_counts(datalist):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Get counts"""
        counts = {}
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        for i in datalist:
            counts[i[0]] = counts.get(i[0], 0) + int(i[1])
        return counts
    
    def get_matrix():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Get matrix"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        chars = ['K', 'B', 'D']
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        arr = []
        mask = ''.join(reversed(chars))
        for bits in itertools.product([0, 1], repeat=len(chars)):
            sbit = "".join(str(bit) for bit in bits)
            nst = ""
            for i, _ in enumerate(sbit):
                if sbit[i] == "1":
                    nst += mask[i]
                else:
                    nst += "-"
            arr.append(nst)
        return arr
    
    def get_software(datalist):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Get software"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        matrix = get_matrix()
        counts = get_counts(datalist)
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        software = {}
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        prev = ''
        for mat, i in sorted(counts.items()):
            split = mat.split('/')
            if len(split) > 1:
                if split[0] != prev:
                    software[split[0]] = {}
                software[split[0]][split[1]] = '`' + matrix[i] + '`'
                prev = split[0]
        return software
    
    def packages_json(software):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Packages JSON"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        packages = {}
        for module in sorted(software.items(), key=lambda i: i[0].lower()):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            packages[module[0]] = sorted(module[1])[-1]
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        data = {'total': len(packages), 'projects': packages}
        return data
    
    def print_software(software):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Print software"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        for module in sorted(software.items(), key=lambda i: i[0].lower()):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            software_name = module[0]
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            versions = []
            clusters = []
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            for key in sorted(module[1].keys()):
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
                versions.append(key)
                clusters.append(module[1][key])
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            print(f"| {software_name} | {'<br>'.join(versions)} | {'<br>'.join(clusters)} |")
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print()
        print('---8<--- "modules_matrix_search.md"')
    
    def print_hint():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Print hint"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print('!!! Hint "Cluster Acronyms"')
        print('    ```')
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print('    D B K')
        print('    | | |')
        print('    | | +----> Karolina')
        print('    | +------> Barbora')
        print('    +--------> DGX')
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print('    ```')
        print()
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print("| Module <br><form><input id=\"searchInput\" placeholder=\"🔍 Filter\""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
              " style=\"width: 8rem; border-radius: 0.2rem; color: black;"
              " padding-left: .2rem;\"></form> | Versions | Clusters |")
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        print("| ------ | -------- | -------- |")
    
    
    Jan Siwiec's avatar
    Jan Siwiec committed
    def print_changelog():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Print changelog"""
    
    Jan Siwiec's avatar
    Jan Siwiec committed
        print('**Modules Changelog**<br>')
        print('You can see the modules changelog for each supercomputer here:<br>')
        print('[DGX modules changelog][1]<br>')
        print('[Barbora modules changelog][2]<br>')
        print('[Karolina modules changelog][3]<br>')
    
    def print_links():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Print links"""
    
    Jan Siwiec's avatar
    Jan Siwiec committed
        print('[1]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/dgx-changelog.md')
        print('[2]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/barbora-changelog.md')
        print('[3]: https://code.it4i.cz/sccs/it4i-modules/-/blob/master/karolina-changelog.md')
    
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    def main():
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        """Main function"""
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
        arg = arg_parse()
        datalist = get_datalist()
        software = get_software(datalist)
    
        if arg.json:
            print(json.dumps(packages_json(software)))
        else:
    
    Jan Siwiec's avatar
    Jan Siwiec committed
            print_changelog()
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
            print_hint()
            print_software(software)
    
    Jan Siwiec's avatar
    Jan Siwiec committed
            print_links()
    
    Lukáš Krupčík's avatar
    Lukáš Krupčík committed
    
    if __name__ == "__main__":
        main()