From 79e00955dc1ecefc1f03c3648a9c88c326f5cc59 Mon Sep 17 00:00:00 2001 From: Teppy Date: Fri, 2 Aug 2024 08:29:24 -0400 Subject: [PATCH] changes --- src/main.rs | 53 ++++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index c83209e..c3b8c82 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,12 +44,13 @@ use std::fs::OpenOptions; use std::path::Path; use std::io::{self, BufRead, Write}; use std::env; -use std::collections::HashMap; +//use std::collections::HashMap; use std::cmp::Ordering; use std::rc::Rc; use std::cell::RefCell; use rand::prelude::*; use rand::rngs::StdRng; +use hashbrown::HashMap; mod finum; use finum::FiNum; @@ -393,23 +394,25 @@ impl Market { let mut log:Vec=Vec::new(); let asset0=self.number_to_asset(asset_type0); let asset1=self.number_to_asset(asset_type1); + log.push(format!("Executing batch {} {} <-> {} {}",strike0,asset0.name,strike1,asset1.name)); let ap0=(asset_type0,asset_type1); let ap1=(asset_type1,asset_type0); - let bids0=self.orders.get_mut(&ap0).unwrap(); - let bids1=self.orders.get_mut(&ap1).unwrap(); - while !bids0.empty() && !bids1.empty() && bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1 && bids1.peek().sell_qty/bids1.peek().buy_qty<=strike1/strike0 { - let asset0_getting=std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty); - let asset0_paying =std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty); - let asset1_getting=std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty); - let asset1_paying =std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty); - bids0.peek().sell_remain-=asset0_paying; - bids1.peek().sell_remain-=asset1_paying; - self.traders[bids0.peek().owner].add_balance(asset_type0,asset0_getting); - self.traders[bids1.peek().owner].add_balance(asset_type1,asset1_getting); - if bids0.peek().sell_remain==0 { bids0.pop(); } - if bids1.peek().sell_remain==0 { bids1.pop(); } - } - Result::ExecutedBatch(FiNum::zero(),FiNum::zero()) + let [bids0,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap(); + while !bids0.empty() && !bids1.empty() + && bids0.peek().borrow().sell_qty/bids0.peek().borrow().buy_qty>=strike0/strike1 + && bids1.peek().borrow().sell_qty/bids1.peek().borrow().buy_qty>=strike1/strike0 { + let asset0_paying =std::cmp::min(bids0.peek().borrow().sell_remain,strike0*bids1.peek().borrow().sell_remain/bids1.peek().borrow().sell_qty); + let asset1_paying =std::cmp::min(bids1.peek().borrow().sell_remain,strike1*bids0.peek().borrow().sell_remain/bids0.peek().borrow().sell_qty); + bids0.peek().borrow_mut().sell_remain-=asset0_paying; + bids1.peek().borrow_mut().sell_remain-=asset1_paying; + self.traders[bids0.peek().borrow().owner].add_balance(asset_type1,asset1_paying); + self.traders[bids1.peek().borrow().owner].add_balance(asset_type0,asset0_paying); + log.push(format!(" {} got {} {}, {} got {} {}",self.traders[bids0.peek().borrow().owner].name,asset1_paying,asset1.name, + self.traders[bids1.peek().borrow().owner].name,asset0_paying,asset0.name)); + if bids0.peek().borrow().sell_remain==FiNum::zero() { bids0.pop(); } + if bids1.peek().borrow().sell_remain==FiNum::zero() { bids1.pop(); } + } + Result::ExecutedBatch(log) } fn make_order(&mut self, owner:usize, sell_type:usize, buy_type:usize, sell_qty_initial:FiNum, buy_qty_initial:FiNum, execute_if_possible:bool) -> Result { let mut log:Vec=Vec::new(); @@ -531,7 +534,7 @@ impl PQueue { &self.v[0] } fn empty(&self) -> bool { - self.v.len()>0 + self.v.len()==0 } fn bubble_up(&mut self, pos: usize) -> usize { if pos>0 { @@ -684,11 +687,11 @@ fn royalty_stuff() { enum Result { - AddedTrader(usize), - AddedAsset(usize), + AddedTrader(usize,String), + AddedAsset(usize,String), PlacedOrder(usize, Vec), FundsRemaining(FiNum), - ExecutedBatch(FiNum,FiNum), + ExecutedBatch(Vec), Error(String), Ok } @@ -763,9 +766,9 @@ impl Result { fn describe(&self) -> String { match self { Self::PlacedOrder(order_id,vec) => format!("Placed order {}:\n {}",order_id,vec.join("\n ")), - Self::AddedTrader(id) => format!("Added Trader Id {}",id), - Self::AddedAsset(id) => format!("Added Asset Id {}",id), - Self::ExecutedBatch(amt0,amt1) => format!("Executed Batch {} / {}",amt0,amt1), + Self::AddedTrader(id,name) => format!("Added Trader Id {}: {}",id,name), + Self::AddedAsset(id,name) => format!("Added Asset Id {}: {}",id,name), + Self::ExecutedBatch(vec) => format!("{}",vec.join("\n")), Self::FundsRemaining(amt) => format!("Funds Remaining: {}",amt), Self::Ok => format!("Ok"), Self::Error(str) => format!("Error: {}",str), @@ -783,11 +786,11 @@ impl Market { match cmd { Command::AddTrader { user: user_name } => { let id=self.register_trader(user_name); - Result::AddedTrader(id) + Result::AddedTrader(id,user_name.to_string()) } Command::AddAsset { asset: asset_name } => { if let Some(cur)=self.register_asset(asset_name) { - Result::AddedAsset(cur) + Result::AddedAsset(cur,asset_name.to_string()) } else { Result::Error(format!("Asset {} already exists.",asset_name)) } } Command::SetRoyalty { asset_id,roy0,com0,roy1,com1 } => {