Skip to content
This repository was archived by the owner on Apr 27, 2026. It is now read-only.

Commit 8be8453

Browse files
-Adding a missing condition on the number of available bond makers vs the number of desired counterparties before entering the algorithm that limits the maximum expected probability for large bond makers.
-Modifying which log statements are warning vs debug statements to reduce the number of lines printed on the console -Adding an extra warning log statement that prints the number of large makers that have their weight constrained by tx_max_expected_probability
1 parent f49768e commit 8be8453

1 file changed

Lines changed: 61 additions & 53 deletions

File tree

src/jmclient/support.py

Lines changed: 61 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -250,76 +250,84 @@ def fidelity_bond_weighted_order_choose(orders, n, nrem = None, large_makers_not
250250
prob = 1 - pow(((1 - tx_max_expected_probability) / large_makers_not_chosen_prob[0]), 1./nrem) if tx_max_expected_probability is not None and tx_max_expected_probability<1. else None
251251

252252
if prob is not None:
253+
254+
#If the number of remaining makers is sufficient to exclude some of them
255+
if nforders > nrem:
253256

254-
#If maximum expected probability target for large makers cannot be achieved using a constant value for prob
255-
if prob<=0 or nforders-nrem+1 <= 1. / prob:
256-
max_exp_prob = large_makers_not_chosen_prob[0]
257+
#If maximum expected probability target for large makers cannot be achieved using a constant value for prob
258+
if prob<=0 or nforders-nrem+1 <= 1. / prob:
259+
max_exp_prob = large_makers_not_chosen_prob[0]
257260

258-
for i in range(nforders-nrem+1, nforders+1):
259-
max_exp_prob *= 1 - 1./i
260-
max_exp_prob = 1 - max_exp_prob
261+
for i in range(nforders-nrem+1, nforders+1):
262+
max_exp_prob *= 1 - 1./i
263+
max_exp_prob = 1 - max_exp_prob
261264

262-
#If the probability target cannot be achieved at all
263-
if max_exp_prob > tx_max_expected_probability:
264-
log.warn('A large maker maximum expected probability target of ' + str(tx_max_expected_probability) + ' cannot be achieved. A probability of ' + str(max_exp_prob) + ' will be targeted instead')
265-
#Update prob using the maximum achievable target
266-
prob = 1 - pow(((1 - max_exp_prob) / large_makers_not_chosen_prob[0]), 1./nrem)
265+
#If the probability target cannot be achieved at all
266+
if max_exp_prob > tx_max_expected_probability:
267+
log.warn('A large maker maximum expected probability target of ' + str(tx_max_expected_probability) + ' cannot be achieved. A probability of ' + str(max_exp_prob) + ' will be targeted instead')
268+
#Update prob using the maximum achievable target
269+
prob = 1 - pow(((1 - max_exp_prob) / large_makers_not_chosen_prob[0]), 1./nrem)
267270

268-
else:
269-
log.debug('Large maker maximum expected probability target of ' + str(tx_max_expected_probability) + ' achievable using an increasing draw probability due to the limited number of makers')
270-
rem_not_chosen_prob = (1 - max_exp_prob) / large_makers_not_chosen_prob[0]
271+
else:
272+
log.warn('Large maker maximum expected probability target of ' + str(tx_max_expected_probability) + ' achievable using an increasing draw probability due to the limited number of makers')
273+
rem_not_chosen_prob = (1 - max_exp_prob) / large_makers_not_chosen_prob[0]
271274

272-
for i in range(nforders-nrem+1, nforders):
275+
for i in range(nforders-nrem+1, nforders):
273276

274-
if 1./i > prob:
275-
rem_not_chosen_prob /= 1 - 1./i
276-
log.debug('Large maker draw probability for draw ' + str(nforders + 1 - i) + ' set to ' + str(1./i))
277-
prob = 1 - pow(rem_not_chosen_prob, 1. / (nforders - i))
277+
if 1./i > prob:
278+
rem_not_chosen_prob /= 1 - 1./i
279+
log.warn('Large maker draw probability for draw ' + str(nforders + 1 - i) + ' set to ' + str(1./i))
280+
prob = 1 - pow(rem_not_chosen_prob, 1. / (nforders - i))
278281

279-
else:
280-
break
281-
log.debug('Large maker draw probability for first ' + str(nforders - i) + ' draws set to ' + str(prob) + ' per draw')
282+
else:
283+
break
284+
log.warn('Large maker draw probability for first ' + str(nforders - i) + ' draws set to ' + str(prob) + ' per draw')
282285

283-
else:
284-
log.debug('Large maker draw probability set to ' + str(prob) + ' for each draw')
286+
else:
287+
log.warn('Large maker draw probability set to ' + str(prob) + ' for each draw')
285288

286-
normal_bond_value_sum = 0
287-
nlargemakers = 0
288-
islargemaker = [False] * nforders
289+
normal_bond_value_sum = 0
290+
nlargemakers = 0
291+
islargemaker = [False] * nforders
289292

290-
log.debug(str(nforders) + ' remaining makers for the draw')
291-
for i, o in enumerate(filtered_orders):
292-
#log.debug(o[0])
293-
normal_bond_value_sum += weights[i]
294-
log.debug('Total value of fidelity bonds: ' + str(normal_bond_value_sum))
293+
log.debug(str(nforders) + ' remaining makers for the draw')
294+
for i, o in enumerate(filtered_orders):
295+
#log.debug(o[0])
296+
normal_bond_value_sum += weights[i]
297+
log.debug('Total value of fidelity bonds: ' + str(normal_bond_value_sum))
295298

296-
for i, o in enumerate(filtered_orders[::-1]):
297-
i = nforders - i - 1
299+
for i, o in enumerate(filtered_orders[::-1]):
300+
i = nforders - i - 1
298301

299-
if prob * (nlargemakers + 1) >= 1:
300-
break
301-
bvmax = prob * (normal_bond_value_sum - weights[i]) / (1. - prob * (nlargemakers + 1))
302-
#log.debug('Maker ' + o[0]['counterparty'] + ' weight ' + str(weights[i]) + ' vs ' + str(bvmax) + ": " + ('normal' if weights[i] <= bvmax else 'large'))
302+
if prob * (nlargemakers + 1) >= 1:
303+
break
304+
bvmax = prob * (normal_bond_value_sum - weights[i]) / (1. - prob * (nlargemakers + 1))
305+
#log.debug('Maker ' + o[0]['counterparty'] + ' weight ' + str(weights[i]) + ' vs ' + str(bvmax) + ": " + ('normal' if weights[i] <= bvmax else 'large'))
303306

304-
if weights[i] <= bvmax:
305-
break
306-
islargemaker[i] = True
307-
normal_bond_value_sum -= weights[i]
308-
nlargemakers += 1
307+
if weights[i] <= bvmax:
308+
break
309+
islargemaker[i] = True
310+
normal_bond_value_sum -= weights[i]
311+
nlargemakers += 1
309312

310-
if normal_bond_value_sum <= 0:
311-
log.warn('Only large makers are left, selecting a bond maker randomly')
312-
return random_under_max_order_choose(filtered_orders, nforders, large_makers_not_chosen_prob=large_makers_not_chosen_prob, tx_max_expected_probability=tx_max_expected_probability)
313+
if normal_bond_value_sum <= 0:
314+
log.warn('Only large makers are left, selecting a bond maker randomly')
315+
return random_under_max_order_choose(filtered_orders, nforders, large_makers_not_chosen_prob=large_makers_not_chosen_prob, tx_max_expected_probability=tx_max_expected_probability)
313316

314-
log.debug('Remaining probability of not being selected for large makers: ' + str(large_makers_not_chosen_prob[0]) + ' -> ' + str(large_makers_not_chosen_prob[0]*(1-prob)))
315-
large_makers_not_chosen_prob[0] *= 1 - prob
316-
bvmax = prob * normal_bond_value_sum / (1. - prob * nlargemakers)
317+
log.debug('Remaining probability of not being selected for large makers: ' + str(large_makers_not_chosen_prob[0]) + ' -> ' + str(large_makers_not_chosen_prob[0]*(1-prob)))
318+
large_makers_not_chosen_prob[0] *= 1 - prob
319+
bvmax = prob * normal_bond_value_sum / (1. - prob * nlargemakers)
317320

318-
for i, o in enumerate(filtered_orders):
321+
for i, o in enumerate(filtered_orders):
319322

320-
if islargemaker[i] == True:
321-
log.warn('Weight of counterparty ' + o[0]['counterparty'] + ' brought down to ' + str(bvmax) + ' from ' + str(weights[i]))
322-
weights[i]=bvmax
323+
if islargemaker[i] == True:
324+
log.debug('Weight of counterparty ' + o[0]['counterparty'] + ' brought down to ' + str(bvmax) + ' from ' + str(weights[i]))
325+
weights[i]=bvmax
326+
log.warn('The weight of ' + str(nlargemakers) + '/' + str(nforders) + ' bond makers was reduced to reduce their maximum expected probability of being selected')
327+
328+
#else if nforders<=nrem
329+
else:
330+
log.warn('Cannot set a maximum expected probability target for bond makers as the number of bond makers is smaller or equal to the number of required counterparties')
323331

324332
weights = [x / sum(weights) for x in weights]
325333
return filtered_orders[rand_weighted_choice(nforders, weights)]

0 commit comments

Comments
 (0)