Skip to content

Commit

Permalink
exp/orderbook: Improve path finding algorithm (#4096)
Browse files Browse the repository at this point in the history
Improve path finding algorithm
  • Loading branch information
tamirms authored Nov 24, 2021
1 parent 17a2e98 commit 8791961
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 151 deletions.
10 changes: 2 additions & 8 deletions exp/orderbook/graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,13 +317,10 @@ func (graph *OrderBookGraph) FindPaths(
includePools: includePools,
}
graph.lock.RLock()
err := dfs(
err := search(
ctx,
searchState,
maxPathLength,
[]xdr.Asset{},
[]string{},
len(sourceAssets),
destinationAssetString,
destinationAsset,
destinationAmount,
Expand Down Expand Up @@ -374,13 +371,10 @@ func (graph *OrderBookGraph) FindFixedPaths(
includePools: includePools,
}
graph.lock.RLock()
err := dfs(
err := search(
ctx,
searchState,
maxPathLength,
[]xdr.Asset{},
[]string{},
len(destinationAssets),
sourceAsset.String(),
sourceAsset,
amountToSpend,
Expand Down
90 changes: 46 additions & 44 deletions exp/orderbook/graph_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,24 +210,24 @@ func assertPathEquals(t *testing.T, a, b []Path) {

for i := 0; i < len(a); i++ {
assert.Equalf(t, a[i].SourceAmount, b[i].SourceAmount,
"expected src amounts to be same got %v %v", a, b)
"expected src amounts to be same got %v %v", a[i], b[i])

assert.Equalf(t, a[i].DestinationAmount, b[i].DestinationAmount,
"expected dest amounts to be same got %v %v", a, b)
"expected dest amounts to be same got %v %v", a[i], b[i])

assert.Truef(t, a[i].DestinationAsset.Equals(b[i].DestinationAsset),
"expected dest assets to be same got %v %v", a, b)
"expected dest assets to be same got %v %v", a[i], b[i])

assert.Truef(t, a[i].SourceAsset.Equals(b[i].SourceAsset),
"expected source assets to be same got %v %v", a, b)
"expected source assets to be same got %v %v", a[i], b[i])

assert.Equalf(t, len(a[i].InteriorNodes), len(b[i].InteriorNodes),
"expected interior nodes have same length got %v %v", a, b)
"expected interior nodes have same length got %v %v", a[i], b[i])

for j := 0; j > len(a[i].InteriorNodes); j++ {
assert.Truef(t,
a[i].InteriorNodes[j].Equals(b[i].InteriorNodes[j]),
"expected interior nodes to be same got %v %v", a, b)
"expected interior nodes to be same got %v %v", a[i], b[i])
}
}
}
Expand Down Expand Up @@ -1404,21 +1404,23 @@ func TestFindPaths(t *testing.T) {

expectedPaths := []Path{
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 7,
// arbitrage usd then trade to xlm
SourceAmount: 2,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{
eurAsset,
usdAsset,
},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 5,
SourceAsset: yenAsset,
Expand Down Expand Up @@ -1478,21 +1480,23 @@ func TestFindPaths(t *testing.T) {

expectedPaths = []Path{
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 7,
// arbitrage usd then trade to xlm
SourceAmount: 2,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{
eurAsset,
usdAsset,
},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 2,
SourceAsset: yenAsset,
Expand Down Expand Up @@ -1541,21 +1545,23 @@ func TestFindPaths(t *testing.T) {

expectedPaths = []Path{
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 7,
// arbitrage usd then trade to xlm
SourceAmount: 2,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{
eurAsset,
usdAsset,
},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
SourceAmount: 2,
SourceAsset: yenAsset,
Expand Down Expand Up @@ -1678,20 +1684,22 @@ func TestFindPathsStartingAt(t *testing.T) {

expectedPaths := []Path{
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
{
// arbitrage usd then trade to xlm
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{
eurAsset,
usdAsset,
},
DestinationAsset: nativeAsset,
DestinationAmount: 15,
DestinationAmount: 60,
},
{
SourceAmount: 5,
SourceAsset: usdAsset,
InteriorNodes: []xdr.Asset{},
DestinationAsset: nativeAsset,
DestinationAmount: 20,
},
}

Expand Down Expand Up @@ -2108,12 +2116,6 @@ func TestInterleavedFixedPaths(t *testing.T) {
DestinationAsset: chfAsset,
DestinationAmount: 13,
InteriorNodes: []xdr.Asset{usdAsset},
}, {
SourceAsset: nativeAsset,
SourceAmount: 1234,
DestinationAsset: chfAsset,
DestinationAmount: 5,
InteriorNodes: []xdr.Asset{eurAsset, usdAsset},
},
}

Expand Down
Loading

0 comments on commit 8791961

Please sign in to comment.