This commit is contained in:
2024-08-10 16:52:07 -04:00
parent b7d7cb8560
commit a41b5d4627

View File

@@ -200,14 +200,26 @@ impl RoyaltyTree {
self.tree[index].acc self.tree[index].acc
} }
fn add_royalty(&mut self, amount: FiNum) { fn add_royalty(&mut self, amount: FiNum) {
if self.next_entry==0 { self.spare_change+=amount } if self.next_entry==0 || FiNum::is_zero(self.tree[self.forefather()].weight) { self.spare_change+=amount }
else { else {
let ff=self.forefather(); let ff=self.forefather();
if self.weight_here_below(ff).is_zero() { self.spare_change+=amount } else { self.tree[ff].lazy+=amount }; if self.weight_here_below(ff).is_zero() { self.spare_change+=amount } else { self.tree[ff].lazy+=amount };
} }
} }
fn remove_order_id(&mut self, id: usize) { fn remove_order_id(&mut self, id: usize) { // And zero out in the tree
let pos=*self.order_finder.get(&id).unwrap();
self.order_finder.remove(&id); self.order_finder.remove(&id);
let weight=self.tree[pos].weight;
self.sub_weight(pos,weight);
}
fn sub_weight(&mut self, index: usize, weight: FiNum) {
self.get_royalty(index);
let redist=self.tree[index].acc;
self.tree[index].acc=FiNum::zero();
let mut index=index;
let ff=self.forefather();
while index!=ff { self.tree[index].weight-=weight; index=wt_parent(index); }
self.add_royalty(redist);
} }
fn set_location(&mut self, id: usize, index: usize) { fn set_location(&mut self, id: usize, index: usize) {
self.order_finder.insert(id,index); self.order_finder.insert(id,index);
@@ -610,6 +622,23 @@ impl OrderQueue {
} }
impl Market { impl Market {
fn random_orders(&mut self, seed: u64, count: u64) {
let mut rng: StdRng=StdRng::seed_from_u64(13u64);
for _ in 1..count {
let cmd=match rng.gen_range(1..2) {
1 => Command::AddFunds { user_id: rng.gen_range(1..self.traders.len()-1),
asset_id: rng.gen_range(0..self.assets.len()-1),
amt: FiNum::new(rng.gen_range(1<<32..20<<32)), },
2 => Command::Order { user_id: rng.gen_range(1..self.traders.len()-1),
sell_type: rng.gen_range(0..self.assets.len()-1),
sell_qty: FiNum::new(rng.gen_range(1<<32..20<<32)),
buy_type: rng.gen_range(0..self.assets.len()-1),
buy_qty: FiNum::new(rng.gen_range(1<<32..20<<32)), },
_ => Command::Error("This can never happen".to_string()),
};
self.execute(&cmd);
}
}
fn exercise(&mut self) { fn exercise(&mut self) {
let mut rng: StdRng=StdRng::seed_from_u64(13u64); let mut rng: StdRng=StdRng::seed_from_u64(13u64);
let teppy=self.register_trader("Teppy"); let teppy=self.register_trader("Teppy");