Compare commits

10 Commits

Author SHA1 Message Date
e4908f5f19 changes 2025-05-27 20:23:51 -04:00
c8732cb2b0 changes 2025-05-13 17:48:17 -04:00
68d6b3d409 changes 2025-05-05 12:46:16 -04:00
1a958ec8df About to refactor make_order into execute_sub_order, in preparation for make_smart_order 2025-04-29 22:39:44 -04:00
771d18aeaa Added and tested Shadowing at the OrderQueue level 2025-04-21 23:37:02 -04:00
d4cbf229a6 changes 2025-04-09 14:54:13 -04:00
4a334d4f66 Path Finding and arbitrage detection works. Need to print out when detecting arbitrage. 2025-02-04 10:59:39 -05:00
8fa172da17 Totally working, best I can tell 2025-01-24 20:20:37 -05:00
2153a6ce96 changes 2025-01-21 16:37:07 -05:00
76a4610903 changes 2025-01-20 16:16:43 -05:00
712 changed files with 14886 additions and 114 deletions

0
.gitignore~ Normal file
View File

1001
1.log

File diff suppressed because it is too large Load Diff

49
Cargo.lock generated
View File

@@ -2,24 +2,6 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 version = 4
[[package]]
name = "ahash"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"once_cell",
"version_check",
"zerocopy",
]
[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.5.0" version = "1.5.0"
@@ -43,16 +25,6 @@ dependencies = [
"wasi", "wasi",
] ]
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"allocator-api2",
]
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.169" version = "0.2.169"
@@ -63,16 +35,9 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
name = "lzf1" name = "lzf1"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"hashbrown",
"rand", "rand",
] ]
[[package]]
name = "once_cell"
version = "1.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
version = "0.2.20" version = "0.2.20"
@@ -84,9 +49,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.92" version = "1.0.93"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@@ -132,9 +97,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.93" version = "2.0.96"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -147,12 +112,6 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]] [[package]]
name = "wasi" name = "wasi"
version = "0.11.0+wasi-snapshot-preview1" version = "0.11.0+wasi-snapshot-preview1"

View File

@@ -14,5 +14,4 @@ debug = true
[dependencies] [dependencies]
rand="0.8.5" rand="0.8.5"
hashbrown="0.14.5"

13
batchtrades.log Normal file
View File

@@ -0,0 +1,13 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
AF 1 0 186A000000000
AF 1 0 186A000000000
AF 2 1 600000000
OR 2 1 200000000 0 186A000000000
OR 2 1 200000000 0 1D4C000000000
OR 2 1 200000000 0 30D4000000000
ORB 1 0 2F9B800000000 1 300000000
EXE 0 2848800000000 1 300000000

18
demo.bak Normal file
View File

@@ -0,0 +1,18 @@
AT Teppy
AT Luni
AT Hamza
AT UncleSam
NOP Error: Could not find asset BTC
NOP Error: Could not find asset ETH
AA USD
AA BTC
AA ETH
AA SOL
AF 1 1 A00000000
AF 2 2 3200000000
AF 3 3 FA00000000
AF 4 0 F424000000000
OR 1 1 100000000 2 400000000
OR 2 2 100000000 3 400000000
OR 3 3 100000000 0 FA00000000
OR 1 1 100000000 3 1900000000

View File

@@ -1,15 +1,18 @@
AT Teppy ; addtrader Teppy AT Teppy
AT Luni ; addtrader Luni AT Luni
AT Hamza ; addtrader Hamza AT Hamza
AA USD ; addasset USD AT UncleSam
AA BTC ; addasset BTC NOP Error: Could not find asset BTC
SR 0 51EB851 28F5C28 7AE147A 28F5C28 ; setroyalty USD 0.02 0.01 0.03 0.01 NOP Error: Could not find asset ETH
SR 1 51EB851 28F5C28 7AE147A 28F5C28 ; setroyalty BTC 0.02 0.01 0.03 0.01 AA USD
AF 1 1 500000000 ; addfunds Teppy 5 BTC AA BTC
AF 2 0 186A000000000 ; addfunds Luni 100000 USD AA ETH
AF 3 0 186A000000000 ; addfunds Hamza 100000 USD AA SOL
OR 1 1 200000000 0 186A000000000 ; [login Teppy] order 2 BTC 100000 USD AF 1 1 A00000000
OR 2 0 753000000000 1 80000000 ; [login Luni] order 30000 USD 0.5 BTC AF 2 2 3200000000
OR 2 0 4E2000000000 1 80000000 ; [login Luni] order 20000 USD 0.5 BTC AF 3 3 FA00000000
OR 2 0 55F000000000 1 80000000 AF 4 0 F424000000000
OR 2 1 40000000 0 35B600000000 OR 1 1 100000000 2 400000000
OR 2 2 100000000 3 400000000
OR 3 3 100000000 0 FA00000000
OR 1 1 100000000 3 1900000000

14
demo.log~ Normal file
View File

@@ -0,0 +1,14 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 1 51EB851 28F5C28 33333333 28F5C28
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
SR 0 28F5C28 0 19999999 28F5C28
OR 0 1 100000000 0 C35000000000
OR 1 1 100000000 0 C35000000000
OR 2 0 9C4000000000 1 100000000
OR 3 0 753000000000 1 80000000

View File

@@ -1,11 +1,7 @@
AT Teppy AT Teppy
AT Luni AT Luni
AT Hamza
AA USD AA USD
AA BTC AA BTC
SR 0 51EB851 0 0 0 NOP Error: Could not parse quantity USD
SR 1 51EB851 0 0 0 AF 1 0 3E800000000
AF 1 1 500000000 AF 2 1 6400000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
OR 1 1 100000000 0 C35000000000

11
demo1.log~ Normal file
View File

@@ -0,0 +1,11 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 0 28F5C28 0 0
SR 1 0 28F5C28 0 0
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
OR 1 1 100000000 0 C35000000000

23
demo13.log~ Normal file
View File

@@ -0,0 +1,23 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 51EB851 28F5C28 33333333 19999999
SR 1 51EB851 28F5C28 33333333 19999999
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
AF 2 1 14F0117759
AF 1 1 1D1E0D15FF
AF 2 1 70D4B3855
OR 2 0 22E869AB9A 1 2327CD75D7
AF 2 1 12F54589D1
AF 1 0 16EC0573FE
AF 3 1 1DBA3B2F64
AF 1 0 22A45121F2
AF 3 0 BDB8CCB60
OR 2 0 21CDCD2B81 1 2407EB5978
AF 3 1 24E1249869
OR 3 0 231B497C77 1 7C6A3D844
OR 1 1 161753A88E 0 21069FA53A

10
demo13x.log~ Normal file
View File

@@ -0,0 +1,10 @@
AT Teppy
AT Hamza
AA USD
AA BTC
SR 0 0 0 0 33333333
SR 1 0 0 0 33333333
AF 1 1 2800000000
AF 2 0 3D09000000000
OR 2 0 1E00000000 1 100000000
OR 1 1 100000000 0 1900000000

10011
demo2.log

File diff suppressed because it is too large Load Diff

11
demo4.log~ Normal file
View File

@@ -0,0 +1,11 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 51EB851 28F5C28 33333333 19999999
SR 1 51EB851 28F5C28 33333333 19999999
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
OR 1 1 100000000 0 C35000000000

View File

@@ -1,11 +1,10 @@
AT Teppy AT Teppy ; addtrader Teppy
AT Luni AT Luni ; addtrader Luni
AT Hamza AT Hamza ; addtrader Hamza
AA USD AA USD ; addasset USD
AA BTC AA BTC ; addasset BTC
SR 0 51EB851 28F5C28 33333333 19999999 SR 0 51EB851 28F5C28 7AE147A 28F5C28 ; setroyalty USD 0.02 0.01 0.03 0.01
SR 1 51EB851 28F5C28 33333333 19999999 SR 1 51EB851 28F5C28 7AE147A 28F5C28 ; setroyalty BTC 0.02 0.01 0.03 0.01
AF 1 1 500000000 AF 1 1 500000000 ; addfunds Teppy 5 BTC
AF 2 0 3D09000000000 AF 2 0 186A000000000 ; addfunds Luni 100000 USD
AF 3 0 3D09000000000 AF 3 0 186A000000000 ; addfunds Hamza 100000 USD
OR 1 1 100000000 0 C35000000000

13
demox.log~ Normal file
View File

@@ -0,0 +1,13 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 1 51EB851 28F5C28 33333333 28F5C28
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
SR 0 28F5C28 0 19999999 28F5C28
OR 1 1 100000000 0 C35000000000
OR 2 0 9C4000000000 1 100000000
OR 3 0 753000000000 1 80000000

11
demoy.log~ Normal file
View File

@@ -0,0 +1,11 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 51EB851 28F5C28 33333333 19999999
SR 1 51EB851 28F5C28 33333333 19999999
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000
OR 1 1 100000000 0 C35000000000

11
demoz.log~ Normal file
View File

@@ -0,0 +1,11 @@
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 51EB851 28F5C28 33333333 19999999
SR 1 51EB851 28F5C28 33333333 19999999
AF 1 1 500000000
AF 2 0 3D09000000000
AF 3 0 3D09000000000

491
flamegraph.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

18
logs/demo.log Normal file
View File

@@ -0,0 +1,18 @@
AT Teppy
AT Luni
AT Hamza
AT UncleSam
NOP Error: Could not find asset BTC
NOP Error: Could not find asset ETH
AA USD
AA BTC
AA ETH
AA SOL
AF 1 1 A00000000
AF 2 2 3200000000
AF 3 3 FA00000000
AF 4 0 F424000000000
OR 1 1 100000000 2 400000000
OR 2 2 100000000 3 400000000
OR 3 3 100000000 0 FA00000000
OR 1 1 100000000 3 1900000000

BIN
perf.data Normal file

Binary file not shown.

BIN
perf.data.old Normal file

Binary file not shown.

12
royalty0.log~ Normal file
View File

@@ -0,0 +1,12 @@
NOP Error: adduser
AT Teppy
AT Luni
AT Hamza
AA USD
AA BTC
SR 0 19999999 0 0 0
AF 2 1 300000000
AF 1 0 186A000000000
OR 2 1 100000000 0 C35000000000
OR 2 1 100000000 0 EA6000000000
OR 1 0 1117000000000 1 80000000

1598
src/#main.rs# Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -24,6 +24,9 @@ impl FiNum {
pub fn one() -> Self { pub fn one() -> Self {
FiNum(1u64<<32) FiNum(1u64<<32)
} }
pub fn infinity() -> Self {
FiNum(u64::MAX)
}
pub fn is_tiny(self) -> bool { pub fn is_tiny(self) -> bool {
self.0>0u64 && self.0<=1u64 self.0>0u64 && self.0<=1u64
} }

View File

@@ -36,6 +36,13 @@
// //
//
// Thoughts on cheapest-path algorithm:
// Create a square matrix of costs from each asset to each asset. Some of the entries will be infinity. The goal is to lower the entries.
// In each cell, store not just the cost, but the path and path capacity.
// Starting with the source asset, see if visiting each other asset lowers the cost to get there. If it does, replace that asset's cost with the new cost and path.
//
#![allow(unsafe_code)] #![allow(unsafe_code)]
#![allow(unused_variables)] #![allow(unused_variables)]
@@ -47,7 +54,9 @@ 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::collections::HashSet;
use std::cmp::Ordering; use std::cmp::Ordering;
use std::cmp::min;
use rand::prelude::*; use rand::prelude::*;
use rand::rngs::StdRng; use rand::rngs::StdRng;
use std::time::Instant; use std::time::Instant;
@@ -248,11 +257,16 @@ impl RoyaltyTree {
} }
} }
// We really need two methods: remove an order and redistribute, remove some and return captured amount // We really need two methods: remove an order and redistribute, remove some and return captured amount
fn remove_order_id(&mut self, id: usize) { // And zero out in the tree fn remove_order_id(&mut self, id: usize) -> FiNum { // And zero out in the tree
if let Some(pos)=self.order_finder.remove(&id) { if let Some(pos)=self.order_finder.remove(&id) {
self.capture0(pos);
let weight=self.weight_here(pos); let weight=self.weight_here(pos);
self.sub_weight(pos,weight); self.sub_weight(pos,weight);
let rval=self.tree[pos].acc;
self.tree[pos].acc=FiNum::zero();
rval
} }
else { FiNum::zero() }
} }
fn random_order_id(&self, rng: &mut rand::rngs::StdRng) -> Option<usize> { fn random_order_id(&self, rng: &mut rand::rngs::StdRng) -> Option<usize> {
if self.tree.len()==0 { return None } if self.tree.len()==0 { return None }
@@ -270,16 +284,25 @@ impl RoyaltyTree {
} }
None None
} }
fn capture_partial(&mut self, id: usize, weight: FiNum) -> FiNum { fn capture_by_order_id(&mut self, order_id: usize) -> FiNum {
FiNum::zero() if let Some(&index)=self.order_finder.get(&order_id) {
self.capture0(index);
let rval=self.tree[index].acc;
self.tree[index].acc=FiNum::zero();
rval
} else { FiNum::zero() }
} }
fn sub_weight(&mut self, index: usize, mut weight: FiNum) { fn sub_weight(&mut self, index: usize, mut weight: FiNum) {
self.get_royalty(index); self.get_royalty(index);
let delta_count; let delta_count;
let wh=self.weight_here(index); 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 } if weight>=wh {
else { delta_count=0; self.tree[index].acc*weight/wh }; delta_count=if wh>FiNum::zero() { 1 } else { 0 };
self.tree[index].acc-=redist; weight=wh;
}
else {
delta_count=0;
}
let mut index=index; let mut index=index;
let ff=self.forefather(); let ff=self.forefather();
loop { loop {
@@ -288,7 +311,6 @@ impl RoyaltyTree {
if index==ff { break; } if index==ff { break; }
index=wt_parent(index); index=wt_parent(index);
} }
self.add_royalty(redist);
} }
fn set_location(&mut self, id: usize, index: usize) { fn set_location(&mut self, id: usize, index: usize) {
self.tree[index].order_id=id; self.tree[index].order_id=id;
@@ -349,7 +371,7 @@ impl Dumpable for usize {
impl Dumpable for Order { impl Dumpable for Order {
fn dump(&self) { fn dump(&self) {
println!("Giving {}/{} to get {}",self.sell_remain,self.sell_qty,self.buy_qty); println!("Giving {}/{} ({} each) to get {}",self.sell_remain,self.sell_qty,self.buy_qty/self.sell_qty,self.buy_qty);
} }
} }
@@ -361,6 +383,7 @@ struct Market {
traders: Vec<Trader>, traders: Vec<Trader>,
trader_name2num: HashMap<String,usize>, trader_name2num: HashMap<String,usize>,
orders: HashMap<(usize,usize),OrderQueue>, orders: HashMap<(usize,usize),OrderQueue>,
shadows: HashSet<(usize,usize)>,
royalties: HashMap<usize,RoyaltyTree>, // Active orders that are accepting asset X. They receive royalties when someone makes an order to sell X royalties: HashMap<usize,RoyaltyTree>, // Active orders that are accepting asset X. They receive royalties when someone makes an order to sell X
royalty_rate: HashMap<usize,FiNum>, royalty_rate: HashMap<usize,FiNum>,
order_finder: HashMap<usize,(usize,usize)>, // Maps Order ID to an asset pair (in other systems, a "market.") From there you can look in self.orders.get((usize,usize)) which is an OrderQueue, and OrderQueues have a mapping from ID to position in the OrderQueue order_finder: HashMap<usize,(usize,usize)>, // Maps Order ID to an asset pair (in other systems, a "market.") From there you can look in self.orders.get((usize,usize)) which is an OrderQueue, and OrderQueues have a mapping from ID to position in the OrderQueue
@@ -378,6 +401,7 @@ impl Market {
traders: Vec::new(), traders: Vec::new(),
trader_name2num: HashMap::new(), trader_name2num: HashMap::new(),
orders: HashMap::new(), orders: HashMap::new(),
shadows: HashSet::new(),
royalties: HashMap::new(), royalties: HashMap::new(),
royalty_rate: HashMap::new(), royalty_rate: HashMap::new(),
order_finder: HashMap::new(), order_finder: HashMap::new(),
@@ -552,6 +576,8 @@ impl Market {
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,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap(); // There's a workaround for this where you remove and reinsert the keys. let [bids0,bids1]=self.orders.get_many_mut([&ap0, &ap1]).unwrap(); // There's a workaround for this where you remove and reinsert the keys.
let bids0p=bids0.peek();
let bids1p=bids1.peek();
while !bids0.empty() && !bids1.empty() while !bids0.empty() && !bids1.empty()
&& bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1 && bids0.peek().sell_qty/bids0.peek().buy_qty>=strike0/strike1
&& bids1.peek().sell_qty/bids1.peek().buy_qty>=strike1/strike0 { && bids1.peek().sell_qty/bids1.peek().buy_qty>=strike1/strike0 {
@@ -574,6 +600,7 @@ impl Market {
fn retract_order(&mut self, order_id:usize) -> Result { // Still need to credit back funds! fn retract_order(&mut self, order_id:usize) -> Result { // Still need to credit back funds!
let pair=self.order_finder.get(&order_id).unwrap(); let pair=self.order_finder.get(&order_id).unwrap();
let sell_type=pair.0; let sell_type=pair.0;
let buy_type=pair.1;
let queue=self.orders.get_mut(pair).unwrap(); let queue=self.orders.get_mut(pair).unwrap();
let queue_index=*queue.order_finder.get(&order_id).unwrap(); let queue_index=*queue.order_finder.get(&order_id).unwrap();
let order=&queue.v[queue_index]; let order=&queue.v[queue_index];
@@ -582,7 +609,8 @@ impl Market {
println!("Order owner is {}",order.owner); println!("Order owner is {}",order.owner);
// Remove from royalties // Remove from royalties
let rt=self.royalties.get_mut(&pair.0).unwrap(); let rt=self.royalties.get_mut(&pair.0).unwrap();
rt.remove_order_id(order_id); let dist=rt.remove_order_id(order_id);
self.traders[order.owner].add_balance(buy_type,dist);
// Remove from order_finder // Remove from order_finder
self.order_finder.remove(&order_id); self.order_finder.remove(&order_id);
// Remove from orders // Remove from orders
@@ -621,10 +649,21 @@ impl Market {
let cq0=commission0_qty*pay_qty/sell_qty_initial; let cq0=commission0_qty*pay_qty/sell_qty_initial;
let rq1=royalty1_qty *pay_qty/sell_qty_initial; let rq1=royalty1_qty *pay_qty/sell_qty_initial;
let cq1=commission1_qty*pay_qty/sell_qty_initial; let cq1=commission1_qty*pay_qty/sell_qty_initial;
//println!("Transact at ask rate. Qty={} elt.sell_remain={} elt.royalty_remain={} elt.commission_remain={}",qty,elt.sell_remain,elt.royalty_remain,elt.commission_remain);
let rq2=if !elt.sell_remain.is_zero() { elt.royalty_remain *qty/elt.sell_remain } else { FiNum::zero() }; let rq2=if !elt.sell_remain.is_zero() { elt.royalty_remain *qty/elt.sell_remain } else { FiNum::zero() };
let cq2=if !elt.sell_remain.is_zero() { elt.commission_remain*qty/elt.sell_remain } else { FiNum::zero() }; let cq2=if !elt.sell_remain.is_zero() { elt.commission_remain*qty/elt.sell_remain } else { FiNum::zero() };
//elt.sell_remain-=qty; self.royalties.entry(sell_type).or_insert(RoyaltyTree::new());
self.royalties.entry(buy_type) .or_insert(RoyaltyTree::new());
let rtb=self.royalties.entry(buy_type) .or_insert(RoyaltyTree::new());
let rts=self.royalties.entry(sell_type).or_insert(RoyaltyTree::new());
if let Some(&cap_index)=rts.order_finder.get(&elt.order_id) {
let wh0=rts.weight_here(cap_index);
let acc0=rts.tree[cap_index].acc;
let cap=rts.capture_by_order_id(elt.owner);
rts.sub_weight(cap_index,pay_qty);
let wh1=rts.weight_here(cap_index);
let acc1=rts.tree[cap_index].acc;
self.traders[elt.owner].add_balance(sell_type,cap);
}
royalty_acc+=rq0+rq1; royalty_acc+=rq0+rq1;
commission_acc+=cq0+cq1; commission_acc+=cq0+cq1;
royalty0_qty-=rq0; royalty0_qty-=rq0;
@@ -634,17 +673,15 @@ impl Market {
self.royalties.entry(sell_type).or_insert(RoyaltyTree::new()).add_royalty(rq0+rq1); self.royalties.entry(sell_type).or_insert(RoyaltyTree::new()).add_royalty(rq0+rq1);
self.royalties.entry(buy_type) .or_insert(RoyaltyTree::new()).add_royalty(rq2); self.royalties.entry(buy_type) .or_insert(RoyaltyTree::new()).add_royalty(rq2);
let top_order=self.orders.get_mut(&ap).unwrap().peek(); let top_order=self.orders.get_mut(&ap).unwrap().peek();
//println!("top_order.commission_remain={} cq2={} elt.commission_remain={} qty={} elt.sell_remain={}",top_order.commission_remain,cq2,elt.commission_remain,qty,elt.sell_remain);
top_order.royalty_remain-=rq2; top_order.royalty_remain-=rq2;
top_order.commission_remain-=cq2; top_order.commission_remain-=cq2;
//println!("Crediting {} commissions to house {}+{}+{}",sell_type,cq0,cq1,cq2);
self.traders[0].add_balance(sell_type,cq0+cq1); self.traders[0].add_balance(sell_type,cq0+cq1);
self.traders[0].add_balance(buy_type,cq2); self.traders[0].add_balance(buy_type,cq2);
if elt.sell_remain==qty { // deal with pennies stored in royalty_remain and commission_remain if elt.sell_remain==qty { // deal with pennies stored in royalty_remain and commission_remain
//if !top_order.commission_remain.is_zero() { println!("Little commission? {} ",top_order.commission_remain); }
let rq3=top_order.royalty_remain; let rq3=top_order.royalty_remain;
let cq3=top_order.commission_remain; let cq3=top_order.commission_remain;
self.royalties.get_mut(&buy_type).unwrap().remove_order_id(top_order.order_id); let dist=self.royalties.get_mut(&buy_type).unwrap().remove_order_id(top_order.order_id);
self.traders[elt.owner].add_balance(sell_type,dist);
self.order_finder.remove(&top_order.order_id); self.order_finder.remove(&top_order.order_id);
self.traders[top_order.owner].order_finder.remove(&top_order.order_id); self.traders[top_order.owner].order_finder.remove(&top_order.order_id);
self.orders.get_mut(&ap).unwrap().pop(); // This removes id (which is stored as part of the Order) from self.order's finder self.orders.get_mut(&ap).unwrap().pop(); // This removes id (which is stored as part of the Order) from self.order's finder
@@ -697,7 +734,68 @@ impl Market {
commission_acc,self.number_to_name(sell_type),self.traders[owner].name)); commission_acc,self.number_to_name(sell_type),self.traders[owner].name));
Result::PlacedOrder(id,log) Result::PlacedOrder(id,log)
} }
fn path_cost(&self, src: usize, dest: usize, depth_left: usize) -> TradePath {
let mut cheapest=vec![TradePath::new();self.assets.len()];
cheapest[src].cost=FiNum::new_i32(1);
cheapest[src].path[0]=src;
cheapest[src].len=1;
for i in 0..6 {
let mut progress=false;
for ass0 in 0..self.assets.len() {
for ass1 in 0..self.assets.len() {
if true || ass0!=ass1 {
if let Some(topq)=self.orders.get(&(ass1,ass0)) {
let top=topq.peek_nomut(); if true {
println!("There is a direct path from {} to {} with a cost of {} {}",
self.number_to_name(ass0),self.number_to_name(ass1),top.buy_qty/top.sell_qty,self.number_to_name(ass1));
let candidate=cheapest[ass0].cost*top.buy_qty/top.sell_qty;
if candidate<cheapest[ass1].cost {
// Extend cheapest[ass1]
println!("Extending Length {} {} because {} < {}",cheapest[ass0].len,self.number_to_name(ass1),candidate,cheapest[ass1].cost);
cheapest[ass1]=cheapest[ass0];
let ext=&mut cheapest[ass1];
let arbitrage=ext.path.contains(&ass1);
ext.path[ext.len]=ass1;
ext.len+=1;
ext.cost=candidate;
ext.cap=min(ext.cap,ext.cost*top.sell_remain);
progress=true;
if arbitrage {
ext.arbitrage=true;
return ext.clone();
}
}
}
}
}
}
}
if !progress { println!("Definitely found the cheapest path."); break; }
}
for ass in 0..self.assets.len() { println!("Cheapest path from {} to {} is {}",self.number_to_name(src),self.number_to_name(ass),cheapest[ass].cost); }
cheapest[dest].clone()
} }
}
#[derive(Copy,Clone)]
struct TradePath {
cost: FiNum,
path: [ usize; 600],
len: usize,
cap: FiNum,
arbitrage: bool,
}
impl TradePath {
fn new() -> Self { TradePath {
cost: FiNum::infinity(),
path: [0; 600],
len: 0,
cap: FiNum::infinity(),
arbitrage: false,
} }
}
impl PartialOrd for Order { impl PartialOrd for Order {
fn partial_cmp(&self, other:&Self) -> Option<Ordering> { fn partial_cmp(&self, other:&Self) -> Option<Ordering> {
@@ -717,25 +815,88 @@ impl PartialEq for Order {
} }
} }
//
// If Some(shadow) then peek should return a reference to shadow, and pop should replace shadow with v[next[0]]
//
struct OrderQueue { struct OrderQueue {
v: Vec<Order>, v: Vec<Order>,
shadowing: bool,
shadow: Option<Order>,
next: Vec<usize>, // A priority queue
order_finder: HashMap<usize,usize>, // Maps OrderIDs to locations in v order_finder: HashMap<usize,usize>, // Maps OrderIDs to locations in v
} }
impl OrderQueue { impl OrderQueue {
fn new()->Self { fn new()->Self {
OrderQueue { OrderQueue {
v: Vec::new(), v: Vec::new(),
shadowing: false,
shadow: None,
next: Vec::new(),
order_finder:HashMap::new(), order_finder:HashMap::new(),
} }
} }
fn assure_shadowing(&mut self) {
if !self.shadowing {
assert!(self.next.len()==0);
self.shadowing=true;
if self.v.len()>0 { self.shadow=Some(self.v[0].clone()); }
else { self.shadow=None; }
self.queue_shadow(0);
}
}
fn stop_shadowing(&mut self) {
if self.shadowing {
self.next.clear();
self.shadowing=false;
self.shadow=None;
self.next=Vec::new();
}
}
fn queue_shadow(&mut self, parent: usize) {
if parent*2+1<self.v.len() { self.next.push(parent*2+1); self.bubble_up_next(self.next.len()-1); }
if parent*2+2<self.v.len() { self.next.push(parent*2+2); self.bubble_up_next(self.next.len()-1); }
}
fn peek(&mut self) -> &mut Order { fn peek(&mut self) -> &mut Order {
self.v.first_mut().unwrap() if !self.shadowing { self.v.first_mut().unwrap() }
else { self.shadow.as_mut().expect("Shadowing mismatch") }
}
fn peek_nomut(&self) -> &Order {
if !self.shadowing { self.v.first().unwrap() }
else { self.shadow.as_ref().expect("Shadowing mismatch") }
}
fn peekn(&self) -> Option<&Order> {
match &self.shadow {
Some(order) => Some(order),
None => { self.v.first() }
}
} }
fn empty(&self) -> bool { fn empty(&self) -> bool {
self.v.len()==0 self.v.len()==0
} }
fn pop(&mut self) -> Option<Order> {
if !self.shadowing { return self.remove(0); }
let rval=self.shadow.clone();
if self.next.len()==0 { self.shadow=None; }
else {
self.shadow=Some(self.v[self.next[0]].clone());
self.queue_shadow(self.next[0]);
if self.next.len()>1 { self.next[0]=self.next.pop().unwrap(); }
else { self.next.pop(); }
self.trickle_down_next(0);
}
rval
}
fn bubble_up_next(&mut self, pos: usize) {
if pos>0 {
let parent=(pos-1)/2;
if self.v[self.next[parent]]<self.v[self.next[pos]] {
self.next.swap(parent,pos);
self.bubble_up_next(parent);
}
}
}
fn bubble_up(&mut self, pos: usize) { fn bubble_up(&mut self, pos: usize) {
if pos>0 { if pos>0 {
let parent=(pos-1)/2; let parent=(pos-1)/2;
@@ -765,16 +926,30 @@ impl OrderQueue {
} }
} }
} }
fn trickle_down_next(&mut self, pos: usize) {
let mut pivot=pos;
let child0=pos*2+1;
let child1=pos*2+2;
if child0<self.next.len() {
if self.v[self.next[pos]]<self.v[self.next[child0]] { pivot=child0; }
if child1<self.next.len() {
if self.v[self.next[pivot]]<self.v[self.next[child1]] { pivot=child1; }
}
if pivot!=pos {
self.next.swap(pivot,pos);
self.trickle_down_next(pivot);
}
}
}
fn insert(&mut self, item: Order) { fn insert(&mut self, item: Order) {
assert!(!self.shadowing);
let id=item.order_id; let id=item.order_id;
self.v.push(item); self.v.push(item);
self.order_finder.insert(id,self.v.len()-1); self.order_finder.insert(id,self.v.len()-1);
self.bubble_up(self.v.len()-1); self.bubble_up(self.v.len()-1);
} }
fn pop(&mut self) -> Option<Order> {
self.remove(0)
}
fn remove(&mut self, pos: usize) -> Option<Order> { fn remove(&mut self, pos: usize) -> Option<Order> {
assert!(!self.shadowing);
if self.v.len()<=pos { None } if self.v.len()<=pos { None }
else { else {
let end=self.v.len()-1; let end=self.v.len()-1;
@@ -789,6 +964,7 @@ impl OrderQueue {
for index in 0..self.v.len() { for index in 0..self.v.len() {
self.v[index].dump(); self.v[index].dump();
} }
if self.shadowing { for index in 0..self.next.len() { println!(" Shadow {}",self.next[index]); } }
} }
} }
@@ -920,7 +1096,7 @@ fn royalty_stuff() {
let node=rng.gen_range(0..10); let node=rng.gen_range(0..10);
match rng.gen_range(0..10) { match rng.gen_range(0..10) {
0 => rt.add_weight(node,FiNum::new_i32(rng.gen_range(0..101))), 0 => rt.add_weight(node,FiNum::new_i32(rng.gen_range(0..101))),
1 => rt.sub_weight(node,FiNum::new_i32(rng.gen_range(0..101))), 1 => { rt.sub_weight(node,FiNum::new_i32(rng.gen_range(0..101))); },
2 => rt.add_royalty(FiNum::new_i32(rng.gen_range(0..10))), 2 => rt.add_royalty(FiNum::new_i32(rng.gen_range(0..10))),
// 3 => println!("Random Order ID: {:?}",rt.random_order_id(&mut rng)), // 3 => println!("Random Order ID: {:?}",rt.random_order_id(&mut rng)),
_ => (), _ => (),
@@ -948,6 +1124,7 @@ enum Command {
AddFunds { user_id: usize, asset_id: usize, amt: FiNum }, AddFunds { user_id: usize, asset_id: usize, amt: FiNum },
SubFunds { user_id: usize, asset_id: usize, amt: FiNum }, SubFunds { user_id: usize, asset_id: usize, amt: FiNum },
Order { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum }, Order { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum },
SmartOrder { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum, max0: FiNum, max1: FiNum },
OrderBatch { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum }, OrderBatch { user_id: usize, sell_type: usize, sell_qty: FiNum, buy_type: usize, buy_qty: FiNum },
ExecuteBatch { asset_type0: usize, strike0: FiNum, asset_type1: usize, strike1: FiNum }, ExecuteBatch { asset_type0: usize, strike0: FiNum, asset_type1: usize, strike1: FiNum },
RetractOrder { order_id: usize }, RetractOrder { order_id: usize },
@@ -1089,6 +1266,9 @@ impl Market {
Command::Order { user_id, sell_type, sell_qty, buy_type, buy_qty } => { Command::Order { user_id, sell_type, sell_qty, buy_type, buy_qty } => {
self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,true) self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,true)
} }
Command::SmartOrder { user_id, sell_type, sell_qty, buy_type, buy_qty, max0, max1 } => {
self.make_smart_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,*max0,*max1,true)
}
Command::OrderBatch { user_id, sell_type, sell_qty, buy_type, buy_qty } => { Command::OrderBatch { user_id, sell_type, sell_qty, buy_type, buy_qty } => {
self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,false) self.make_order(*user_id,*sell_type,*buy_type,*sell_qty,*buy_qty,false)
} }
@@ -1182,6 +1362,22 @@ fn tokens_to_command(m: &Market, logged_in: usize, tokens: Vec<&str>,line: &str)
else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) } else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) }
else { Command::Order { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1 } } else { Command::Order { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1 } }
} }
// Sell up to qty0 cur0 to buy up to qty1 cur1 where no suborder exceeds maxsub (expressed as a fraction)
["smart", qty0, cur0, qty1, cur1, max0, "/", max1 ] => {
let qty0=FiNum::new_str(qty0);
let cur0=m.name_to_number(cur0);
let qty1=FiNum::new_str(qty1);
let cur1=m.name_to_number(cur1);
let max0=FiNum::new_str(max0);
let max1=FiNum::new_str(max1);
if !cur0.is_some() { Command::Error("Count not find currency".to_string()) }
else if !cur1.is_some() { Command::Error("Count not find currency".to_string()) }
else if qty0.is_zero() { Command::Error("Qty0 is must be > 0".to_string()) }
else if qty1.is_zero() { Command::Error("Qty1 is must be > 0".to_string()) }
else if max0.is_zero() { Command::Error("Max0 is must be > 0".to_string()) }
else if max1.is_zero() { Command::Error("Max1 is must be > 0".to_string()) }
else { Command::SmartOrder { user_id: logged_in, sell_type: *cur0.unwrap(), sell_qty: qty0, buy_type: *cur1.unwrap(), buy_qty: qty1, max0: max0, max1: max1 } }
}
["orderbatch", qty0, cur0, qty1, cur1 ] => { ["orderbatch", qty0, cur0, qty1, cur1 ] => {
let qty0=FiNum::new_str(qty0); let qty0=FiNum::new_str(qty0);
let cur0=m.name_to_number(cur0); let cur0=m.name_to_number(cur0);
@@ -1221,6 +1417,16 @@ fn interactive(m: &mut Market, mut out: Option<File>) {
let cmd:Command=match tokens.as_slice() { let cmd:Command=match tokens.as_slice() {
["dump"] => { m.dump(); Command::None }, ["dump"] => { m.dump(); Command::None },
["sanity"] => { m.sanity_check(); Command::None }, ["sanity"] => { m.sanity_check(); Command::None },
["path",src,dest] => {
let cur0=*m.name_to_number(src).unwrap();
let cur1=*m.name_to_number(dest).unwrap();
let path=m.path_cost(cur0,cur1,6);
let mut str=format!("Cost: {} Cap: {}",path.cost,path.cap);
if path.len>0 { str=format!("{} {}",str,m.number_to_name(path.path[0])) }
for i in 1..path.len { str=format!("{}->{}",str,m.number_to_name(path.path[i])) }
println!("{}",str);
Command::None
},
["randomorder"] => { println!("Random OrderID: {:?}",m.random_order_id()); Command::None } ["randomorder"] => { println!("Random OrderID: {:?}",m.random_order_id()); Command::None }
["login", username] => { ["login", username] => {
if let Some(t)=m.trader_name2num.get_mut(*username) { trader=*t; println!("Logged in as {}",m.traders[trader].name) } else { println!("Trader {} not found.",username) } if let Some(t)=m.trader_name2num.get_mut(*username) { trader=*t; println!("Logged in as {}",m.traders[trader].name) } else { println!("Trader {} not found.",username) }
@@ -1249,13 +1455,31 @@ fn interactive(m: &mut Market, mut out: Option<File>) {
} else { println!("Could not find trader {}",username); } } else { println!("Could not find trader {}",username); }
Command::None Command::None
}, },
["seedrandom", seed] => { ["seedrandom"|"sr", seed] => {
let seed=seed.parse().unwrap(); let seed=seed.parse().unwrap();
m.seed_random(seed); m.seed_random(seed);
println!("Seeded RNG with {}",seed); println!("Seeded RNG with {}",seed);
Command::None Command::None
} }
["randomcommands", qty] => { ["testshadow",src,dst] => {
if let Some(cur0)=m.name_to_number(src) {
if let Some(cur1)=m.name_to_number(dst) {
println!("Currencies are {} and {}",cur0,cur1);
if let Some(q)=m.orders.get_mut(&(*cur0,*cur1)) {
println!("Dumping queue");
q.dump();
println!("Dumping shadow");
q.assure_shadowing();
while let Some(ord)=q.pop() {
ord.dump();
}
q.stop_shadowing();
}
}
}
Command::None
}
["randomcommands"|"rc", qty] => {
let qty:u32=qty.parse().unwrap(); let qty:u32=qty.parse().unwrap();
let start = Instant::now(); let start = Instant::now();
for i in 0..qty { for i in 0..qty {

1
target/.rustc_info.json Normal file
View File

@@ -0,0 +1 @@
{"rustc_fingerprint":4343802041220384422,"outputs":{"4614504638168534921":{"success":true,"status":"","code":0,"stdout":"rustc 1.78.0 (9b00956e5 2024-04-29)\nbinary: rustc\ncommit-hash: 9b00956e56009bab2aa15d7bff10916599e3d6d6\ncommit-date: 2024-04-29\nhost: x86_64-unknown-linux-gnu\nrelease: 1.78.0\nLLVM version: 18.1.2\n","stderr":""},"15729799797837862367":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/teppy/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}

3
target/CACHEDIR.TAG Normal file
View File

@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/

0
target/debug/.cargo-lock Normal file
View File

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
4230498a9c42e042

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"atomic-polyfill\", \"compile-time-rng\", \"const-random\", \"default\", \"getrandom\", \"nightly-arm-aes\", \"no-rng\", \"runtime-rng\", \"serde\", \"std\"]","target":15946166061513530080,"profile":12206360443249279867,"path":12392441229074647953,"deps":[[2452538001284770427,"cfg_if",false,15490626430350646643],[2751633865096478575,"once_cell",false,16713956236338845288],[8776983334904785487,"zerocopy",false,16227130453912014384],[15443876827423482409,"build_script_build",false,14344379806883822968]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ahash-504617b552ae60e6/dep-lib-ahash","checksum":false}}],"rustflags":[],"metadata":6548036084630991988,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
78bd98406f7911c7

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[15443876827423482409,"build_script_build",false,5847417838522015174]],"local":[{"RerunIfChanged":{"output":"debug/build/ahash-5e0db2a2193f2a50/output","paths":["build.rs"]}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View File

@@ -0,0 +1 @@
c61d630e8b332651

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"atomic-polyfill\", \"compile-time-rng\", \"const-random\", \"default\", \"getrandom\", \"nightly-arm-aes\", \"no-rng\", \"runtime-rng\", \"serde\", \"std\"]","target":13708040221295731214,"profile":13232757476167777671,"path":1911677316096773071,"deps":[[4366825111050392739,"version_check",false,9750224066250550833]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ahash-f26514e0e1cc5812/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"metadata":6548036084630991988,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
36bf9e34dcec3fc1

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[\"alloc\"]","declared_features":"[\"alloc\", \"default\", \"fresh-rust\", \"nightly\", \"serde\", \"std\"]","target":2974225908581929585,"profile":7377589772334827443,"path":9747662362732745721,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/allocator-api2-88d7b7890afadc02/dep-lib-allocator_api2","checksum":false}}],"rustflags":[],"metadata":363439559241483613,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
07ffa39b65b47849

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"[]","declared_features":"","target":18335588937564793828,"profile":12206360443249279867,"path":18212526820589864309,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-2664cbc6c1fc8866/dep-lib-byteorder"}}],"rustflags":[],"metadata":5398730104718078656,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
08979f0142fe4bc3

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"default\", \"i128\", \"std\"]","target":16903832911151110546,"profile":12206360443249279867,"path":12518329022543172825,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-d36d73da0d12e75b/dep-lib-byteorder","checksum":false}}],"rustflags":[],"metadata":5398730104718078656,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
73dd5361aac2f9d6

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"compiler_builtins\", \"core\", \"rustc-dep-of-std\"]","target":11601024444410784892,"profile":12206360443249279867,"path":14057495008324417411,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-8217498f8667ada9/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"metadata":8462187951337715540,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
aa227124af55cbea

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"[]","declared_features":"","target":10623512480563079566,"profile":12206360443249279867,"path":16466490194263946508,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-cc9cb5b64779c561/dep-lib-cfg-if"}}],"rustflags":[],"metadata":8462187951337715540,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
248a326b01c758d8

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"[\"std\"]","declared_features":"","target":16789414514566550411,"profile":12206360443249279867,"path":14784813645262806707,"deps":[[2452538001284770427,"cfg_if",false,16918710635866432170],[7780729136333935213,"libc",false,6691589959117722990]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-0ec5f3132051ed62/dep-lib-getrandom"}}],"rustflags":[],"metadata":12606519392706294666,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
7470adbd5fe41576

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[\"std\"]","declared_features":"[\"compiler_builtins\", \"core\", \"custom\", \"js\", \"js-sys\", \"linux_disable_fallback\", \"rdrand\", \"rustc-dep-of-std\", \"std\", \"test-in-browser\", \"wasm-bindgen\"]","target":11884987481660704207,"profile":12206360443249279867,"path":15288689928076690446,"deps":[[2452538001284770427,"cfg_if",false,15490626430350646643],[7780729136333935213,"libc",false,12428729079082602323]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-3eaa2c90033669a2/dep-lib-getrandom","checksum":false}}],"rustflags":[],"metadata":12606519392706294666,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
7cd7fce5ffdaa84f

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[\"ahash\", \"allocator-api2\", \"default\", \"inline-more\"]","declared_features":"[\"ahash\", \"alloc\", \"allocator-api2\", \"compiler_builtins\", \"core\", \"default\", \"equivalent\", \"inline-more\", \"nightly\", \"raw\", \"rayon\", \"rkyv\", \"rustc-dep-of-std\", \"rustc-internal-api\", \"serde\"]","target":8830771204028428646,"profile":12206360443249279867,"path":3366490264348346016,"deps":[[2289252893304123003,"allocator_api2",false,13925109003372642102],[15443876827423482409,"ahash",false,4818924841388814402]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/hashbrown-cfbf150afb2f415b/dep-lib-hashbrown","checksum":false}}],"rustflags":[],"metadata":6228333144549390726,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
2f48406071e7bfcf

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":9652763411108993936,"profile":13232757476167777671,"path":33283817025902004,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-0bf4ed26e03f527c/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
534f49483fb77bac

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":10680253861624505453,"profile":12206360443249279867,"path":18370078949461830637,"deps":[[7780729136333935213,"build_script_build",false,11321662282393169494]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-22a89fb39553949d/dep-lib-libc","checksum":false}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
56aefb70dc9f1e9d

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[7780729136333935213,"build_script_build",false,14969938160534964271]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-2fba499436484a1c/output","paths":["build.rs"]}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_FREEBSD_VERSION","val":null}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
6e55c83f9d4ddd5c

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"[]","declared_features":"","target":2703894136786000,"profile":12206360443249279867,"path":5458437750425973037,"deps":[[7780729136333935213,"build_script_build",false,5581047334126213733]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-682eaa70fa6ca44e/dep-lib-libc"}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
65da3b11fbdc734d

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[7780729136333935213,"build_script_build",false,18015918853468524591]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-b102164365839731/output","paths":["build.rs"]}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_FREEBSD_VERSION","val":null}}],"rustflags":[],"metadata":0,"config":0,"compile_kind":0}

View File

@@ -0,0 +1 @@
2f1041abbe6605fa

View File

@@ -0,0 +1 @@
{"rustc":1059629350237521597,"features":"[]","declared_features":"","target":427768481117760528,"profile":13232757476167777671,"path":8823324033568247709,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-f7cc13a5deb09582/dep-build-script-build-script-build"}}],"rustflags":[],"metadata":14998826085014762512,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[]","target":17286931796177957147,"profile":11597332650809196192,"path":10602529704205407992,"deps":[[5910892534286594076,"rand",false,7402337238667449966]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/lzf1-43121faddb8b3a38/dep-bin-lzf1","checksum":false}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
3a7ed6a2ad8a568f

View File

@@ -0,0 +1 @@
{"rustc":11594289678289209806,"features":"[]","declared_features":"[]","target":17286931796177957147,"profile":11597332650809196192,"path":10602529704205407992,"deps":[[5910892534286594076,"rand",false,2053896911618300010],[8480487335294508957,"hashbrown",false,5740078517693765500]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/lzf1-632ea32a70f0e245/dep-bin-lzf1","checksum":false}}],"rustflags":[],"metadata":7797948686568424061,"config":2202906307356721367,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

Some files were not shown because too many files have changed in this diff Show More