Warning: session_start(): open(/var/lib/php/sessions/sess_9sb2gh1gqknbg4vjc8vut7b6g7, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
persistable sclass GeometricPriceCells is PriceCells {
// cell size in percent
settable double cellSizeInPercent;
// one of the cell limits
settable double basePrice;
*(double *cellSizeInPercent) {}
*(double *basePrice, double *cellSizeInPercent) {}
double ratio() {
ret 1+cellSizeInPercent/100;
}
double toLogScale(double price) {
ret log(price, ratio());
}
double fromLogScale(double logPrice) {
ret pow(ratio(), logPrice);
}
double logBasePrice() {
ret toLogScale(basePrice);
}
double remainder(double price) {
ret remainer(toLogScale(price));
}
double remainderLog(double logPrice) {
ret frac(price-logBasePrice());
}
// TODO: fix this logic's rounding problems
public bool isCellLimit(double price) {
ret remainder(price) == 0;
}
public double nextCellLimitLog(double logPrice) {
double r = remainderLog(logPrice);
ret logPrice + 1-r;
}
public double nextCellLimit(double price) {
ret fromLogScale(nextCellLimitLog(toLogScale(price)));
}
public double previousCellLimitLog(double logPrice) {
double r = remainderLog(price);
ret logPrice - (r == 0 ? 1 : r);
}
public double previousCellLimit(double price) {
ret fromLogScale(previousCellLimitLog(toLogScale(price)));
}
public double nCellLimitsDown(double price, int n) {
double logPrice = toLogScale(price);
logPrice = previousCellLimitLog(price)-(n-1);
ret fromLogScale(logPrice);
}
public double nCellLimitsUp(double price, int n) {
double logPrice = toLogScale(price);
logPrice = nextCellLimitLog(logPrice)+n;
ret fromLogScale(logPrice);
}
public double priceToCellNumber(double price) {
ret toLogScale(price)-logBasePrice();
}
}