changes
This commit is contained in:
52
src/main.rs
52
src/main.rs
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user