From 2126b3804b2978f7e6a171b4d3ab29b21c4261bb Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Keck <jean-baptiste.keck@imag.fr>
Date: Sun, 18 Mar 2018 15:45:27 +0100
Subject: [PATCH] memory request report alignement

---
 hysop/core/memory/memory_request.py | 54 ++++++++++++++++++++++-------
 1 file changed, 42 insertions(+), 12 deletions(-)

diff --git a/hysop/core/memory/memory_request.py b/hysop/core/memory/memory_request.py
index 067711285..a30fb310c 100644
--- a/hysop/core/memory/memory_request.py
+++ b/hysop/core/memory/memory_request.py
@@ -149,6 +149,15 @@ class MemoryRequest(object):
 
         return dfield, request
 
+    def stuple(self):
+        if not hasattr(self,'id'):
+            id='None'
+        else:
+            id = self.id
+        size = bytes2str(self.min_bytes(), decimal=False)
+        ret = (id, size, self.nb_components, self.shape, self.dtype, self.alignment)
+        return tuple(map(str, ret))
+
     def __str__(self):
         if not hasattr(self,'id'):
             id='None'
@@ -353,27 +362,48 @@ class MultipleOperatorMemoryRequests(object):
         return buffers
 
     def __str__(self):
-        s=''
+        all_requests = {}
         for (backend, backend_requests) in self._all_requests_per_backend.iteritems():
-            kind = backend.kind 
-            if kind == Backend.OPENCL:
-                precision = ' on device {}'.format(backend.device.name)
-            else:
-                precision = ''
-            s+= ' Backend {}{}:'.format(kind, precision)
             total=0
             for op in sorted(backend_requests.keys(), key=lambda op: op.name):
                 op_requests = backend_requests[op]
-                s+= '\n  Operator {} ({})'.format(op.name, op.__class__.__name__)
+                sop_request = all_requests.setdefault(backend, {}).setdefault(op, [])
                 local_total=0
+                opname='{}'.format(op.name)
                 for req in op_requests:
-                    s+= '\n    *{}'.format(req)   
+                    sop_request.append((opname,)+req.stuple())
                     local_total+=req.max_bytes()
                 if local_total>total:
                     total=local_total
-            s +='\n  Total work requested: {} ({})'.format(
+        
+        sizes = {}
+        template = '\n'
+        titles=('OPERATOR', 'REQUEST_ID', 'SIZE', 'COMPONENTS', 'SHAPE', 'DTYPE', 'ALIGNMENT')
+        for (i,k) in enumerate(titles): 
+            k=k.lower()
+            template += '    '
+            size = max(len(req[i]) for breqs in all_requests.values() for reqs in breqs.values() for req in reqs)
+            size = max(size, len(k))
+            name=k+'_len'
+            sizes[name] = size
+            template += '{:'+('<' if i==0 else '^')+'{'+name+'}}'
+        
+        ss=''
+        for (backend, backend_srequests) in all_requests.iteritems():
+            kind = backend.kind 
+            if (kind == Backend.OPENCL):
+                precision = ' on device {}'.format(backend.device.name.strip())
+            else:
+                precision = ''
+            ss+= '\n {}{}:'.format(backend.full_tag, precision)
+            ss+= template.format(*titles, **sizes)
+            for op in sorted(backend_requests.keys(), key=lambda op: op.name):
+                sop_reqs = backend_srequests[op]
+                for sreq in sop_reqs:
+                    ss+= template.format(*sreq, **sizes)
+            ss +='\n  Total extra work buffers requested: {} ({})'.format(
                     bytes2str(total,decimal=False),
                     bytes2str(total,decimal=True))
-            s +='\n'
-        return s[:-1]
+            ss += '\n'
+        return ss[1:-1]
         
-- 
GitLab