In [1]:
class ComputeResourceInformation:
        
    def __init__(self, processor="", memory="", disk="", operating_system="", kernel="", compiler="", file_system="", system_layer="", motherboard="", chipset="", graphics="", network_card="", monitor=""):
        self.processor = processor
        self.memory = memory
        self.disk = disk
        self.operating_system = operating_system
        self.kernel = kernel
        self.compiler = compiler
        self.file_system = file_system
        self.system_layer = system_layer
        self.motherboard = motherboard
        self.chipset = chipset
        self.graphics = graphics
        self.network_card = network_card
        self.monitor = monitor
        
    def as_map(self):
        map_repr = {}
        
        map_repr['Processor'] = self.processor
        map_repr['Memory'] = self.memory
        map_repr['Disk'] = self.disk
        map_repr['OS'] = self.operating_system
        map_repr['Kernel'] = self.kernel
        map_repr['Compiler'] = self.compiler
        map_repr['File System'] = self.file_system
        map_repr['System Layer'] = self.system_layer
        map_repr['Motherboard'] = self.motherboard
        map_repr['Chipset'] = self.chipset
        map_repr['Graphics'] = self.graphics
        map_repr['Network'] = self.network_card
        map_repr['Monitor'] = self.monitor
        
        return map_repr
    
    def __str__(self):
        return str( self.as_map() )

In [2]:
class TestNotFound(Exception):
    def __init__(self, value="Test Not Found"):
        self.value = value
    def __str__(self):
        return repr(self.value)

In [3]:
import csv

class ComputeResourceTestResults:
    
    def __init__(self, file = None):
        
        self._results = {}
        self._info = ComputeResourceInformation()
        
        if file is not None:
            self.load_from_file(file)
        
    def update_resource_info(self, processor, memory, disk, operating_system, kernel, compiler, file_system, 
                             system_layer='', motherboard='', chipset='', graphics='', network_card=''):
            self._info.processor = processor
            self._info.memory = memory
            self._info.disk = disk
            self._info.operating_system = operating_system
            self._info.kernel = kernel
            self._info.compiler = compiler
            self._info.file_system = file_system
            self._info.system_layer = system_layer
            self._info.motherboard = motherboard
            self._info.chipset = chipset
            self._info.graphics = graphics
            self._info.network_card = network_card
            
    def add_test_results(self, test_name, test_results_values):
        
        if test_name not in self._results:
            self._results[test_name] = test_results_values
        else:
            self._results[test_name].extend( test_results_values )
    
    def add_test_result(self, test_name, test_result_value):
        
        results = []
        results.append(test_result_value)
        
        self.add_test_results(test_name, results)
    
    def get_test_results(self, test_name):
        try:
            return self._results[test_name]
        except KeyError as e:
            raise TestNotFound("Test Not Found")
    
    def delete_test_results(self, test_name):
        try:
            del self._results[test_name]
        except KeyError as e:
            raise TestNotFound("Test Not Found")
            
    def load_from_file(self, file):
        
        processor = ''
        memory = ''
        disk = ''
        operating_system = ''
        kernel = ''
        compiler = ''
        file_system = ''
        system_layer = ''
        motherboard = ''
        chipset = ''
        graphics = ''
        network_card = ''
        
        with open(file, newline='') as csvfile:
            
            test_result_reader = csv.reader(csvfile, delimiter=',')
             
            for row in test_result_reader:
                #print(row)
                if len(row) >= 2  and row[0] != ' ':
                    if row[0] == 'Processor':
                        processor = row[1] # Processor decoded
                    elif row[0] == 'Memory':
                        memory = row[1]  # Memory decoded
                    elif row[0] == 'Disk':
                        disk = row[1]    # Disk decoded
                    elif row[0] == 'OS':
                        operating_system = row[1]  ## OS decoded
                    elif row[0] == 'Kernel':
                        kernel = row[1]  # Kernel decoded
                    elif row[0] == 'Compiler':
                        compiler = row[1] # Compiler decoded
                    elif row[0] == 'File-System':
                        file_system = row[1] # File System decoded
                    elif row[0] == 'System Layer':
                        system_layer = row[1] # System layer decoded
                    elif row[0] == 'Motherboard':
                        motherboard = row[1] # Mother board decoded
                    elif row[0] == 'Chipset':
                        chipset = row[1]  # Chipset decoded
                    elif row[0] == 'Graphics':
                        graphics = row[1]  # Graphic card decoded
                    elif row[0] == 'Network':
                        network_card = row[1]  # Network card decoded
                    elif row[0] == 'Screen Resolution' or row[0] == 'Monitor':
                        pass
                    else:
                        # Fill test results
                        
                        self.add_test_results(row[0], [float(x) for x in row[1:]] ) 
        
        self.update_resource_info(processor, memory, disk, operating_system, kernel, compiler, file_system, 
                                  system_layer, motherboard, chipset, graphics, network_card)

In [4]:
aws_m1large_variable = ComputeResourceTestResults('./benchmarks/aws/m1large-aws-variable-ubuntu/merge-2092.csv')
aws_m4xlarge_variable = ComputeResourceTestResults('./benchmarks/aws/m44xlarge-aws-variable-ubuntu/merge-7274.csv')
aws_m4large_magnetic = ComputeResourceTestResults('./benchmarks/aws/m4large-aws-magnetic-ubuntu/merge-7288.csv')
aws_m4large_sdd = ComputeResourceTestResults('./benchmarks/aws/m4large-aws-sdd-ubuntu/merge-6914.csv')
aws_t2medium_magnetic = ComputeResourceTestResults('./benchmarks/aws/t2medium-aws-magnetic-ubuntu/merge-9347.csv')
aws_t2medium_variable = ComputeResourceTestResults('./benchmarks/aws/t2medium-aws-variable-ubuntu/merge-9691.csv')
aws_t2small_magnetic = ComputeResourceTestResults('./benchmarks/aws/t2small-aws-magnetic-ubuntu/merge-8438.csv')

In [5]:
cecad_2xlarge_gp = ComputeResourceTestResults('./benchmarks/cecad/2xlarge-gp-ubuntu/merge-5274.csv')
cecad_2xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/2xlarge-hpc-ubuntu/merge-4929.csv')
cecad_3xlarge_gp = ComputeResourceTestResults('./benchmarks/cecad/3xlarge-gp-ubuntu/merge-6495.csv')
cecad_3xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/3xlarge-hpc-ubuntu/merge-6359.csv')
cecad_4xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/4xlarge-hpc-ubuntu/merge-7671.csv')
cecad_5xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/5xlarge-hpc-ubuntu/merge-5104.csv')
cecad_6xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/6xlarge-hpc-ubuntu/merge-4492.csv')
cecad_7xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/7xlarge-hpc-ubuntu/merge-1826.csv')
cecad_8xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/8xlarge-hpc-ubuntu/merge-3615.csv')
cecad_dl1606g = ComputeResourceTestResults('./benchmarks/cecad/dl1606g-ubuntu/merge-6157.csv')
cecad_large_gp = ComputeResourceTestResults('./benchmarks/cecad/large-gp-ubuntu/merge-9893.csv')
cecad_large_hpc = ComputeResourceTestResults('./benchmarks/cecad/large-hpc-ubuntu/merge-7675.csv')
cecad_large_nova = ComputeResourceTestResults('./benchmarks/cecad/large-ubuntu/merge-9724.csv')
cecad_medium_gp = ComputeResourceTestResults('./benchmarks/cecad/medium-gp-ubuntu/merge-5312.csv')
cecad_medium_hpc = ComputeResourceTestResults('./benchmarks/cecad/medium-hpc-ubuntu/merge-8901.csv')
cecad_medium_nova = ComputeResourceTestResults('./benchmarks/cecad/medium-ubuntu/merge-2260.csv')
cecad_r610 = ComputeResourceTestResults('./benchmarks/cecad/r610-ubuntu/merge-8348.csv')
cecad_r900 = ComputeResourceTestResults('./benchmarks/cecad/r900-debian/merge-4836.csv')
cecad_small_gp = ComputeResourceTestResults('./benchmarks/cecad/small-gp-ubuntu/merge-3500.csv')
cecad_small_hpc = ComputeResourceTestResults('./benchmarks/cecad/small-hpc-ubuntu/merge-1569.csv')
cecad_small_test = ComputeResourceTestResults('./benchmarks/cecad/small-test-ubuntu/merge-1472.csv')
cecad_small_nova = ComputeResourceTestResults('./benchmarks/cecad/small-ubuntu/merge-4467.csv')
cecad_xlarge_gp = ComputeResourceTestResults('./benchmarks/cecad/xlarge-gp-ubuntu/merge-1562.csv')
cecad_xlarge_hpc = ComputeResourceTestResults('./benchmarks/cecad/xlarge-hpc-ubuntu/merge-3341.csv')
cecad_xsmall_gp = ComputeResourceTestResults('./benchmarks/cecad/xsmall-gp-ubuntu/merge-3733.csv')
cecad_xsmall_hpc = ComputeResourceTestResults('./benchmarks/cecad/xsmall-hpc-ubuntu/merge-2556.csv')
cecad_xsmall_nova = ComputeResourceTestResults('./benchmarks/cecad/xsmall-ubuntu/merge-1877.csv')

In [6]:
print(aws_m4large_sdd._info )


{'Processor': 'Intel Xeon E5-2676 v3 @ 2.39GHz (2 Cores)', 'Kernel': '3.13.0-48-generic (x86_64)', 'Disk': '158GB', 'OS': 'Ubuntu 14.04', 'Network': 'Intel 82599 Virtual Function', 'Graphics': 'Cirrus Logic GD 5446', 'Chipset': 'Intel 440FX- 82441FX PMC', 'Monitor': '', 'Memory': '8192MB', 'File System': 'ext4', 'System Layer': 'Xen HVM domU 4.2.amazon', 'Motherboard': 'Xen HVM domU', 'Compiler': 'GCC 4.8.4'}

In [7]:
class TestInformation:
    
    CPU_TEST = 0
    MEMORY_TEST = 1
    DISK_TEST = 2
    
    categories = ("CPU","MEMORY","DISK")
    
    def __init__(self, test_name, units, category = MEMORY_TEST, more_is_better=True):
        self.test_name = test_name
        self.units = units
        self.category = category
        self.more_is_better = more_is_better
    
    def as_map(self):
        map_repr = {}
        
        map_repr['Test Name'] = self.test_name
        map_repr['Units'] = self.units
        map_repr['Category'] = self.categories[self.category]
        map_repr['More Is Better'] = self.more_is_better
        
        return map_repr
    
    def __eq__(self,other):
        return self.test_name == other.test_name and self.units == other.units
    
    def __str__(self):
        return str( self.as_map() )

In [8]:
test_info = TestInformation("SQLite", "MB/s", TestInformation.CPU_TEST, True)
test_info.as_map()


Out[8]:
{'Category': 'CPU',
 'More Is Better': True,
 'Test Name': 'SQLite',
 'Units': 'MB/s'}

In [9]:
class TestSuite:
    
    def __init__(self, file = None):
        
        self._tests = {}
        
        if file is not None:
            self.load_from_file(file)
    
    def add_test(self, test_name, units, category=TestInformation.MEMORY_TEST, more_is_better=True ):
        test_info = TestInformation(test_name, units, category, more_is_better)
        self._tests[test_info.test_name] = test_info
    
    def load_from_file(self, file ):
        
        with open(file, newline='') as csvfile:
            
            test_result_reader = csv.reader(csvfile, delimiter=',')
             
            for row in test_result_reader:
                
                test_name = row[0]
                units = row[1]
                category = int(row[2])
                more_is_better = False
                
                if( row[3] == "True" ):
                    more_is_better = True
                
                self.add_test(test_name, units, category, more_is_better)
    
    def get_test_info(self, test_name ):
        return self._tests[test_name]

In [10]:
test_suite = TestSuite("./benchmarks/tests.csv")
print( test_suite._tests['7-Zip Compression - Compress Speed Test'] )


{'Units': 'MIPS', 'Test Name': '7-Zip Compression - Compress Speed Test', 'Category': 'CPU', 'More Is Better': True}

In [11]:
import scipy as sp
from sklearn.cluster import KMeans

class ComputeResourceTestTournament:
    
    POINTS_PER_WIN = 3
    POINTS_PER_TIE = 1
    POINTS_PER_LOSE = 0
    
    def __init__(self, test_name, more_is_better=True):
        self._test_name = test_name
        self._more_is_better = more_is_better
        self._players = {}
        self._km = None
        self._cluster_results = {}
        self._tournament = {}
        self._results = {}
    
    def add_player(self, player_name, player):
        try:
            test_result = player.get_test_results( self._test_name )
            self._players[ player_name ] = test_result[0]
        except TestNotFound as e:
            self._players[ player_name ] = sp.NAN
            
    def clusterize_results( self, number_clusters=10, init_mode='random', number_init=10, max_iterations=300 ):
        
        self._km = KMeans(n_clusters=number_clusters, init=init_mode, n_init=number_init, max_iter=max_iterations, random_state=0)
        
        # Sort players by value
        sorted_players = [ (k,v) for v,k in sorted([(v,k) for k,v in self._players.items() ]) ]
        
        try:
            
            # Create a 2-dimensional array for doing K-Means
            results = [[w,w] for w in sorted(list(self._players.values()))]
            results_as_np = sp.array(results)
        
            # Execute cluster algorithm
            y_km = self._km.fit_predict( results_as_np ) 
        
            # Create clustering results {(p_i,clusterid_i)}
            for i,item in enumerate(y_km) :
                self._cluster_results[ sorted_players[i][0] ] = y_km[i]
        
        except ValueError as e:  #Doesn't work if Nan values
            
            results = []
            for r in sorted(list(self._players.values())):
                if r is not sp.NAN:
                    results.append( [r,r] )
            
            results_as_np = sp.array(results)
                            
            y_km = self._km.fit_predict( results_as_np ) # Call clustering without Nan
            
            # Create clustering results {(p_i,clusterid_i)}
            
            assign_index = 0
            
            for info in sorted_players:
                player_name = info[0]
                
                if self._players[ player_name ] is not sp.NAN:
                    self._cluster_results[ player_name ] = y_km[assign_index]  
                    assign_index = assign_index + 1
                else:
                    self._cluster_results[ player_name ] = sp.NAN
  
    def play_tournament(self):
        
        for key1 in self._players:
            for key2 in self._players:
                
                if key1 != key2:
                    
                    cluster_player_1 = self._cluster_results[ key1 ]
                    cluster_player_2 = self._cluster_results[ key2 ]
                    
                    if cluster_player_1 is sp.NAN: #Player doesn't compete in tournamet. Automatically loses
                        points = self.POINTS_PER_LOSE
                    else:
                        if cluster_player_2 is sp.NAN: #Player doesn't compete in tournamet. Automatically wins
                            points = self.POINTS_PER_WIN
                        else:
                            
                            points = self.POINTS_PER_TIE

                            # Different cluster?
                            if cluster_player_1 != cluster_player_2:

                                if( self._km.cluster_centers_[cluster_player_1][0] > self._km.cluster_centers_[cluster_player_2][0] ):
                                    if self._more_is_better:
                                        points = self.POINTS_PER_WIN
                                    else:
                                        points = self.POINTS_PER_LOSE
                                else:
                                    if self._more_is_better:
                                        points = self.POINTS_PER_LOSE
                                    else:
                                        points = self.POINTS_PER_WIN

                    match_result = (key2, points)

                    if( key1 not in self._tournament):
                        self._tournament[key1] = []

                    self._tournament[key1].append( match_result )
            
    def calculate_tournament_results(self ):
        # results is a dictionary with the player as the key and a list [points,position] as the value
    
        # Calculate points and positions for every player
        # First, calculate points
    
        for player in self._tournament:
    
            points = 0
        
            for (op,p) in self._tournament[player]:
                points = points + p
        
            self._results[player] = [points,0]
            
        # Second, recalculate positions
        
        unsorted_cluster_centers = []
        for centers in self._km.cluster_centers_:
            unsorted_cluster_centers.append(centers[0])
        
        sorted_cluster_centers = sorted( unsorted_cluster_centers, reverse=(self._more_is_better) )
        
        for i,cc in enumerate(sorted_cluster_centers):
            # Get cluster index of this value
            index = unsorted_cluster_centers.index(cc)
            
            # Update positions
            
            for (k,v) in self._cluster_results.items():
                if index == v:
                    self._results[k][1] = i
                if v is sp.NAN:
                    self._results[k][1] = len( unsorted_cluster_centers ) +1

    def get_points(self, player ):
        return self._results[player][0]

    def get_position(self, player):
        return self._results[player][1]

In [12]:
test = ComputeResourceTestTournament('Tachyon - Total Time',False)
test.add_player( 'aws_m1large_variable', aws_m1large_variable )
test.add_player( 'aws_m4xlarge_variable', aws_m4xlarge_variable )
test.add_player( 'aws_m4large_magnetic', aws_m4large_magnetic )
test.add_player( 'aws_m4large_sdd', aws_m4large_sdd )
test.add_player( 'aws_t2medium_magnetic', aws_t2medium_magnetic )
test.add_player( 'aws_t2medium_variable', aws_t2medium_variable )
test.add_player( 'aws_t2small_magnetic', aws_t2small_magnetic )
test.add_player( 'cecad_2xlarge_gp', cecad_2xlarge_gp )
test.add_player( 'cecad_2xlarge_hpc', cecad_2xlarge_hpc )
test.add_player( 'cecad_3xlarge_gp', cecad_3xlarge_gp )
test.add_player( 'cecad_3xlarge_hpc', cecad_3xlarge_hpc )
test.add_player( 'cecad_4xlarge_hpc', cecad_4xlarge_hpc )
test.add_player( 'cecad_5xlarge_hpc', cecad_5xlarge_hpc )
test.add_player( 'cecad_6xlarge_hpc', cecad_6xlarge_hpc )
test.add_player( 'cecad_7xlarge_hpc', cecad_7xlarge_hpc )
test.add_player( 'cecad_8xlarge_hpc', cecad_8xlarge_hpc )
test.add_player( 'cecad_dl1606g', cecad_dl1606g )
test.add_player( 'cecad_large_gp', cecad_large_gp )
test.add_player( 'cecad_large_hpc', cecad_large_hpc )
test.add_player( 'cecad_large_nova', cecad_large_nova )
test.add_player( 'cecad_medium_gp', cecad_medium_gp )
test.add_player( 'cecad_medium_hpc', cecad_medium_hpc )
test.add_player( 'cecad_medium_nova', cecad_medium_nova )
test.add_player( 'cecad_r610', cecad_r610 )
test.add_player( 'cecad_r900', cecad_r900 )
test.add_player( 'cecad_small_gp', cecad_small_gp )
test.add_player( 'cecad_small_hpc', cecad_small_hpc )
test.add_player( 'cecad_small_test', cecad_small_test )
test.add_player( 'cecad_small_nova', cecad_small_nova )
test.add_player( 'cecad_xlarge_gp', cecad_xlarge_gp )
test.add_player( 'cecad_xlarge_hpc', cecad_xlarge_hpc )
test.add_player( 'cecad_xsmall_gp', cecad_xsmall_gp )
test.add_player( 'cecad_xsmall_hpc', cecad_xsmall_hpc )
test.add_player( 'cecad_xsmall_nova', cecad_xsmall_nova )
test._players


Out[12]:
{'aws_m1large_variable': 71.18,
 'aws_m4large_magnetic': 68.47,
 'aws_m4large_sdd': 68.49,
 'aws_m4xlarge_variable': 8.66,
 'aws_t2medium_magnetic': 193.24,
 'aws_t2medium_variable': 188.99,
 'aws_t2small_magnetic': 389.23,
 'cecad_2xlarge_gp': 10.38,
 'cecad_2xlarge_hpc': 10.21,
 'cecad_3xlarge_gp': 10.92,
 'cecad_3xlarge_hpc': 10.23,
 'cecad_4xlarge_hpc': 22.7,
 'cecad_5xlarge_hpc': 11.55,
 'cecad_6xlarge_hpc': 7.98,
 'cecad_7xlarge_hpc': 7.27,
 'cecad_8xlarge_hpc': 8.06,
 'cecad_dl1606g': 19.3,
 'cecad_large_gp': 25.5,
 'cecad_large_hpc': 39.99,
 'cecad_large_nova': 24.58,
 'cecad_medium_gp': 47.3,
 'cecad_medium_hpc': 90.77,
 'cecad_medium_nova': 48.54,
 'cecad_r610': 10.31,
 'cecad_r900': nan,
 'cecad_small_gp': 93.48,
 'cecad_small_hpc': 181.27,
 'cecad_small_nova': nan,
 'cecad_small_test': 154.88,
 'cecad_xlarge_gp': 14.13,
 'cecad_xlarge_hpc': 20.08,
 'cecad_xsmall_gp': 93.34,
 'cecad_xsmall_hpc': 179.01,
 'cecad_xsmall_nova': 94.12}

In [13]:
test.clusterize_results( 10, 'random', 10, 300 )

In [14]:
test._cluster_results


Out[14]:
{'aws_m1large_variable': 5,
 'aws_m4large_magnetic': 5,
 'aws_m4large_sdd': 5,
 'aws_m4xlarge_variable': 1,
 'aws_t2medium_magnetic': 0,
 'aws_t2medium_variable': 0,
 'aws_t2small_magnetic': 8,
 'cecad_2xlarge_gp': 1,
 'cecad_2xlarge_hpc': 1,
 'cecad_3xlarge_gp': 1,
 'cecad_3xlarge_hpc': 1,
 'cecad_4xlarge_hpc': 2,
 'cecad_5xlarge_hpc': 1,
 'cecad_6xlarge_hpc': 1,
 'cecad_7xlarge_hpc': 1,
 'cecad_8xlarge_hpc': 1,
 'cecad_dl1606g': 2,
 'cecad_large_gp': 2,
 'cecad_large_hpc': 4,
 'cecad_large_nova': 2,
 'cecad_medium_gp': 3,
 'cecad_medium_hpc': 6,
 'cecad_medium_nova': 3,
 'cecad_r610': 1,
 'cecad_r900': nan,
 'cecad_small_gp': 7,
 'cecad_small_hpc': 0,
 'cecad_small_nova': nan,
 'cecad_small_test': 9,
 'cecad_xlarge_gp': 1,
 'cecad_xlarge_hpc': 2,
 'cecad_xsmall_gp': 7,
 'cecad_xsmall_hpc': 0,
 'cecad_xsmall_nova': 7}

In [15]:
test._km.cluster_centers_


Out[15]:
array([[ 185.6275    ,  185.6275    ],
       [   9.97272727,    9.97272727],
       [  22.432     ,   22.432     ],
       [  47.92      ,   47.92      ],
       [  39.99      ,   39.99      ],
       [  69.38      ,   69.38      ],
       [  90.77      ,   90.77      ],
       [  93.64666667,   93.64666667],
       [ 389.23      ,  389.23      ],
       [ 154.88      ,  154.88      ]])

In [16]:
test.play_tournament()

In [17]:
test._tournament["aws_m1large_variable"]


Out[17]:
[('cecad_dl1606g', 0),
 ('cecad_7xlarge_hpc', 0),
 ('cecad_3xlarge_hpc', 0),
 ('cecad_4xlarge_hpc', 0),
 ('cecad_large_gp', 0),
 ('cecad_xsmall_gp', 3),
 ('aws_t2medium_magnetic', 3),
 ('cecad_small_nova', 3),
 ('cecad_medium_nova', 0),
 ('cecad_large_nova', 0),
 ('cecad_xlarge_gp', 0),
 ('cecad_large_hpc', 0),
 ('cecad_xlarge_hpc', 0),
 ('aws_m4xlarge_variable', 0),
 ('cecad_xsmall_hpc', 3),
 ('cecad_8xlarge_hpc', 0),
 ('cecad_small_gp', 3),
 ('cecad_5xlarge_hpc', 0),
 ('cecad_2xlarge_gp', 0),
 ('cecad_small_hpc', 3),
 ('cecad_2xlarge_hpc', 0),
 ('cecad_6xlarge_hpc', 0),
 ('aws_m4large_magnetic', 1),
 ('cecad_medium_hpc', 3),
 ('aws_m4large_sdd', 1),
 ('aws_t2medium_variable', 3),
 ('cecad_xsmall_nova', 3),
 ('cecad_medium_gp', 0),
 ('cecad_3xlarge_gp', 0),
 ('aws_t2small_magnetic', 3),
 ('cecad_r900', 3),
 ('cecad_small_test', 3),
 ('cecad_r610', 0)]

In [18]:
test._cluster_results.items()


Out[18]:
dict_items([('cecad_dl1606g', 2), ('cecad_7xlarge_hpc', 1), ('cecad_3xlarge_hpc', 1), ('cecad_4xlarge_hpc', 2), ('aws_t2small_magnetic', 8), ('cecad_large_gp', 2), ('aws_t2medium_variable', 0), ('aws_t2medium_magnetic', 0), ('cecad_small_nova', nan), ('cecad_medium_nova', 3), ('cecad_large_nova', 2), ('cecad_r610', 1), ('cecad_xlarge_hpc', 2), ('aws_m4xlarge_variable', 1), ('cecad_xsmall_hpc', 0), ('cecad_8xlarge_hpc', 1), ('cecad_small_gp', 7), ('cecad_5xlarge_hpc', 1), ('cecad_xlarge_gp', 1), ('cecad_xsmall_gp', 7), ('cecad_medium_gp', 3), ('cecad_2xlarge_hpc', 1), ('cecad_6xlarge_hpc', 1), ('aws_m4large_magnetic', 5), ('cecad_medium_hpc', 6), ('aws_m4large_sdd', 5), ('cecad_small_hpc', 0), ('cecad_xsmall_nova', 7), ('aws_m1large_variable', 5), ('cecad_3xlarge_gp', 1), ('cecad_2xlarge_gp', 1), ('cecad_r900', nan), ('cecad_small_test', 9), ('cecad_large_hpc', 4)])

In [19]:
test.calculate_tournament_results()
points = test.get_points("aws_m1large_variable")
points


Out[19]:
38

In [20]:
points = test.get_points("cecad_dl1606g")
points


Out[20]:
58

In [21]:
points = test.get_points("cecad_r610")
points


Out[21]:
79

In [22]:
test._results


Out[22]:
{'aws_m1large_variable': [38, 4],
 'aws_m4large_magnetic': [38, 4],
 'aws_m4large_sdd': [38, 4],
 'aws_m4xlarge_variable': [79, 0],
 'aws_t2medium_magnetic': [12, 8],
 'aws_t2medium_variable': [12, 8],
 'aws_t2small_magnetic': [6, 9],
 'cecad_2xlarge_gp': [79, 0],
 'cecad_2xlarge_hpc': [79, 0],
 'cecad_3xlarge_gp': [79, 0],
 'cecad_3xlarge_hpc': [79, 0],
 'cecad_4xlarge_hpc': [58, 1],
 'cecad_5xlarge_hpc': [79, 0],
 'cecad_6xlarge_hpc': [79, 0],
 'cecad_7xlarge_hpc': [79, 0],
 'cecad_8xlarge_hpc': [79, 0],
 'cecad_dl1606g': [58, 1],
 'cecad_large_gp': [58, 1],
 'cecad_large_hpc': [51, 2],
 'cecad_large_nova': [58, 1],
 'cecad_medium_gp': [46, 3],
 'cecad_medium_hpc': [33, 5],
 'cecad_medium_nova': [46, 3],
 'cecad_r610': [79, 0],
 'cecad_r900': [0, 11],
 'cecad_small_gp': [26, 6],
 'cecad_small_hpc': [12, 8],
 'cecad_small_nova': [0, 11],
 'cecad_small_test': [21, 7],
 'cecad_xlarge_gp': [79, 0],
 'cecad_xlarge_hpc': [58, 1],
 'cecad_xsmall_gp': [26, 6],
 'cecad_xsmall_hpc': [12, 8],
 'cecad_xsmall_nova': [26, 6]}

In [23]:
sorted_players = [ (k,v) for v,k in sorted([(v,k) for k,v in test._players.items() ]) ]
sorted_players


Out[23]:
[('cecad_7xlarge_hpc', 7.27),
 ('cecad_6xlarge_hpc', 7.98),
 ('cecad_8xlarge_hpc', 8.06),
 ('aws_m4xlarge_variable', 8.66),
 ('cecad_2xlarge_hpc', 10.21),
 ('cecad_3xlarge_hpc', 10.23),
 ('cecad_r610', 10.31),
 ('cecad_2xlarge_gp', 10.38),
 ('cecad_3xlarge_gp', 10.92),
 ('cecad_5xlarge_hpc', 11.55),
 ('cecad_xlarge_gp', 14.13),
 ('cecad_dl1606g', 19.3),
 ('cecad_xlarge_hpc', 20.08),
 ('cecad_4xlarge_hpc', 22.7),
 ('cecad_large_nova', 24.58),
 ('cecad_large_gp', 25.5),
 ('cecad_large_hpc', 39.99),
 ('cecad_medium_gp', 47.3),
 ('cecad_medium_nova', 48.54),
 ('aws_m4large_magnetic', 68.47),
 ('aws_m4large_sdd', 68.49),
 ('aws_m1large_variable', 71.18),
 ('cecad_medium_hpc', 90.77),
 ('cecad_xsmall_gp', 93.34),
 ('aws_t2medium_magnetic', 193.24),
 ('cecad_small_nova', nan),
 ('cecad_small_gp', 93.48),
 ('cecad_xsmall_nova', 94.12),
 ('cecad_small_test', 154.88),
 ('cecad_xsmall_hpc', 179.01),
 ('cecad_small_hpc', 181.27),
 ('aws_t2medium_variable', 188.99),
 ('aws_t2small_magnetic', 389.23),
 ('cecad_r900', nan)]

In [24]:
import scipy as sp
test_results = sp.array( sorted(list(test._players.values()) ) ) 
test_results


Out[24]:
array([   7.27,    7.98,    8.06,    8.66,   10.21,   10.23,   10.31,
         10.38,   10.92,   11.55,   14.13,   19.3 ,   20.08,   22.7 ,
         24.58,   25.5 ,   39.99,   47.3 ,   48.54,   68.47,   68.49,
         71.18,   90.77,   93.34,  193.24,     nan,   93.48,   94.12,
        154.88,  179.01,  181.27,  188.99,  389.23,     nan])

In [25]:
import matplotlib.pyplot as plt
#plt.scatter([w for w in range( len( stream_copy._players  ) ) ],stream_copy_results,s=10)
plt.scatter(test_results, test_results,s=20)
plt.title(test._test_name)
plt.xlabel("MB/s")
plt.ylabel("MB/s")
plt.autoscale(tight=True)
plt.grid(True, linestyle='-', color='0.75')
plt.show()

In [26]:
from sklearn.cluster import KMeans
km = KMeans(n_clusters=10, init='random', n_init=10, max_iter=300, random_state=0)

In [27]:
results = [[w,w] for w in sorted(list(test._players.values()))]
results


Out[27]:
[[7.27, 7.27],
 [7.98, 7.98],
 [8.06, 8.06],
 [8.66, 8.66],
 [10.21, 10.21],
 [10.23, 10.23],
 [10.31, 10.31],
 [10.38, 10.38],
 [10.92, 10.92],
 [11.55, 11.55],
 [14.13, 14.13],
 [19.3, 19.3],
 [20.08, 20.08],
 [22.7, 22.7],
 [24.58, 24.58],
 [25.5, 25.5],
 [39.99, 39.99],
 [47.3, 47.3],
 [48.54, 48.54],
 [68.47, 68.47],
 [68.49, 68.49],
 [71.18, 71.18],
 [90.77, 90.77],
 [93.34, 93.34],
 [193.24, 193.24],
 [nan, nan],
 [93.48, 93.48],
 [94.12, 94.12],
 [154.88, 154.88],
 [179.01, 179.01],
 [181.27, 181.27],
 [188.99, 188.99],
 [389.23, 389.23],
 [nan, nan]]

In [28]:
data_to_cluster = sp.array(results)
data_to_cluster


Out[28]:
array([[   7.27,    7.27],
       [   7.98,    7.98],
       [   8.06,    8.06],
       [   8.66,    8.66],
       [  10.21,   10.21],
       [  10.23,   10.23],
       [  10.31,   10.31],
       [  10.38,   10.38],
       [  10.92,   10.92],
       [  11.55,   11.55],
       [  14.13,   14.13],
       [  19.3 ,   19.3 ],
       [  20.08,   20.08],
       [  22.7 ,   22.7 ],
       [  24.58,   24.58],
       [  25.5 ,   25.5 ],
       [  39.99,   39.99],
       [  47.3 ,   47.3 ],
       [  48.54,   48.54],
       [  68.47,   68.47],
       [  68.49,   68.49],
       [  71.18,   71.18],
       [  90.77,   90.77],
       [  93.34,   93.34],
       [ 193.24,  193.24],
       [    nan,     nan],
       [  93.48,   93.48],
       [  94.12,   94.12],
       [ 154.88,  154.88],
       [ 179.01,  179.01],
       [ 181.27,  181.27],
       [ 188.99,  188.99],
       [ 389.23,  389.23],
       [    nan,     nan]])

In [29]:
y_km = km.fit_predict(data_to_cluster)
y_km


---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-6bceafb44d6c> in <module>()
----> 1 y_km = km.fit_predict(data_to_cluster)
      2 y_km

/usr/local/lib/python3.5/dist-packages/sklearn/cluster/k_means_.py in fit_predict(self, X, y)
    828         predict(X).
    829         """
--> 830         return self.fit(X).labels_
    831 
    832     def fit_transform(self, X, y=None):

/usr/local/lib/python3.5/dist-packages/sklearn/cluster/k_means_.py in fit(self, X, y)
    810         """
    811         random_state = check_random_state(self.random_state)
--> 812         X = self._check_fit_data(X)
    813 
    814         self.cluster_centers_, self.labels_, self.inertia_, self.n_iter_ = \

/usr/local/lib/python3.5/dist-packages/sklearn/cluster/k_means_.py in _check_fit_data(self, X)
    784     def _check_fit_data(self, X):
    785         """Verify that the number of samples given is larger than k"""
--> 786         X = check_array(X, accept_sparse='csr', dtype=np.float64)
    787         if X.shape[0] < self.n_clusters:
    788             raise ValueError("n_samples=%d should be >= n_clusters=%d" % (

/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    396                              % (array.ndim, estimator_name))
    397         if force_all_finite:
--> 398             _assert_all_finite(array)
    399 
    400     shape_repr = _shape_repr(array.shape)

/usr/local/lib/python3.5/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X)
     52             and not np.isfinite(X).all()):
     53         raise ValueError("Input contains NaN, infinity"
---> 54                          " or a value too large for %r." % X.dtype)
     55 
     56 

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

In [30]:
km.labels_


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-30-45ec36b31666> in <module>()
----> 1 km.labels_

AttributeError: 'KMeans' object has no attribute 'labels_'

In [31]:
km.cluster_centers_


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-31-9dce187e8af0> in <module>()
----> 1 km.cluster_centers_

AttributeError: 'KMeans' object has no attribute 'cluster_centers_'

In [32]:
len(y_km)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-32-626802cd4f49> in <module>()
----> 1 len(y_km)

NameError: name 'y_km' is not defined

In [33]:
clustering_results = {}
for i,item in enumerate(y_km) :
    clustering_results[ sorted_players[i][0] ] = y_km[i]
clustering_results


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-33-2625b7715871> in <module>()
      1 clustering_results = {}
----> 2 for i,item in enumerate(y_km) :
      3     clustering_results[ sorted_players[i][0] ] = y_km[i]
      4 clustering_results

NameError: name 'y_km' is not defined

In [34]:
test._players.keys()


Out[34]:
dict_keys(['cecad_dl1606g', 'cecad_7xlarge_hpc', 'cecad_3xlarge_hpc', 'cecad_4xlarge_hpc', 'cecad_large_gp', 'cecad_xsmall_gp', 'aws_t2medium_magnetic', 'cecad_small_nova', 'cecad_medium_nova', 'cecad_large_nova', 'cecad_xlarge_gp', 'cecad_large_hpc', 'cecad_xlarge_hpc', 'aws_m4xlarge_variable', 'cecad_xsmall_hpc', 'cecad_8xlarge_hpc', 'cecad_small_gp', 'cecad_5xlarge_hpc', 'cecad_2xlarge_gp', 'cecad_small_hpc', 'aws_m1large_variable', 'cecad_2xlarge_hpc', 'cecad_6xlarge_hpc', 'aws_m4large_magnetic', 'cecad_medium_hpc', 'aws_m4large_sdd', 'aws_t2medium_variable', 'cecad_xsmall_nova', 'cecad_medium_gp', 'cecad_3xlarge_gp', 'aws_t2small_magnetic', 'cecad_r900', 'cecad_small_test', 'cecad_r610'])

In [124]:
import csv

class EquivalenceTournament:
        
    def __init__(self):
        self._competitions = []
        self._players = {}
        self._tournament = {}
        self._results = {}
    
    def add_player(self, player_name, new_player):
        self._players[player_name] = new_player
    
    def add_competition(self, competition):
        self._competitions.append( competition )
    
    def add_competitions(self, competitions):
        self._competitions.extend( competitions )
    
    def add_test_suite(self, file):
        test_suite = TestSuite(file)
        for key,test_info in test_suite._tests.items():
            self.add_competition(test_info)
    
    def load_players_from_file(self, file):
        
        with open(file, newline='') as csvfile:
            
            player_result_reader = csv.reader(csvfile, delimiter=',')
             
            for row in player_result_reader:
                
                player_name = row[0]
                player_info_path = row[1]
                
                # Create info 
                
                new_player = ComputeResourceTestResults(player_info_path)
                
                self.add_player(player_name, new_player)
        
    
    def play_tournament_at_competition(self, players, competition):
        pass
    
    def play_tournament_at_competitions(self, players, competitions):
        pass
    
    def play_tournament_at_all_competitions(self, players ):
        pass
    
    def play_complete_tournament(self):
        
        for test_info in self._competitions:
            
            test = ComputeResourceTestTournament(test_info.test_name, test_info.more_is_better )
            
            for k,v in self._players.items():
                test.add_player(k,v)
                
            test.clusterize_results( 10, 'random', 10, 300 )
            test.play_tournament()
            test.calculate_tournament_results()
            
            self._tournament[test_info.test_name] = test
    
    def calculate_tournament_results(self):
        
        # Calculate total points of player
        
        for player in self._players:
            
            points = 0
            
            for result in self._tournament.values():
                points = points + result.get_points( player )
                
            self._results[player] = [points,0]
            
        # Second, recalculate positions
        
        unsorted_points = [ r[0] for r in self._results.values() ]
        sorted_points = sorted( unsorted_points, reverse=True )
                
        for i,position in enumerate(sorted_points):
            
            # Update positions
            
            for (k,v) in self._results.items():
                if position == v[0]:
                    self._results[k][1] = i
            
    def get_tournament_positions(self):
        pass
    
    def get_tournament_results(self):
        pass
    
    def export_tournament_to_csv_file(self, file):
        
        with open(file,'w', newline='') as csvfile:
            writer = csv.writer(csvfile,delimiter=',')
            
            #Write headers
            writer.writerow( [""] + [ w.test_name for w in self._competitions] )
            
            for player_name, test_results in self._players.items():
                
                row_info = []
                row_info.append( player_name )
                
                for test_name in [ w.test_name for w in self._competitions ]:
                    try: 
                        result = test_results.get_test_results(test_name)[0]
                    except TestNotFound as not_found:
                        result = ""
                    
                    row_info.append(result)
                
                writer.writerow( row_info )

In [125]:
equivalence_tournament = EquivalenceTournament()
equivalence_tournament.add_test_suite("./benchmarks/tests.csv")
equivalence_tournament.load_players_from_file("./benchmarks/players.csv")

In [126]:
equivalence_tournament._players


Out[126]:
{'aws_m1large_variable': <__main__.ComputeResourceTestResults at 0x7f44f821be10>,
 'aws_m4large_magnetic': <__main__.ComputeResourceTestResults at 0x7f44f82346d8>,
 'aws_m4large_sdd': <__main__.ComputeResourceTestResults at 0x7f44f82348d0>,
 'aws_m4xlarge_variable': <__main__.ComputeResourceTestResults at 0x7f44f8234668>,
 'aws_t2medium_magnetic': <__main__.ComputeResourceTestResults at 0x7f44f82349b0>,
 'aws_t2medium_variable': <__main__.ComputeResourceTestResults at 0x7f44f8234b00>,
 'aws_t2small_magnetic': <__main__.ComputeResourceTestResults at 0x7f44f8234be0>,
 'cecad_2xlarge_gp': <__main__.ComputeResourceTestResults at 0x7f44f8234c50>,
 'cecad_2xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f8234d68>,
 'cecad_3xlarge_gp': <__main__.ComputeResourceTestResults at 0x7f44f8234908>,
 'cecad_3xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f8234b70>,
 'cecad_4xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f8234fd0>,
 'cecad_5xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f82345c0>,
 'cecad_6xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c23c8>,
 'cecad_7xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c24e0>,
 'cecad_8xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c2668>,
 'cecad_dl1606g': <__main__.ComputeResourceTestResults at 0x7f44f81c2710>,
 'cecad_large_gp': <__main__.ComputeResourceTestResults at 0x7f44f81c2828>,
 'cecad_large_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c26a0>,
 'cecad_large_nova': <__main__.ComputeResourceTestResults at 0x7f44f81c2208>,
 'cecad_medium_gp': <__main__.ComputeResourceTestResults at 0x7f44f81c2b70>,
 'cecad_medium_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c2c88>,
 'cecad_medium_nova': <__main__.ComputeResourceTestResults at 0x7f44f81c2a90>,
 'cecad_r610': <__main__.ComputeResourceTestResults at 0x7f44f81c2e10>,
 'cecad_r900': <__main__.ComputeResourceTestResults at 0x7f44f81c2d68>,
 'cecad_small_gp': <__main__.ComputeResourceTestResults at 0x7f44f81c29b0>,
 'cecad_small_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81c2f98>,
 'cecad_small_nova': <__main__.ComputeResourceTestResults at 0x7f44f81a3208>,
 'cecad_small_test': <__main__.ComputeResourceTestResults at 0x7f44f81c21d0>,
 'cecad_xlarge_gp': <__main__.ComputeResourceTestResults at 0x7f44f81a32e8>,
 'cecad_xlarge_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81a34a8>,
 'cecad_xsmall_gp': <__main__.ComputeResourceTestResults at 0x7f44f81a35c0>,
 'cecad_xsmall_hpc': <__main__.ComputeResourceTestResults at 0x7f44f81a3748>,
 'cecad_xsmall_nova': <__main__.ComputeResourceTestResults at 0x7f44f81a37f0>}

In [127]:
len( equivalence_tournament._players )


Out[127]:
34

In [128]:
len( equivalence_tournament._competitions )


Out[128]:
110

In [129]:
equivalence_tournament.play_complete_tournament()

In [130]:
equivalence_tournament._tournament


Out[130]:
{'7-Zip Compression - Compress Speed Test': <__main__.ComputeResourceTestTournament at 0x7f44f81a3b38>,
 'AIO-Stress - Random Write': <__main__.ComputeResourceTestTournament at 0x7f44f8b68a20>,
 'Apache Benchmark - Static Web Page Serving': <__main__.ComputeResourceTestTournament at 0x7f44f9cc5a90>,
 'C-Ray - Total Time': <__main__.ComputeResourceTestTournament at 0x7f44f821b2b0>,
 'CacheBench - Read Cache': <__main__.ComputeResourceTestTournament at 0x7f44f8d93e10>,
 'CacheBench - Write Cache': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9c88>,
 'Crafty - Elapsed Time': <__main__.ComputeResourceTestTournament at 0x7f44f81a3ef0>,
 'Dbench - 1 Clients': <__main__.ComputeResourceTestTournament at 0x7f44fb321550>,
 'Dbench - 12 Clients': <__main__.ComputeResourceTestTournament at 0x7f44f8b68b38>,
 'Dbench - 128 Clients': <__main__.ComputeResourceTestTournament at 0x7f44f8267e10>,
 'Dbench - 48 Clients': <__main__.ComputeResourceTestTournament at 0x7f451882f860>,
 'FFmpeg - H.264 HD To NTSC DV': <__main__.ComputeResourceTestTournament at 0x7f44f94506d8>,
 'FLAC Audio Encoding - WAV To FLAC': <__main__.ComputeResourceTestTournament at 0x7f45057ed5c0>,
 'FS-Mark - 1000 Files, 1MB Size': <__main__.ComputeResourceTestTournament at 0x7f45057edeb8>,
 'Gcrypt Library - CAMELLIA256-ECB Cipher': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9748>,
 'GraphicsMagick - HWB Color Space': <__main__.ComputeResourceTestTournament at 0x7f44f9450438>,
 'GraphicsMagick - Local Adaptive Thresholding': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9f28>,
 'GraphicsMagick - Resizing': <__main__.ComputeResourceTestTournament at 0x7f44f9450588>,
 'GraphicsMagick - Sharpen': <__main__.ComputeResourceTestTournament at 0x7f44fb321dd8>,
 'Himeno Benchmark - Poisson Pressure Solver': <__main__.ComputeResourceTestTournament at 0x7f44f81a3cc0>,
 'John The Ripper - Blowfish': <__main__.ComputeResourceTestTournament at 0x7f44f9450828>,
 'John The Ripper - Traditional DES': <__main__.ComputeResourceTestTournament at 0x7f44f8b68a58>,
 'LAME MP3 Encoding - WAV To MP3': <__main__.ComputeResourceTestTournament at 0x7f44f81a3c50>,
 'NAS Parallel Benchmarks - Test / Class: LU.A': <__main__.ComputeResourceTestTournament at 0x7f44f821b0b8>,
 'OpenSSL - RSA 4096-bit Performance': <__main__.ComputeResourceTestTournament at 0x7f44fb8e70b8>,
 'Parallel BZIP2 Compression - 256MB File Compression': <__main__.ComputeResourceTestTournament at 0x7f44f821bd30>,
 'PostMark - Disk Transaction Performance': <__main__.ComputeResourceTestTournament at 0x7f44f81a3da0>,
 'RAMspeed SMP - Floating-Point Add': <__main__.ComputeResourceTestTournament at 0x7f44f81a3160>,
 'RAMspeed SMP - Integer Add': <__main__.ComputeResourceTestTournament at 0x7f44f81a39e8>,
 'RAMspeed SMP - Integer Copy': <__main__.ComputeResourceTestTournament at 0x7f44fa6fefd0>,
 'RAMspeed SMP - Integer Scale': <__main__.ComputeResourceTestTournament at 0x7f44f9450278>,
 'SQLite - Timed SQLite Insertions': <__main__.ComputeResourceTestTournament at 0x7f44f821b400>,
 'Smallpt - Global Illumination Renderer; 100 Samples': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9cf8>,
 'Stream - Add': <__main__.ComputeResourceTestTournament at 0x7f44f9cc5fd0>,
 'Stream - Copy': <__main__.ComputeResourceTestTournament at 0x7f44f8b68748>,
 'Stream - Scale': <__main__.ComputeResourceTestTournament at 0x7f44f7fd7160>,
 'Stream - Type: Add': <__main__.ComputeResourceTestTournament at 0x7f44f9450518>,
 'Stream - Type: Copy': <__main__.ComputeResourceTestTournament at 0x7f451882f5f8>,
 'Stream - Type: Scale': <__main__.ComputeResourceTestTournament at 0x7f44f81a3be0>,
 'Stream - Type: Triad': <__main__.ComputeResourceTestTournament at 0x7f44f82674e0>,
 'TSCP - AI Chess Performance': <__main__.ComputeResourceTestTournament at 0x7f44f821b5c0>,
 'Tachyon - Total Time': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9278>,
 'Threaded I/O Tester - 64MB Random Read - 32 Threads': <__main__.ComputeResourceTestTournament at 0x7f44f94500b8>,
 'Threaded I/O Tester - 64MB Random Write - 32 Threads': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9940>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 128MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9978>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 128MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fb8e7080>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 128MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44fd4a94a8>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 128MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44fd4a95c0>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 256MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f9450358>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 256MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f821bcf8>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 256MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9ac8>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 256MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f8267be0>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 32MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f94507b8>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 32MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fa6fe6a0>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 32MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f9450208>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 32MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9e80>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 64MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f8d93f28>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 64MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f81a3898>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 64MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44fb321eb8>,
 'Threaded I/O Tester - Test: Random Read - Size Per Thread: 64MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f81a3e80>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 128MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f8b68da0>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 128MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f8b68dd8>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 128MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f7fd71d0>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 128MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44fa6fe828>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 256MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44fa6fe710>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 256MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fa6fe550>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 256MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f9450198>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 256MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f81a3d30>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 32MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f7fd7240>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 32MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fb321f98>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 32MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f7fd7320>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 32MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f81a3940>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 64MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44fb3216d8>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 64MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f821b128>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 64MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f7fd7048>,
 'Threaded I/O Tester - Test: Random Write - Size Per Thread: 64MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f821b8d0>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 128MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f821bcc0>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 128MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9eb8>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 128MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f8d93f60>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 128MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f451882fa58>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 256MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f82675f8>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 256MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f9450898>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 256MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f9cc5e80>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 256MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f81a3f60>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 32MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f81a3a90>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 32MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9320>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 32MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f821b4a8>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 32MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f7fd72b0>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 64MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f94502e8>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 64MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f8267d68>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 64MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f821b208>,
 'Threaded I/O Tester - Test: Read - Size Per Thread: 64MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f45057eda58>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 128MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f451876a978>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 128MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f8b68828>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 128MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f94505f8>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 128MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f9450748>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 256MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f8d93dd8>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 256MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f8d93eb8>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 256MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f821b390>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 256MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f81a3e10>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 32MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f7fd7390>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 32MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f7fd70f0>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 32MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f81a3fd0>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 32MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44fd4a9630>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 64MB - Thread Count: 16': <__main__.ComputeResourceTestTournament at 0x7f44f9450978>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 64MB - Thread Count: 32': <__main__.ComputeResourceTestTournament at 0x7f44f821b278>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 64MB - Thread Count: 4': <__main__.ComputeResourceTestTournament at 0x7f44f9450908>,
 'Threaded I/O Tester - Test: Write - Size Per Thread: 64MB - Thread Count: 8': <__main__.ComputeResourceTestTournament at 0x7f44f821b160>,
 'Timed MAFFT Alignment - Multiple Sequence Alignment': <__main__.ComputeResourceTestTournament at 0x7f45057eddd8>,
 'x264 - H.264 Video Encoding': <__main__.ComputeResourceTestTournament at 0x7f44f821b358>}

In [131]:
equivalence_tournament._tournament["7-Zip Compression - Compress Speed Test"]._results


Out[131]:
{'aws_m1large_variable': [19, 8],
 'aws_m4large_magnetic': [35, 7],
 'aws_m4large_sdd': [35, 7],
 'aws_m4xlarge_variable': [99, 0],
 'aws_t2medium_magnetic': [35, 7],
 'aws_t2medium_variable': [35, 7],
 'aws_t2small_magnetic': [6, 9],
 'cecad_2xlarge_gp': [72, 4],
 'cecad_2xlarge_hpc': [82, 3],
 'cecad_3xlarge_gp': [72, 4],
 'cecad_3xlarge_hpc': [82, 3],
 'cecad_4xlarge_hpc': [60, 5],
 'cecad_5xlarge_hpc': [72, 4],
 'cecad_6xlarge_hpc': [89, 2],
 'cecad_7xlarge_hpc': [96, 1],
 'cecad_8xlarge_hpc': [89, 2],
 'cecad_dl1606g': [60, 5],
 'cecad_large_gp': [50, 6],
 'cecad_large_hpc': [50, 6],
 'cecad_large_nova': [50, 6],
 'cecad_medium_gp': [35, 7],
 'cecad_medium_hpc': [19, 8],
 'cecad_medium_nova': [35, 7],
 'cecad_r610': [72, 4],
 'cecad_r900': [89, 2],
 'cecad_small_gp': [19, 8],
 'cecad_small_hpc': [6, 9],
 'cecad_small_nova': [0, 11],
 'cecad_small_test': [6, 9],
 'cecad_xlarge_gp': [60, 5],
 'cecad_xlarge_hpc': [60, 5],
 'cecad_xsmall_gp': [19, 8],
 'cecad_xsmall_hpc': [6, 9],
 'cecad_xsmall_nova': [19, 8]}

In [132]:
equivalence_tournament.calculate_tournament_results()
equivalence_tournament._results


Out[132]:
{'aws_m1large_variable': [2991, 29],
 'aws_m4large_magnetic': [7368, 4],
 'aws_m4large_sdd': [8562, 1],
 'aws_m4xlarge_variable': [8244, 2],
 'aws_t2medium_magnetic': [6762, 7],
 'aws_t2medium_variable': [2321, 31],
 'aws_t2small_magnetic': [4343, 24],
 'cecad_2xlarge_gp': [5763, 11],
 'cecad_2xlarge_hpc': [5939, 9],
 'cecad_3xlarge_gp': [5646, 14],
 'cecad_3xlarge_hpc': [5609, 15],
 'cecad_4xlarge_hpc': [4272, 25],
 'cecad_5xlarge_hpc': [4702, 23],
 'cecad_6xlarge_hpc': [4895, 20],
 'cecad_7xlarge_hpc': [5696, 12],
 'cecad_8xlarge_hpc': [5041, 19],
 'cecad_dl1606g': [5780, 10],
 'cecad_large_gp': [5355, 17],
 'cecad_large_hpc': [4887, 21],
 'cecad_large_nova': [7084, 5],
 'cecad_medium_gp': [4718, 22],
 'cecad_medium_hpc': [3086, 28],
 'cecad_medium_nova': [6802, 6],
 'cecad_r610': [8930, 0],
 'cecad_r900': [7405, 3],
 'cecad_small_gp': [3884, 26],
 'cecad_small_hpc': [2543, 30],
 'cecad_small_nova': [6402, 8],
 'cecad_small_test': [1357, 33],
 'cecad_xlarge_gp': [5670, 13],
 'cecad_xlarge_hpc': [5107, 18],
 'cecad_xsmall_gp': [3216, 27],
 'cecad_xsmall_hpc': [2181, 32],
 'cecad_xsmall_nova': [5516, 16]}

In [133]:
equivalence_tournament.export_tournament_to_csv_file( "tournament.csv")

In [ ]:


In [ ]: