-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathauction_probability.js
108 lines (86 loc) · 3.09 KB
/
auction_probability.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* jshint node: true */
'use strict';
var config = require('./config');
var _ = require('lodash');
module.exports = {
probability: probability
};
function probability(auction, reservedAds) {
if (!reservedAds || !Array.isArray(reservedAds)) { reservedAds = []; }
// filter reservedAds in use
var inUseAds = _.filter(reservedAds, function(ad) {
return ad.in_use === true;
});
// global region names from config
var globalNames = [];
config.regions.forEach(function(region) {
if (!region.countries) {
globalNames.push(region.name);
}
});
// global regions from auction
var globalSlots = 0;
var auctionGlobalRegions = _.remove(auction.regions, function(region) {
if (_.contains(globalNames, region.name)) {
region.probability = [];
region.chances = [];
// global regions total number of slots
globalSlots = Number(globalSlots) + Number(region.slots);
return true;
}
else { return false; }
});
// probabilities for local auctions
auction.regions.forEach(function(region) {
// matching reserved Ads
var reservedSlots = 0;
inUseAds.forEach(function(ad) {
if (_.contains(ad.regions, region.name)) {
reservedSlots = reservedSlots + 1;
return;
}
var regionInter = _.intersection(globalNames, ad.regions);
if (regionInter.length > 0) {
reservedSlots = reservedSlots + 1;
}
});
// plus one for factoid
reservedSlots = reservedSlots + 1;
// add reservedSlots to this region
region.reservedSlots = Number(reservedSlots);
region.globalSlots = Number(globalSlots);
// total slots for this region
var totalSlots = Number(region.slots) + Number(globalSlots) + reservedSlots;
region.probability = '1 in ' + totalSlots;
region.chances = (100 * 1 / totalSlots).toFixed(5) + '%';
// add global probablities and chances to global region
auctionGlobalRegions.forEach(function(globalRegion) {
var probability = '\n 1 in ' + totalSlots;
globalRegion.probability.push(probability);
var chances = '\n ' + (100 * 1 / totalSlots).toFixed(5) + '% in ' + region.name;
globalRegion.chances.push(chances);
});
});
// probabilities for global auctions
auctionGlobalRegions.forEach(function(globalRegion) {
// matching global reserved Ads
var reservedSlots = 0;
inUseAds.forEach(function(ad) {
if (_.contains(ad.regions, globalRegion.name)) {
reservedSlots = reservedSlots + 1;
}
});
// plus one for factoid
reservedSlots = reservedSlots + 1;
// add reservedSlots to this region
globalRegion.reservedSlots = reservedSlots;
globalRegion.otherSlots = Number(globalSlots) - Number(globalRegion);
globalSlots = Number(globalSlots) + Number(reservedSlots);
// probablities and chances
var probability = ' 1 in ' + globalSlots;
globalRegion.probability.push(probability);
var chances = ' ' + (100 * 1 / globalSlots).toFixed(5) + '% for everywhere else';
globalRegion.chances.push(chances);
});
auction.regions = auction.regions.concat(auctionGlobalRegions);
}