This commit is contained in:
2024-06-10 01:45:03 -04:00
parent 24170816e1
commit 974f9bbd82

View File

@@ -99,7 +99,8 @@ impl RoyaltyTree {
fn capture0(&mut self, index: usize) -> &mut Self { fn capture0(&mut self, index: usize) -> &mut Self {
if index<self.tree.len() { if index<self.tree.len() {
if index&1==0 { if index&1==0 {
self.tree[index].acc+=self.tree[index].lazy; let lazy=self.tree[index].lazy;
self.tree[index].acc+=lazy;
self.tree[index].lazy=FiNum::zero(); self.tree[index].lazy=FiNum::zero();
} else { } else {
let lazy=self.tree[index].lazy; let lazy=self.tree[index].lazy;
@@ -119,18 +120,44 @@ impl RoyaltyTree {
} }
self self
} }
fn capture(&mut self, index: usize) -> &mut Self { // Clear out lazy by drilling from root to index fn drill(&mut self, index: usize) {
let ff=wt_forefather(index); 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; let mut index=index;
while index!=ff { while index!=f {
self.capture0(index); self.capture0(index);
index=wt_parent(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) { fn dump(&self) {
for index in 0..self.tree.len() { 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 bids=self.orders.get_mut(&ap).unwrap();
let sell_qty_remain=sell_qty_initial*buy_qty/buy_qty_initial; let sell_qty_remain=sell_qty_initial*buy_qty/buy_qty_initial;
if sell_qty_remain>0.into() { 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( 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 } )); Order { owner:owner, sell_qty:sell_qty_remain, sell_remain:sell_qty_remain, buy_qty:buy_qty, rt_loc: rt_loc } ));
bids.insert(neworder); bids.insert(neworder);
@@ -451,11 +479,13 @@ fn tree_stuff() {
fn royalty_stuff() { fn royalty_stuff() {
let mut rt=RoyaltyTree::new(); let mut rt=RoyaltyTree::new();
for _ in 0..20 { for _ in 0..3 {
rt.insert(FiNum::new_i32(10),FiNum::zero()); let index=rt.insert(FiNum::new_i32(10));
rt.add_royalty(FiNum::new_i32(24))
} }
rt.dump();
for index in 0..rt.tree.len() { for index in 0..rt.tree.len() {
println!("Index: {} Royalty: {}",index,rt.tree[index].weight); println!("Index: {} Royalty: {}",index,rt.weight_here_below(index));
} }
} }