From 3b09e5d4bc7ae7c7a551e1700a85221c533d8976 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Wed, 24 Mar 2021 16:25:25 +0000 Subject: [PATCH] mmnode-blocks-info: -s avg -> -s col_avg; add non-tabular avg stats --- mmgen/node_tools/BlocksInfo.py | 43 ++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/mmgen/node_tools/BlocksInfo.py b/mmgen/node_tools/BlocksInfo.py index a668e9a..5c291f7 100644 --- a/mmgen/node_tools/BlocksInfo.py +++ b/mmgen/node_tools/BlocksInfo.py @@ -96,13 +96,14 @@ class BlocksInfo: ) fs_lsqueeze2 = ('interval',) - all_stats = ['avg','total','range','diff'] - dfl_stats = ['range','diff'] - noindent_stats = ['avg'] + all_stats = ['col_avg','range','avg','total','diff'] + dfl_stats = ['range','avg','diff'] + noindent_stats = ['col_avg'] avg_stats_skip = {'block', 'hash', 'date', 'version','miner'} stats_deps = { 'avg': set(fields) - avg_stats_skip, + 'col_avg':set(fields) - avg_stats_skip, 'total': {'interval','subsidy','totalfee','nTx','inputs','outputs','utxo_inc'}, 'range': {}, 'diff': {}, @@ -186,12 +187,15 @@ class BlocksInfo: if 'diff' in self.stats and not opt.stats and self.last != self.tip: self.stats.remove('diff') + if {'avg','col_avg'} <= set(self.stats) and opt.stats_only: + self.stats.remove('col_avg') + if opt.full_stats: add_fnames = {fname for sname in self.stats for fname in self.stats_deps[sname]} self.fnames = tuple(f for f in self.fields if f in {'block'} | set(self.fnames) | add_fnames ) else: - if 'avg' in self.stats and not self.fnames: - self.stats.remove('avg') + if 'col_avg' in self.stats and not self.fnames: + self.stats.remove('col_avg') # self.fnames is now finalized @@ -466,11 +470,6 @@ class BlocksInfo: } ) if elapsed: - if 'bs' in self.deps: - rate = (self.total_bytes / 10000) / (self.total_solve_time / 36) - yield ( 'Avg size: {} bytes', 'avg_size', '{}', self.total_bytes//total_blks ) - yield ( 'Avg weight: {} bytes', 'avg_weight', '{}', self.total_weight//total_blks ) - yield ( 'MB/hr: {}', 'mb_per_hour', '{:0.4f}', rate ) yield ( 'Start: {}', 'start_date', self.fmt_funcs['da'], self.hdrs[0]['time'] ) yield ( 'End: {}', 'end_date', self.fmt_funcs['da'], self.hdrs[-1]['time'] ) yield ( 'Avg BDI: {} min', 'avg_bdi', '{:.2f}', elapsed / nblocks / 60 ) @@ -522,7 +521,7 @@ class BlocksInfo: ('Est. diff adjust: {}%', 'est_diff_adjust_pct', '{:+.2f}', ((600 / bdi) - 1) * 100), )) - async def create_avg_stats(self): + async def create_col_avg_stats(self): def gen(): for field in self.fnames: if field in self.avg_stats_skip: @@ -534,7 +533,27 @@ class BlocksInfo: if not self.header_printed: self.print_header() fs = ''.join(self.gen_fs(self.fnames,fill=self.avg_stats_skip,add_name=True)).strip() - return ('averages', ('Averages:', (fs, dict(gen())) )) + return ('column_averages', ('Column averages:', (fs, dict(gen())) )) + + def avg_stats_data(self,data,spec_conv,spec_val): + coin = self.rpc.proto.coin + return data( + hdr = 'Averages for processed blocks:', + func = lambda field: sum(getattr(block,field) for block in self.res) // len(self.res), + spec_sufs = { 'subsidy': f' {coin}', 'totalfee': f' {coin}' }, + spec_convs = { + 'interval': spec_conv(0, lambda arg: secs_to_ms(arg)), + 'utxo_inc': spec_conv(-1, '{:<+}'), + 'mb_per_hour': spec_conv(0, '{:.4f}'), + }, + spec_vals = ( + spec_val( + 'mb_per_hour', 'MB/hr', 'interval', + lambda values: 'bs' in self.deps, + lambda values: (self.total_bytes / 10000) / (self.total_solve_time / 36) + ), + ) + ) def total_stats_data(self,data,spec_conv,spec_val): coin = self.rpc.proto.coin