diff --git a/src/main.rs b/src/main.rs index 6b5a64d..0befb64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -251,27 +251,37 @@ impl RoyaltyTree { if self.tree.len()==0 { return None } let mut f=self.forefather(); while self.count_here_below(f)>0 { + if f&1==0 { return Some(f); } let c0=self.count_here(f); - let c1=if f&1==0 { 0 } else { self.count_here_below(wt_left(f).unwrap()) }; - let c2=if f&1==0 { 0 } else { self.count_here_below(wt_right(f).unwrap()) }; + let c1=if f&1==0 { self.count_here(f) } else { self.count_here_below(wt_left(f).unwrap()) }; + let c2=if f&1==0 { self.count_here(f) } else { self.count_here_below(wt_right(f).unwrap()) }; let c=c0+c1+c2; let r=rng.gen_range(0..c); - if r FiNum { FiNum::zero() } - fn sub_weight(&mut self, index: usize, weight: FiNum) { + fn sub_weight(&mut self, index: usize, mut weight: FiNum) { self.get_royalty(index); - let redist=self.tree[index].acc; - self.tree[index].acc=FiNum::zero(); + let delta_count; + let wh=self.weight_here(index); + let redist=if weight>=wh { delta_count=if wh>FiNum::zero() { 1 } else { 0 }; weight=wh; self.tree[index].acc } + else { delta_count=0; self.tree[index].acc*weight/wh }; + self.tree[index].acc-=redist; let mut index=index; let ff=self.forefather(); - while index!=ff { self.tree[index].weight-=weight; index=wt_parent(index); } + if delta_count>0 { println!("YES ITS > 0"); } + while index!=ff { + self.tree[index].weight-=weight; + self.tree[index].count-=delta_count; + if index==ff { break; } + index=wt_parent(index); + } self.add_royalty(redist); } fn set_location(&mut self, id: usize, index: usize) { @@ -286,7 +296,7 @@ impl RoyaltyTree { self.expand_to(ff1*2); while ff0FiNum::zero() { - self.tree[index].count+=1; - } + loop { self.tree[index].weight+=weight; + self.tree[index].count+=delta_count; + if index==ff { break; } index=wt_parent(index); - } - if self.weight_here(index)==FiNum::zero() && weight>FiNum::zero() { - self.tree[index].count+=1; - } - self.tree[index].weight+=weight; + } } fn forefather(&self) -> usize { wt_forefather(self.tree.len()-1) @@ -805,16 +810,19 @@ fn royalty_stuff() { rt.dump(); rt.add_weight(5,FiNum::new_i32(1)); rt.dump(); - return; - for i in 1..1000000 { - rt.dump(); +// return; + for i in 1..10000 { +// rt.dump(); + let node=rng.gen_range(0..10); match rng.gen_range(0..10) { - 0 => rt.add_weight(rng.gen_range(0..8),FiNum::new_i32(rng.gen_range(0..101))), - 1 => rt.add_royalty(FiNum::new_i32(rng.gen_range(0..10))), - 2 => println!("Random Order ID: {:?}",rt.random_order_id(&mut rng)), + 0 => { println!("Add at {}",node); rt.add_weight(node,FiNum::new_i32(rng.gen_range(0..101))) }, + 1 => { println!("Sub at {}",node); rt.sub_weight(node,FiNum::new_i32(rng.gen_range(0..101))) }, + 2 => rt.add_royalty(FiNum::new_i32(rng.gen_range(0..10))), + 3 => println!("Random Order ID: {:?}",rt.random_order_id(&mut rng)), _ => (), } } + rt.dump(); }