This commit is contained in:
2024-08-02 08:29:24 -04:00
parent 2c173df888
commit 79e00955dc

View File

@@ -44,12 +44,13 @@ use std::fs::OpenOptions;
use std::path::Path; use std::path::Path;
use std::io::{self, BufRead, Write}; use std::io::{self, BufRead, Write};
use std::env; use std::env;
use std::collections::HashMap; //use std::collections::HashMap;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::rc::Rc; use std::rc::Rc;
use std::cell::RefCell; use std::cell::RefCell;
use rand::prelude::*; use rand::prelude::*;
use rand::rngs::StdRng; use rand::rngs::StdRng;
use hashbrown::HashMap;
mod finum; mod finum;
use finum::FiNum; use finum::FiNum;
@@ -393,23 +394,25 @@ impl Market {
let mut log:Vec<String>=Vec::new(); let mut log:Vec<String>=Vec::new();
let asset0=self.number_to_asset(asset_type0); let asset0=self.number_to_asset(asset_type0);
let asset1=self.number_to_asset(asset_type1); 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 ap0=(asset_type0,asset_type1);
let ap1=(asset_type1,asset_type0); let ap1=(asset_type1,asset_type0);
let bids0=self.orders.get_mut(&ap0).unwrap(); let [bids0,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap();
let bids1=self.orders.get_mut(&ap1).unwrap(); while !bids0.empty() && !bids1.empty()
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 { && bids0.peek().borrow().sell_qty/bids0.peek().borrow().buy_qty>=strike0/strike1
let asset0_getting=std::cmp::min(bids1.peek().sell_remain,bids0.peek().buy_qty*bids0.peek().sell_remain/bids0.peek().sell_qty); && bids1.peek().borrow().sell_qty/bids1.peek().borrow().buy_qty>=strike1/strike0 {
let asset0_paying =std::cmp::min(bids0.peek().sell_remain,bids1.peek().buy_qty*bids1.peek().sell_remain/bids1.peek().sell_qty); let asset0_paying =std::cmp::min(bids0.peek().borrow().sell_remain,strike0*bids1.peek().borrow().sell_remain/bids1.peek().borrow().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().borrow().sell_remain,strike1*bids0.peek().borrow().sell_remain/bids0.peek().borrow().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().borrow_mut().sell_remain-=asset0_paying;
bids0.peek().sell_remain-=asset0_paying; bids1.peek().borrow_mut().sell_remain-=asset1_paying;
bids1.peek().sell_remain-=asset1_paying; self.traders[bids0.peek().borrow().owner].add_balance(asset_type1,asset1_paying);
self.traders[bids0.peek().owner].add_balance(asset_type0,asset0_getting); self.traders[bids1.peek().borrow().owner].add_balance(asset_type0,asset0_paying);
self.traders[bids1.peek().owner].add_balance(asset_type1,asset1_getting); log.push(format!(" {} got {} {}, {} got {} {}",self.traders[bids0.peek().borrow().owner].name,asset1_paying,asset1.name,
if bids0.peek().sell_remain==0 { bids0.pop(); } self.traders[bids1.peek().borrow().owner].name,asset0_paying,asset0.name));
if bids1.peek().sell_remain==0 { bids1.pop(); } if bids0.peek().borrow().sell_remain==FiNum::zero() { bids0.pop(); }
if bids1.peek().borrow().sell_remain==FiNum::zero() { bids1.pop(); }
} }
Result::ExecutedBatch(FiNum::zero(),FiNum::zero()) 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 { 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<String>=Vec::new(); let mut log:Vec<String>=Vec::new();
@@ -531,7 +534,7 @@ impl<T: Dumpable + std::cmp::PartialOrd + std::fmt::Debug> PQueue<T> {
&self.v[0] &self.v[0]
} }
fn empty(&self) -> bool { fn empty(&self) -> bool {
self.v.len()>0 self.v.len()==0
} }
fn bubble_up(&mut self, pos: usize) -> usize { fn bubble_up(&mut self, pos: usize) -> usize {
if pos>0 { if pos>0 {
@@ -684,11 +687,11 @@ fn royalty_stuff() {
enum Result { enum Result {
AddedTrader(usize), AddedTrader(usize,String),
AddedAsset(usize), AddedAsset(usize,String),
PlacedOrder(usize, Vec<String>), PlacedOrder(usize, Vec<String>),
FundsRemaining(FiNum), FundsRemaining(FiNum),
ExecutedBatch(FiNum,FiNum), ExecutedBatch(Vec<String>),
Error(String), Error(String),
Ok Ok
} }
@@ -763,9 +766,9 @@ impl Result {
fn describe(&self) -> String { fn describe(&self) -> String {
match self { match self {
Self::PlacedOrder(order_id,vec) => format!("Placed order {}:\n {}",order_id,vec.join("\n ")), Self::PlacedOrder(order_id,vec) => format!("Placed order {}:\n {}",order_id,vec.join("\n ")),
Self::AddedTrader(id) => format!("Added Trader Id {}",id), Self::AddedTrader(id,name) => format!("Added Trader Id {}: {}",id,name),
Self::AddedAsset(id) => format!("Added Asset Id {}",id), Self::AddedAsset(id,name) => format!("Added Asset Id {}: {}",id,name),
Self::ExecutedBatch(amt0,amt1) => format!("Executed Batch {} / {}",amt0,amt1), Self::ExecutedBatch(vec) => format!("{}",vec.join("\n")),
Self::FundsRemaining(amt) => format!("Funds Remaining: {}",amt), Self::FundsRemaining(amt) => format!("Funds Remaining: {}",amt),
Self::Ok => format!("Ok"), Self::Ok => format!("Ok"),
Self::Error(str) => format!("Error: {}",str), Self::Error(str) => format!("Error: {}",str),
@@ -783,11 +786,11 @@ impl Market {
match cmd { match cmd {
Command::AddTrader { user: user_name } => { Command::AddTrader { user: user_name } => {
let id=self.register_trader(user_name); let id=self.register_trader(user_name);
Result::AddedTrader(id) Result::AddedTrader(id,user_name.to_string())
} }
Command::AddAsset { asset: asset_name } => { Command::AddAsset { asset: asset_name } => {
if let Some(cur)=self.register_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)) } } else { Result::Error(format!("Asset {} already exists.",asset_name)) }
} }
Command::SetRoyalty { asset_id,roy0,com0,roy1,com1 } => { Command::SetRoyalty { asset_id,roy0,com0,roy1,com1 } => {