Skip to content
Snippets Groups Projects
Commit f448e988 authored by Vincent Texier's avatar Vincent Texier
Browse files

New calculation for referentials values and informations tab

Values are based on discrete time t = last UD bloc time
parent f4d371d2
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
...@@ -41,13 +41,7 @@ def relative(units, community): ...@@ -41,13 +41,7 @@ def relative(units, community):
:param cutecoin.core.community.Community community: Community instance :param cutecoin.core.community.Community community: Community instance
:return: float :return: float
""" """
# fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']" relative_value = units / float(community.dividend)
# calculate ud(t+1)
ud = math.ceil(
max(community.dividend,
community.parameters['c'] * community.monetary_mass / community.get_ud_block()['membersCount'])
)
relative_value = units / float(ud)
return relative_value return relative_value
...@@ -59,7 +53,6 @@ def quantitative_zerosum(units, community): ...@@ -59,7 +53,6 @@ def quantitative_zerosum(units, community):
:param cutecoin.core.community.Community community: Community instance :param cutecoin.core.community.Community community: Community instance
:return: int :return: int
""" """
# fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']"
average = community.monetary_mass / community.get_ud_block()['membersCount'] average = community.monetary_mass / community.get_ud_block()['membersCount']
return units - average return units - average
...@@ -72,15 +65,9 @@ def relative_zerosum(units, community): ...@@ -72,15 +65,9 @@ def relative_zerosum(units, community):
:param cutecoin.core.community.Community community: Community instance :param cutecoin.core.community.Community community: Community instance
:return: float :return: float
""" """
# fixme: the value "community.nb_members" is not up to date, luckyly the good value is in "community.get_ud_block()['membersCount']" median = community.monetary_mass / community.get_ud_block()['membersCount']
median = community.monetary_mass / community.nb_members relative_value = units / float(community.dividend)
# calculate ud(t+1) relative_median = median / community.dividend
ud = math.ceil(
max(community.dividend,
community.parameters['c'] * community.monetary_mass / community.get_ud_block()['membersCount'])
)
relative_value = units / float(ud)
relative_median = median / ud
return relative_value - relative_median return relative_value - relative_median
......
...@@ -5,6 +5,7 @@ Created on 1 févr. 2014 ...@@ -5,6 +5,7 @@ Created on 1 févr. 2014
''' '''
from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtCore import QObject, pyqtSignal
import math
from ucoinpy.api import bma from ucoinpy.api import bma
from ucoinpy.documents.block import Block from ucoinpy.documents.block import Block
from ..tools.exceptions import NoPeerAvailable from ..tools.exceptions import NoPeerAvailable
...@@ -232,6 +233,29 @@ class Community(QObject): ...@@ -232,6 +233,29 @@ class Community(QObject):
else: else:
return 1 return 1
@property
def computed_dividend(self):
"""
Get the computed community universal dividend.
Calculation based on t = last UD block time and on values from the that block :
UD(computed) = CEIL(MAX(UD(t) ; c * M(t) / N(t)))
:return: The computed UD or 1 if no UD was generated.
"""
block = self.get_ud_block()
if block:
return math.ceil(
max(
self.dividend,
self.parameters['c'] * block['monetaryMass'] / block['membersCount']
)
)
else:
return 1
def get_ud_block(self, x=0): def get_ud_block(self, x=0):
''' '''
Get a block with universal dividend Get a block with universal dividend
...@@ -240,7 +264,8 @@ class Community(QObject): ...@@ -240,7 +264,8 @@ class Community(QObject):
:return: The last block with universal dividend. :return: The last block with universal dividend.
''' '''
blocks = self.request(bma.blockchain.UD)['result']['blocks'] blocks = self.request(bma.blockchain.UD)['result']['blocks']
if len(blocks) > 0: # if ud blocks exist and index requested exists...
if len(blocks) > 0 and len(blocks)-(1+x) >= 0:
block_number = blocks[len(blocks)-(1+x)] block_number = blocks[len(blocks)-(1+x)]
block = self.request(bma.blockchain.Block, block = self.request(bma.blockchain.Block,
req_args={'number': block_number}) req_args={'number': block_number})
......
...@@ -37,38 +37,85 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ...@@ -37,38 +37,85 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
# try to request money variables from last ud block # try to request money variables from last ud block
try: try:
block = self.community.get_ud_block() block_ud = self.community.get_ud_block()
except Exception as e: except Exception as e:
logging.debug('community get_ud_block error : ' + str(e)) logging.debug('community get_ud_block error : ' + str(e))
return False return False
try: try:
block_t_minus_1 = self.community.get_ud_block(1) block_ud_minus_1 = self.community.get_ud_block(1)
except Exception as e: except Exception as e:
logging.debug('community get_ud_block error : ' + str(e)) logging.debug('community get_ud_block error : ' + str(e))
return False return False
if block: if block_ud:
ud = self.get_referential_diff_value(block['dividend']) ud = self.get_referential_diff_value(block_ud['dividend'])
# if referential type is quantitative... # if referential type is quantitative...
if self.account.ref_type() == 'q': if self.account.ref_type() == 'q':
# display int values # display int values
# use the float type of 64bits, to avoid display a 32bit signed integer... # use the float type of 64bits, to avoid display a 32bit signed integer...
localized_ud = QLocale().toString(float(ud), 'f', 0) localized_ud = QLocale().toString(float(ud), 'f', 0)
localized_mass_per_member = QLocale().toString( # display int values
float(self.get_referential_diff_value(block['monetaryMass'] / block['membersCount'])), 'f', 0 localized_ud_plus_1 = QLocale().toString(
float(
self.get_referential_diff_value(
self.community.computed_dividend
)
),
'f',
0
) )
localized_monetary_mass = QLocale().toString( localized_mass = QLocale().toString(
float(self.get_referential_diff_value(block['monetaryMass'])), 'f', 0 float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', 0
) )
if block_ud_minus_1:
localized_mass_minus_1_per_member = QLocale().toString(
float(
self.get_referential_diff_value(
block_ud_minus_1['monetaryMass'] / block_ud['membersCount']
)
), 'f', 0
)
localized_mass_minus_1 = QLocale().toString(
float(self.get_referential_diff_value(block_ud_minus_1['monetaryMass'])), 'f', 0
)
else:
localized_mass_minus_1_per_member = QLocale().toString(
float(0), 'f', 0
)
localized_mass_minus_1 = QLocale().toString(
float(0), 'f', 0
)
else: else:
# display float values # display float values
localized_ud = QLocale().toString(ud, 'f', 6) localized_ud = QLocale().toString(ud, 'f', 6)
localized_mass_per_member = QLocale().toString( # display float values
self.get_referential_diff_value(block['monetaryMass'] / block['membersCount']), 'f', 6 localized_ud_plus_1 = QLocale().toString(
float(
self.get_referential_diff_value(
self.community.computed_dividend
)
),
'f',
6
) )
localized_monetary_mass = QLocale().toString( localized_mass = QLocale().toString(
self.get_referential_diff_value(block['monetaryMass']), 'f', 6 float(self.get_referential_diff_value(block_ud['monetaryMass'])), 'f', 6
) )
if block_ud_minus_1:
localized_mass_minus_1_per_member = QLocale().toString(
self.get_referential_diff_value(
block_ud_minus_1['monetaryMass'] / block_ud['membersCount']), 'f', 6
)
localized_mass_minus_1 = QLocale().toString(
self.get_referential_diff_value(block_ud_minus_1['monetaryMass']), 'f', 6
)
else:
localized_mass_minus_1_per_member = QLocale().toString(
float(0), 'f', 6
)
localized_mass_minus_1 = QLocale().toString(
float(0), 'f', 6
)
# set infos in label # set infos in label
self.label_general.setText( self.label_general.setText(
...@@ -80,25 +127,32 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ...@@ -80,25 +127,32 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
<tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table> </table>
""").format( """).format(
localized_ud, localized_ud,
self.tr('Universal Dividend UD(t) in'), self.tr('Universal Dividend UD(t) in'),
self.get_referential_diff_name(), self.get_referential_diff_name(),
localized_monetary_mass, localized_mass_minus_1,
self.tr('Monetary Mass M(t) in'), self.tr('Monetary Mass M(t-1) in'),
self.get_referential_diff_name(), self.get_referential_diff_name(),
block['membersCount'], block_ud['membersCount'],
self.tr('Members N(t)'), self.tr('Members N(t)'),
localized_mass_per_member, localized_mass_minus_1_per_member,
self.tr('Monetary Mass per member M(t)/N(t) in'), self.tr('Monetary Mass per member M(t-1)/N(t) in'),
self.get_referential_diff_name(), self.get_referential_diff_name(),
block['dividend'] / (block_t_minus_1['monetaryMass'] / block_t_minus_1['membersCount']), block_ud['dividend'] / (block_ud_minus_1['monetaryMass'] / block_ud['membersCount']),
params['dt'] / 86400, params['dt'] / 86400,
self.tr('Actual growth c = UD(t)/[M(t-1)/N(t-1)]'), self.tr('Actual growth c = UD(t)/[M(t-1)/N(t)]'),
QLocale.toString( QLocale.toString(
QLocale(), QLocale(),
QDateTime.fromTime_t(block['medianTime'] + params['dt']), QDateTime.fromTime_t(block_ud['medianTime']),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
),
self.tr('Last UD date and time (t)'),
QLocale.toString(
QLocale(),
QDateTime.fromTime_t(block_ud['medianTime'] + params['dt']),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat) QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
), ),
self.tr('Next UD date and time (t+1)') self.tr('Next UD date and time (t+1)')
...@@ -107,35 +161,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ...@@ -107,35 +161,7 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
else: else:
self.label_general.setText(self.tr('No Universal Dividend created yet.')) self.label_general.setText(self.tr('No Universal Dividend created yet.'))
if block: if block_ud:
# if referential type is quantitative...
if self.account.ref_type() == 'q':
# display int values
localized_ud_t1 = QLocale().toString(
float(
self.get_referential_diff_value(
math.ceil(
max(block['dividend'], params['c'] * block['monetaryMass'] / block['membersCount'])
)
)
),
'f',
0
)
else:
# display float values
localized_ud_t1 = QLocale().toString(
float(
self.get_referential_diff_value(
math.ceil(
max(block['dividend'], params['c'] * block['monetaryMass'] / block['membersCount'])
)
)
),
'f',
6
)
# set infos in label # set infos in label
self.label_rules.setText( self.label_rules.setText(
self.tr(""" self.tr("""
...@@ -147,16 +173,16 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): ...@@ -147,16 +173,16 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget):
""").format( """).format(
self.tr('{:2.0%} / {:} days').format(params['c'], params['dt'] / 86400), self.tr('{:2.0%} / {:} days').format(params['c'], params['dt'] / 86400),
self.tr('Fundamental growth (c) / Delta time (dt)'), self.tr('Fundamental growth (c) / Delta time (dt)'),
self.tr('UD(t+1) = MAX { UD(t) ; c &#215; M(t) / N(t) }'), self.tr('UD(t+1) = MAX { UD(t) ; c &#215; M(t) / N(t+1) }'),
self.tr('Universal Dividend (formula)'), self.tr('Universal Dividend (formula)'),
self.tr('{:} = MAX {{ {:} {:} ; {:2.0%} &#215; {:} {:} / {:} }}').format( self.tr('{:} = MAX {{ {:} {:} ; {:2.0%} &#215; {:} {:} / {:} }}').format(
localized_ud_t1, localized_ud_plus_1,
localized_ud, localized_ud,
self.get_referential_diff_name(), self.get_referential_diff_name(),
params['c'], params['c'],
localized_monetary_mass, localized_mass,
self.get_referential_diff_name(), self.get_referential_diff_name(),
block['membersCount'] block_ud['membersCount']
), ),
self.tr('Universal Dividend (computed)') self.tr('Universal Dividend (computed)')
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment