lbry-sdk/lbrynet/core/PriceModel.py
2016-10-03 02:44:58 -04:00

41 lines
1.4 KiB
Python

from lbrynet.conf import MIN_BLOB_DATA_PAYMENT_RATE
def get_default_price_model(blob_tracker, **kwargs):
return MeanAvailabilityWeightedPrice(blob_tracker, **kwargs)
class MeanAvailabilityWeightedPrice(object):
"""
Calculate mean-blob-availability and stream-position weighted price for a blob
Attributes:
min_price (float): minimum accepted price
base_price (float): base price to shift from
alpha (float): constant used to more highly value blobs at the beginning of a stream
alpha defaults to 1.0, which has a null effect
blob_tracker (BlobAvailabilityTracker): blob availability tracker
"""
def __init__(self, tracker, base_price=MIN_BLOB_DATA_PAYMENT_RATE, alpha=1.0):
self.blob_tracker = tracker
self.base_price = base_price
self.alpha = alpha
def calculate_price(self, blob):
mean_availability = self.blob_tracker.last_mean_availability
availability = self.blob_tracker.availability.get(blob, [])
index = 0 # blob.index
price = self.base_price * (mean_availability / max(1, len(availability))) / self._frontload(index)
return round(price, 5)
def _frontload(self, index):
"""
Get frontload multipler
@param index: blob position in stream
@return: frontload multipler
"""
return 2.0 - (self.alpha ** index)