diff --git a/src/main.rs b/src/main.rs index 2113a4e..6af043d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -99,7 +99,8 @@ impl RoyaltyTree { fn capture0(&mut self, index: usize) -> &mut Self { if index &mut Self { // Clear out lazy by drilling from root to index - let ff=wt_forefather(index); + fn drill(&mut self, index: usize) { + let mut f=self.forefather(); + while f!=index { + self.capture0(f); + f=if f>index { wt_left(f).unwrap() } else { wt_right(f).unwrap() } + } + self.capture0(f); + } + fn capture(&mut self, index: usize) { + let f=self.forefather(); let mut index=index; - while index!=ff { + while index!=f { self.capture0(index); index=wt_parent(index); } - self - } + self.capture0(index); + } + fn add_royalty(&mut self, amount: FiNum) { + let ff=self.forefather(); + self.tree[ff].lazy+=amount; + } + fn insert(&mut self, weight: FiNum) { + self.tree.push(Royalty::new()); + let mut index=self.tree.len()-1; + let rval=index; + let ff=self.forefather(); + while index!=ff { + self.tree[index].weight+=weight; + index=wt_parent(index); + } + self.tree[index].weight+=weight; + } + fn forefather(&self) -> usize { + wt_forefather(self.tree.len()-1) + } fn dump(&self) { for index in 0..self.tree.len() { - println!("Index {} Weight {}",index,self.tree[index].weight); + println!("Index {} Weight {} Lazy {} Acc {}",index,self.tree[index].weight,self.tree[index].lazy,self.tree[index].acc); } } } @@ -280,7 +307,8 @@ impl Market { let bids=self.orders.get_mut(&ap).unwrap(); let sell_qty_remain=sell_qty_initial*buy_qty/buy_qty_initial; if sell_qty_remain>0.into() { - let rt_loc=self.royalties.entry(sell_type).or_insert(RoyaltyTree::new()).insert(sell_qty_remain,FiNum::zero()); + self.royalties.entry(sell_type).or_insert(RoyaltyTree::new()).insert(sell_qty_remain); + let rt_loc=self.royalties.get(&sell_type).unwrap().tree.len(); let neworder=Rc::new(RefCell::new( Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt_loc } )); bids.insert(neworder); @@ -451,11 +479,13 @@ fn tree_stuff() { fn royalty_stuff() { let mut rt=RoyaltyTree::new(); - for _ in 0..20 { - rt.insert(FiNum::new_i32(10),FiNum::zero()); + for _ in 0..3 { + let index=rt.insert(FiNum::new_i32(10)); + rt.add_royalty(FiNum::new_i32(24)) } + rt.dump(); for index in 0..rt.tree.len() { - println!("Index: {} Royalty: {}",index,rt.tree[index].weight); + println!("Index: {} Royalty: {}",index,rt.weight_here_below(index)); } }