changes
This commit is contained in:
50
src/main.rs
50
src/main.rs
@@ -99,7 +99,8 @@ impl RoyaltyTree {
|
||||
fn capture0(&mut self, index: usize) -> &mut Self {
|
||||
if index<self.tree.len() {
|
||||
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();
|
||||
} else {
|
||||
let lazy=self.tree[index].lazy;
|
||||
@@ -119,18 +120,44 @@ impl RoyaltyTree {
|
||||
}
|
||||
self
|
||||
}
|
||||
fn capture(&mut self, index: usize) -> &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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user