From c67b56fb1e287488c6ba86fdde21bd8e6a48a460 Mon Sep 17 00:00:00 2001 From: Teppy Date: Tue, 18 Jun 2024 19:19:25 -0400 Subject: [PATCH] changes --- src/main.rs | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7ad8827..c9f7779 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,6 +27,7 @@ struct Trader { balances: HashMap, // Maps Currency to Amount } +#[derive(Clone)] struct Asset { name: String, royalty0_rate: FiNum, // Traders get this when entered @@ -46,6 +47,7 @@ impl Asset { } } } + impl Trader { fn new(name:&str,id:usize) -> Self { Trader { @@ -70,6 +72,8 @@ struct Order { sell_qty: FiNum, sell_remain: FiNum, buy_qty: FiNum, + royalty_remain: FiNum, // Based on royalty1 + commission_remain: FiNum, // Based on commission1 owner: usize, rt_loc: usize, // Location in the Royalty Tree } @@ -77,6 +81,7 @@ struct Order { struct RoyaltyTree { tree: Vec, next_entry: usize, + spare_change: FiNum, // Waiting to be distributed } struct Royalty { @@ -93,7 +98,7 @@ impl Royalty { impl RoyaltyTree { fn new() -> Self { - RoyaltyTree { tree:Vec::new(), next_entry:0 } + RoyaltyTree { tree:Vec::new(), next_entry:0, spare_change:FiNum::new() } } fn weight_here_below(&self, index:usize) -> FiNum { self.tree[index].weight @@ -151,8 +156,11 @@ impl RoyaltyTree { self.tree[index].acc } fn add_royalty(&mut self, amount: FiNum) { - let ff=self.forefather(); - self.tree[ff].lazy+=amount; + if self.tree.next_entry==0 { self.spare_change+=amount } + else { + let ff=self.forefather(); + if self.weight_here_below(ff).is_zero() { self.spare_change+=amount } else { self.tree[ff].lazy+=amount }; + } } fn add_weight(&mut self, index: usize, weight: FiNum) { if self.tree.len()>0 { @@ -235,12 +243,9 @@ impl Market { royalties: HashMap::new(), royalty_rate: HashMap::new(), }; - rval.register_trader("*NONE*"); + rval.register_trader("*HOUSE*"); rval } - fn number_to_name(&self, n: usize) -> String { - self.assets[n].name.clone() - } fn sanity_check(&self) { println!("Sanity Checking Market..."); for (cur,amt) in self.money_supply.iter() { @@ -276,6 +281,12 @@ impl Market { self.money_supply.insert(self.assets.len()-1,FiNum::new(0)); self.assets.len()-1 } + fn number_to_asset(&self, n: usize) -> Asset { + self.assets[n].clone() + } + fn number_to_name(&self, n: usize) -> String { + self.assets[n].name.clone() + } fn name_to_number(&self, name:&str) -> usize { *self.asset_name2num.get(name).unwrap() } @@ -307,13 +318,22 @@ impl Market { if initial_balanceFiNum::new(0) && self.orders.contains_key(&ap) && self.orders.get(&ap).unwrap().v.len()>0 { let mut elt=(*(self.orders.get(&ap).unwrap().v[0].borrow())).clone(); - if sell_qty_initial/buy_qty_initial>=elt.buy_qty/elt.sell_qty { // Transact at ask_rate + if sell_qty0/buy_qty_initial>=elt.buy_qty/elt.sell_qty { // Transact at ask_rate let qty=std::cmp::min(elt.sell_remain,buy_qty); elt.sell_remain-=qty; buy_qty-=qty; - let pay_qty=qty*elt.buy_qty/elt.sell_qty; // 1.8499*194623/2.9744 + let pay_qty=qty*elt.buy_qty/elt.sell_qty; self.traders[owner as usize].sub_balance(sell_type,pay_qty); self.traders[owner as usize].add_balance(buy_type ,qty); self.traders[elt.owner as usize].add_balance(sell_type,pay_qty); @@ -325,7 +345,7 @@ impl Market { let ap=(sell_type,buy_type); if let None=self.orders.get_mut(&ap) { self.orders.insert(ap,PQueue::new()); } let bids=self.orders.get_mut(&ap).unwrap(); - let sell_qty_remain=sell_qty_initial*buy_qty/buy_qty_initial; + let sell_qty_remain=sell_qty0*buy_qty/buy_qty_initial; if sell_qty_remain>0.into() { let rt=self.royalties.entry(buy_type).or_insert(RoyaltyTree::new()); rt.add_weight(rt.next_entry,buy_qty); // Weight should really be the quantity you would be able to immediately transact rather than how much you wish for.