In [1]:
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import os.path
import pandas as pd
import seaborn as sns
from MyML.helper.plotting import save_fig

In [2]:
sns.set_style("whitegrid")
fig_width = 8
fig_height = 6

In [182]:
results_path = '/home/chiroptera/QCThesis/results/kmeans/mariana/kmeans_results.csv'
results_big = '/home/chiroptera/QCThesis/results/kmeans/mariana/kmeans_results_very_big_1ppt.csv'

In [183]:
res = pd.read_csv(results_path)
for col in res.columns:
    print col


Unnamed: 0
cardinality
dimensionality
number of clusters
number of iterations
label mode
centroid mode
round
total time
label time
centroid time
cum_data_transfer
n_data_transfer
std_data_transfer
max_data_transfer
min_data_transfer
cum_centroids_transfer
n_centroids_transfer
std_centroids_transfer
max_centroids_transfer
min_centroids_transfer
cum_labels_transfer
n_labels_transfer
std_labels_transfer
max_labels_transfer
min_labels_transfer
cum_dists_transfer
n_dists_transfer
std_dists_transfer
max_dists_transfer
min_dists_transfer
cum_kernel
n_kernel
std_kernel
max_kernel
min_kernel

In [185]:
# time not spend in either computing the labels or the centroids
res['useless time'] = res['total time'] - (res['label time'] + res['centroid time'])

In [186]:
# build new results with all modes in same row

# get columns and ignore index column
new_cols = list(res.columns.values)[1:]
new_cols.remove('total time')
new_cols.remove('useless time') # I'll save stats instead of this
new_cols.remove('label time')
new_cols.remove('centroid time')
new_cols.remove('label mode')
new_cols.remove('centroid mode')
new_cols.extend(['python label time', 'python centroid time',
                 'numpy label time', 'numpy centroid time',
                 'numba label time', 'numba centroid time',
                 'cuda label time',
                 'useless time mean', 'useless time std', 'useless time min', 'useless time max'])
cuda_event_timings_keys = [  'n_data_transfer', 'cum_data_transfer', 'std_data_transfer', 'max_data_transfer', 'min_data_transfer',
                             'n_centroids_transfer', 'cum_centroids_transfer', 'std_centroids_transfer', 'max_centroids_transfer', 'min_centroids_transfer',
                             'n_labels_transfer', 'cum_labels_transfer', 'std_labels_transfer', 'max_labels_transfer', 'min_labels_transfer',
                             'n_dists_transfer', 'cum_dists_transfer', 'std_dists_transfer', 'max_dists_transfer', 'min_dists_transfer',
                             'n_kernel', 'cum_kernel', 'std_kernel', 'max_kernel', 'min_kernel']
#new_cols.extend(cuda_event_timings_keys)
cres = pd.DataFrame(columns=new_cols)

In [187]:
idx = 0
for key, grp in res.groupby(by=['cardinality','dimensionality','number of clusters','number of iterations','round']):
    new_row = {col: 0 for col in cres.columns}
    
    card, dim, nc, niter, r = key
    
    new_row['cardinality'] = card
    new_row['dimensionality'] = dim
    new_row['number of clusters'] = nc
    new_row['number of iterations'] = niter
    new_row['round'] = r
    
    #card, dim, nc, niter, r = key
    
    numba_time_count = 0
    
    if (grp['label mode'] == 'python').any():
        py_label, py_centroid = grp[grp['label mode']=='python'][['label time', 'centroid time']].values[0]
        new_row['python label time'] = py_label
        new_row['python centroid time'] = py_centroid
        
    if (grp['label mode'] == 'numpy').any():
        np_label, np_centroid = grp[grp['label mode']=='numpy'][['label time', 'centroid time']].values[0]
        new_row['numpy label time'] = np_label
        new_row['numpy centroid time'] = np_centroid
        
    if (grp['label mode'] == 'numba').any():
        numba_time_count += 1
        nb_label, nb_centroid = grp[grp['label mode']=='numba'][['label time', 'centroid time']].values[0]
        new_row['numba centroid time'] = 1.0 * (new_row.get('numba centroid time', 0.0) + nb_centroid) / numba_time_count
        new_row['numba label time'] = nb_label
        
    if (grp['label mode'] == 'cuda').any():
        numba_time_count += 1
        cuda_label, nb_centroid2 = grp[grp['label mode']=='cuda'][['label time', 'centroid time']].values[0]
        new_row['numba centroid time'] = 1.0 * (new_row.get('numba centroid time', 0.0) + nb_centroid2) / numba_time_count
        new_row['cuda label time'] = cuda_label
        
        for cet_key in cuda_event_timings_keys:
            new_row[cet_key] = grp[grp['label mode'] == 'cuda'][cet_key].values[0]

    useless_time_mean = grp['useless time'].mean()
    useless_time_std = grp['useless time'].std()
    useless_time_min = grp['useless time'].min()
    useless_time_max = grp['useless time'].max()
        
    new_row['useless time mean'] = useless_time_mean
    new_row['useless time std'] = useless_time_std
    new_row['useless time min'] = useless_time_min
    new_row['useless time max'] = useless_time_max
    
    cres.loc[idx] = new_row
    idx += 1        

    
# compute data, centroids, labels and dists sizes
cres.data_size = cres.cardinality * cres.dimensionality * 4
cres.centroids_size = cres['number of clusters'] * cres.dimensionality * 4
cres.labels_dists_size = cres.cardinality * 4

#print key
#grp[grp['label mode']=='python']
#python_label_time = grp[grp['label mode']=='python']['label time']

In [188]:
cres['cuda numba label speedup'] = cres['numba label time'] / cres['cuda label time']
cres['cuda numpy label speedup'] = cres['numpy label time'] / cres['cuda label time']
print cres['cuda numba label speedup'].max()


inf

In [191]:
cres['data_size'] = cres['cardinality'] * cres['dimensionality'] * 4 / 1024.0**2
cres['centroids_size'] = cres['number of clusters'] * cres['dimensionality'] * 4 / 1024.0**2

In [193]:
cres[['cardinality','dimensionality','number of clusters','cuda numba label speedup', 'cuda numpy label speedup','data_size','centroids_size']].corr()


Out[193]:
cardinality dimensionality number of clusters cuda numba label speedup cuda numpy label speedup data_size centroids_size
cardinality NaN NaN NaN NaN NaN NaN NaN
dimensionality NaN 1.000000 -0.373688 -0.754810 -0.655065 1.000000 0.029477
number of clusters NaN -0.373688 1.000000 0.640865 0.740788 -0.373688 0.710439
cuda numba label speedup NaN -0.754810 0.640865 1.000000 0.974675 -0.754810 0.544157
cuda numpy label speedup NaN -0.655065 0.740788 0.974675 1.000000 -0.655065 0.662153
data_size NaN 1.000000 -0.373688 -0.754810 -0.655065 1.000000 0.029477
centroids_size NaN 0.029477 0.710439 0.544157 0.662153 0.029477 1.000000

In [176]:
#cres_mean = cres_mean.reset_index()
idx = cres['cardinality']==500000
cres.loc[idx,['cardinality','dimensionality','number of clusters','cuda numba label speedup', 'cuda numpy label speedup','data_size','centroids_size']]


Out[176]:
cardinality dimensionality number of clusters cuda numba label speedup cuda numpy label speedup data_size centroids_size

In [194]:
cres.loc[500000,['cuda numba label speedup','cuda numpy label speedup']]


---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-194-31b728ba7b92> in <module>()
----> 1 cres.loc[500000,['cuda numba label speedup','cuda numpy label speedup']]

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in __getitem__(self, key)
   1185     def __getitem__(self, key):
   1186         if type(key) is tuple:
-> 1187             return self._getitem_tuple(key)
   1188         else:
   1189             return self._getitem_axis(key, axis=0)

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getitem_tuple(self, tup)
    698     def _getitem_tuple(self, tup):
    699         try:
--> 700             return self._getitem_lowerdim(tup)
    701         except IndexingError:
    702             pass

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getitem_lowerdim(self, tup)
    823         for i, key in enumerate(tup):
    824             if is_label_like(key) or isinstance(key, tuple):
--> 825                 section = self._getitem_axis(key, axis=i)
    826 
    827                 # we have yielded a scalar ?

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _getitem_axis(self, key, axis)
   1331 
   1332         # fall thru to straight lookup
-> 1333         self._has_valid_type(key, axis)
   1334         return self._get_label(key, axis=axis)
   1335 

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in _has_valid_type(self, key, axis)
   1293                 raise
   1294             except:
-> 1295                 error()
   1296 
   1297         return True

/home/chiroptera/anaconda/lib/python2.7/site-packages/pandas/core/indexing.pyc in error()
   1280                         "cannot use label indexing with a null key")
   1281                 raise KeyError("the label [%s] is not in the [%s]" %
-> 1282                                (key, self.obj._get_axis_name(axis)))
   1283 
   1284             try:

KeyError: 'the label [500000] is not in the [index]'

In [126]:
cres = cres.set_index(['cardinality','dimensionality','number of clusters'])

In [114]:
cres.loc[cres['cuda numpy label speedup']>1,['cardinality','dimensionality','number of clusters','round','cuda numpy label speedup']]


Out[114]:
cardinality dimensionality number of clusters round cuda numpy label speedup

In [164]:
cres_mean = cres.groupby(by=['cardinality','dimensionality','number of clusters']).mean()
del cres_mean['round']

In [106]:
cres_mean.loc[100000]


Out[106]:
number of iterations cum_data_transfer n_data_transfer std_data_transfer max_data_transfer min_data_transfer cum_centroids_transfer n_centroids_transfer std_centroids_transfer max_centroids_transfer ... numpy centroid time numba label time numba centroid time cuda label time useless time mean useless time std useless time min useless time max cuda numba label speedup cuda numpy label speedup
dimensionality number of clusters
2 2 3 0.000495 1 0 0.000495 0.000495 0.001321 3 0.000009 0.000451 ... 0.009716 0.013387 0.001086 0.009966 0.000459 0.000185 0.000315 0.000667 1.343603 3.738400
4 3 0.000511 1 0 0.000511 0.000511 0.001024 3 0.000077 0.000439 ... 0.009875 0.013121 0.001087 0.009875 0.000479 0.000209 0.000298 0.000695 1.328227 3.742855
8 3 0.000493 1 0 0.000493 0.000493 0.001321 3 0.000011 0.000454 ... 0.009636 0.013537 0.001090 0.010222 0.000459 0.000185 0.000296 0.000649 1.331215 3.647037
16 3 0.000498 1 0 0.000498 0.000498 0.001274 3 0.000031 0.000452 ... 0.009847 0.013190 0.001085 0.010007 0.000459 0.000178 0.000317 0.000658 1.318165 3.793219
32 3 0.000491 1 0 0.000491 0.000491 0.000932 3 0.000100 0.000452 ... 0.009941 0.013222 0.001086 0.009851 0.000478 0.000201 0.000311 0.000698 1.342555 3.791641
64 3 0.000493 1 0 0.000493 0.000493 0.000932 3 0.000103 0.000457 ... 0.009814 0.013413 0.001091 0.009864 0.000454 0.000174 0.000324 0.000652 1.360121 3.796750
256 3 0.000499 1 0 0.000499 0.000499 0.000915 3 0.000096 0.000440 ... 0.009819 0.013521 0.001087 0.009844 0.000468 0.000197 0.000297 0.000676 1.373460 3.799682
512 3 0.000494 1 0 0.000494 0.000494 0.000926 3 0.000097 0.000446 ... 0.009710 0.013699 0.001086 0.009827 0.000467 0.000185 0.000299 0.000651 1.393904 3.826528
1024 3 0.000511 1 0 0.000511 0.000511 0.000903 3 0.000090 0.000428 ... 0.009866 0.013503 0.001089 0.009822 0.000483 0.000204 0.000310 0.000693 1.375048 3.814726
1536 3 0.000497 1 0 0.000497 0.000497 0.000925 3 0.000101 0.000451 ... 0.010199 0.013461 0.001087 0.009840 0.000482 0.000199 0.000320 0.000700 1.367560 3.769281
2048 3 0.000493 1 0 0.000493 0.000493 0.000921 3 0.000098 0.000445 ... 0.010357 0.013549 0.001089 0.009844 0.000456 0.000169 0.000337 0.000648 1.376317 3.781524
20 2 3 0.001717 1 0 0.001717 0.001717 0.001314 3 0.000024 0.000458 ... 0.011999 0.048816 0.002194 0.106894 0.000535 0.000208 0.000368 0.000762 0.456671 0.781525
4 3 0.001719 1 0 0.001719 0.001719 0.001360 3 0.000011 0.000467 ... 0.012064 0.049004 0.002164 0.106915 0.000510 0.000173 0.000363 0.000690 0.458354 0.777455
8 3 0.001718 1 0 0.001718 0.001718 0.001319 3 0.000023 0.000464 ... 0.012060 0.049076 0.002168 0.107009 0.000502 0.000173 0.000374 0.000697 0.458618 0.780539
16 3 0.001718 1 0 0.001718 0.001718 0.001336 3 0.000013 0.000463 ... 0.011963 0.049073 0.002155 0.106795 0.000530 0.000190 0.000372 0.000735 0.459520 0.783763
32 3 0.001711 1 0 0.001711 0.001711 0.001351 3 0.000013 0.000464 ... 0.011884 0.049245 0.002160 0.106828 0.000499 0.000155 0.000383 0.000674 0.460974 0.773334
64 3 0.001709 1 0 0.001709 0.001709 0.001328 3 0.000013 0.000457 ... 0.012082 0.048834 0.002153 0.106777 0.000520 0.000193 0.000361 0.000728 0.457342 0.775521
256 3 0.001715 1 0 0.001715 0.001715 0.001320 3 0.000005 0.000447 ... 0.012103 0.049044 0.002137 0.106799 0.000506 0.000166 0.000365 0.000678 0.459223 0.785862
512 3 0.001715 1 0 0.001715 0.001715 0.001344 3 0.000008 0.000459 ... 0.012144 0.049067 0.002164 0.106783 0.000495 0.000160 0.000374 0.000674 0.459494 0.778624
1024 3 0.001711 1 0 0.001711 0.001711 0.001321 3 0.000008 0.000450 ... 0.012407 0.049024 0.002151 0.106793 0.000580 0.000249 0.000393 0.000861 0.459068 0.781399
1536 3 0.001715 1 0 0.001715 0.001715 0.001317 3 0.000010 0.000452 ... 0.012092 0.049457 0.002144 0.106730 0.000498 0.000166 0.000372 0.000686 0.463384 0.776206
2048 3 0.001712 1 0 0.001712 0.001712 0.001321 3 0.000011 0.000454 ... 0.012055 0.048880 0.002150 0.106779 0.000521 0.000196 0.000363 0.000734 0.457773 0.779653
200 2 3 0.013469 1 0 0.013469 0.013469 0.001364 3 0.000064 0.000532 ... 0.030434 0.391868 0.010195 1.542716 0.000596 0.000215 0.000380 0.000807 0.254012 0.406336
4 3 0.013463 1 0 0.013463 0.013463 0.001361 3 0.000059 0.000519 ... 0.030515 0.392166 0.010177 1.542462 0.000589 0.000199 0.000415 0.000801 0.254247 0.406195
8 3 0.013455 1 0 0.013455 0.013455 0.001369 3 0.000060 0.000530 ... 0.030606 0.391745 0.010221 1.542721 0.000616 0.000220 0.000417 0.000848 0.253931 0.406454
16 3 0.013476 1 0 0.013476 0.013476 0.001404 3 0.000045 0.000521 ... 0.030378 0.391570 0.010192 1.542801 0.000583 0.000200 0.000401 0.000793 0.253805 0.407198
32 3 0.013481 1 0 0.013481 0.013481 0.001416 3 0.000054 0.000536 ... 0.030153 0.392009 0.010200 1.542803 0.000611 0.000247 0.000380 0.000865 0.254089 0.407643
64 3 0.013476 1 0 0.013476 0.013476 0.001433 3 0.000051 0.000531 ... 0.030203 0.391948 0.010185 1.542788 0.000595 0.000216 0.000379 0.000806 0.254052 0.407162
256 3 0.013486 1 0 0.013486 0.013486 0.001452 3 0.000042 0.000532 ... 0.030047 0.391906 0.010173 1.542931 0.000580 0.000193 0.000414 0.000787 0.254001 0.407037
512 3 0.013497 1 0 0.013497 0.013497 0.001433 3 0.000046 0.000527 ... 0.030143 0.391862 0.010146 1.542911 0.000614 0.000214 0.000417 0.000838 0.253976 0.406648
1024 3 0.013490 1 0 0.013490 0.013490 0.001395 3 0.000054 0.000526 ... 0.030530 0.392111 0.010175 1.542831 0.000602 0.000207 0.000393 0.000805 0.254151 0.406927
1536 3 0.013486 1 0 0.013486 0.013486 0.001407 3 0.000050 0.000528 ... 0.030296 0.391976 0.010163 1.542646 0.000611 0.000244 0.000384 0.000864 0.254093 0.407184
2048 3 0.013541 1 0 0.013541 0.013541 0.001388 3 0.000056 0.000526 ... 0.030166 0.392212 0.010202 1.542639 0.000591 0.000210 0.000379 0.000793 0.254247 0.406356
1000 2 3 0.065931 1 0 0.065931 0.065931 0.001502 3 0.000036 0.000535 ... 0.109344 1.877551 0.050642 7.711388 0.028038 0.047716 0.000426 0.083125 0.243478 0.385286
4 3 0.065582 1 0 0.065582 0.065582 0.001526 3 0.000028 0.000533 ... 0.110806 1.876441 0.050255 7.711727 0.000684 0.000290 0.000425 0.000984 0.243323 0.386326
8 3 0.065593 1 0 0.065593 0.065593 0.001536 3 0.000034 0.000544 ... 0.109600 1.876346 0.050734 7.711164 0.000652 0.000295 0.000416 0.000981 0.243328 0.386274
16 3 0.065579 1 0 0.065579 0.065579 0.001542 3 0.000025 0.000537 ... 0.110891 1.876447 0.050588 7.711306 0.000677 0.000318 0.000387 0.001000 0.243337 0.386235
32 3 0.065580 1 0 0.065580 0.065580 0.001527 3 0.000032 0.000537 ... 0.110615 1.876391 0.050745 7.711228 0.000662 0.000303 0.000388 0.000985 0.243332 0.386019
64 3 0.065595 1 0 0.065595 0.065595 0.001538 3 0.000028 0.000536 ... 0.110257 1.876394 0.050824 7.710855 0.000657 0.000298 0.000421 0.000990 0.243344 0.386114
256 3 0.065639 1 0 0.065639 0.065639 0.001529 3 0.000027 0.000532 ... 0.110303 1.877722 0.050476 7.711882 0.000692 0.000292 0.000437 0.000997 0.243484 0.385078
512 3 0.065638 1 0 0.065638 0.065638 0.001551 3 0.000029 0.000544 ... 0.110194 1.877799 0.050513 7.712155 0.000651 0.000297 0.000415 0.000982 0.243486 0.385220
1024 3 0.065663 1 0 0.065663 0.065663 0.001523 3 0.000036 0.000540 ... 0.110580 1.877624 0.050500 7.711420 0.000730 0.000371 0.000389 0.001119 0.243486 0.385136
1536 3 0.065665 1 0 0.065665 0.065665 0.001520 3 0.000032 0.000536 ... 0.109440 1.877612 0.050460 7.711928 0.000671 0.000311 0.000389 0.001002 0.243469 0.385020
2048 3 0.065600 1 0 0.065600 0.065600 0.001549 3 0.000024 0.000538 ... 0.110256 1.883465 0.050484 7.710800 0.000657 0.000296 0.000419 0.000986 0.244263 0.385023

44 rows × 39 columns


In [102]:
corr_df = cres_mean.reset_index()
#idx = corr_df['cuda numba label speedup'] > 0.5
corr_df.loc[:,['cardinality','dimensionality','number of clusters','cuda numba label speedup','cuda numpy label speedup']].corr()


Out[102]:
cardinality dimensionality number of clusters cuda numba label speedup cuda numpy label speedup
cardinality 1.000000 -0.222484 0.044364 0.324409 0.599914
dimensionality -0.222484 1.000000 -0.023249 -0.232960 -0.341337
number of clusters 0.044364 -0.023249 1.000000 0.019672 0.069347
cuda numba label speedup 0.324409 -0.232960 0.019672 1.000000 0.545961
cuda numpy label speedup 0.599914 -0.341337 0.069347 0.545961 1.000000

In [53]:
idx1 = cres['cardinality'] > 10000

idx = idx2
cres.loc[idx,['cardinality','dimensionality','number of clusters','round','cuda numba label speedup','cuda numpy label speedup']].corr()


Out[53]:
cardinality dimensionality number of clusters round cuda numba label speedup cuda numpy label speedup
cardinality 1.000000e+00 -2.621719e-01 -4.536120e-17 -1.075095e-18 0.517051 0.532394
dimensionality -2.621719e-01 1.000000e+00 6.929616e-17 6.871852e-19 -0.454872 -0.424134
number of clusters -4.536120e-17 6.929616e-17 1.000000e+00 5.009981e-19 0.001952 -0.000572
round -1.075095e-18 6.871852e-19 5.009981e-19 1.000000e+00 -0.001818 -0.002517
cuda numba label speedup 5.170508e-01 -4.548715e-01 1.952342e-03 -1.817724e-03 1.000000 0.995850
cuda numpy label speedup 5.323937e-01 -4.241343e-01 -5.717134e-04 -2.517397e-03 0.995850 1.000000

In [48]:
idx1 = cres['cuda numba label speedup']>1
idx2 = cres['cardinality'] == 5000000
idx = idx1 & idx2
cres.loc[idx,['cardinality','dimensionality','number of clusters','round','cuda numba label speedup']]


Out[48]:
cardinality dimensionality number of clusters round cuda numba label speedup
1490 5000000 2 2 0 2.067798
1491 5000000 2 2 1 1.954208
1492 5000000 2 2 2 1.865434
1493 5000000 2 2 3 2.025426
1494 5000000 2 2 4 1.932612
1495 5000000 2 4 0 1.969693
1496 5000000 2 4 1 2.096238
1497 5000000 2 4 2 1.865795
1498 5000000 2 4 3 2.009481
1499 5000000 2 4 4 2.050129
1500 5000000 2 8 0 2.038468
1501 5000000 2 8 1 1.964281
1502 5000000 2 8 2 1.934316
1503 5000000 2 8 3 1.946007
1504 5000000 2 8 4 1.862139
1505 5000000 2 16 0 1.948933
1506 5000000 2 16 1 1.946964
1507 5000000 2 16 2 1.912023
1508 5000000 2 16 3 1.936094
1509 5000000 2 16 4 2.021006
1510 5000000 2 32 0 1.998661
1511 5000000 2 32 1 1.952615
1512 5000000 2 32 2 2.096906
1513 5000000 2 32 3 1.828351
1514 5000000 2 32 4 1.883354
1515 5000000 2 64 0 1.861053
1516 5000000 2 64 1 1.972008
1517 5000000 2 64 2 1.972869
1518 5000000 2 64 3 1.939205
1519 5000000 2 64 4 1.895267
1520 5000000 2 256 0 1.948578
1521 5000000 2 256 1 1.978392
1522 5000000 2 256 2 1.995964
1523 5000000 2 256 3 1.882922
1524 5000000 2 256 4 1.820329
1525 5000000 2 512 0 1.990446
1526 5000000 2 512 1 1.980790
1527 5000000 2 512 2 2.026493
1528 5000000 2 512 3 1.980087
1529 5000000 2 512 4 1.959358
1530 5000000 2 1024 0 1.978620
1531 5000000 2 1024 1 1.921838
1532 5000000 2 1024 2 1.968076
1533 5000000 2 1024 3 2.030130
1534 5000000 2 1024 4 1.901266
1535 5000000 2 1536 0 1.850929
1536 5000000 2 1536 1 1.891216
1537 5000000 2 1536 2 2.017557
1538 5000000 2 1536 3 1.940267
1539 5000000 2 1536 4 1.968673
1540 5000000 2 2048 0 1.898735
1541 5000000 2 2048 1 2.059286
1542 5000000 2 2048 2 2.009832
1543 5000000 2 2048 3 2.029678
1544 5000000 2 2048 4 1.960749