forked from mirror/go-ethereum
parent
c47866d251
commit
fabaf4f1f0
@ -0,0 +1,80 @@ |
||||
package math |
||||
|
||||
import ( |
||||
"math/big" |
||||
"sort" |
||||
|
||||
"github.com/ethereum/go-ethereum/ethutil" |
||||
) |
||||
|
||||
type Summer interface { |
||||
Sum(i int) *big.Int |
||||
Len() int |
||||
} |
||||
|
||||
func Sum(slice Summer) (sum *big.Int) { |
||||
sum = new(big.Int) |
||||
|
||||
for i := 0; i < slice.Len(); i++ { |
||||
sum.Add(sum, slice.Sum(i)) |
||||
} |
||||
return |
||||
} |
||||
|
||||
type Vector struct { |
||||
Gas, Price *big.Int |
||||
} |
||||
|
||||
type VectorsBy func(v1, v2 Vector) bool |
||||
|
||||
func (self VectorsBy) Sort(vectors []Vector) { |
||||
bs := vectorSorter{ |
||||
vectors: vectors, |
||||
by: self, |
||||
} |
||||
sort.Sort(bs) |
||||
} |
||||
|
||||
type vectorSorter struct { |
||||
vectors []Vector |
||||
by func(v1, v2 Vector) bool |
||||
} |
||||
|
||||
func (v vectorSorter) Len() int { return len(v.vectors) } |
||||
func (v vectorSorter) Less(i, j int) bool { return v.by(v.vectors[i], v.vectors[j]) } |
||||
func (v vectorSorter) Swap(i, j int) { v.vectors[i], v.vectors[j] = v.vectors[j], v.vectors[i] } |
||||
|
||||
func PriceSort(v1, v2 Vector) bool { return v1.Price.Cmp(v2.Price) < 0 } |
||||
func GasSort(v1, v2 Vector) bool { return v1.Gas.Cmp(v2.Gas) < 0 } |
||||
|
||||
type vectorSummer struct { |
||||
vectors []Vector |
||||
by func(v Vector) *big.Int |
||||
} |
||||
|
||||
type VectorSum func(v Vector) *big.Int |
||||
|
||||
func (v VectorSum) Sum(vectors []Vector) *big.Int { |
||||
vs := vectorSummer{ |
||||
vectors: vectors, |
||||
by: v, |
||||
} |
||||
return Sum(vs) |
||||
} |
||||
|
||||
func (v vectorSummer) Len() int { return len(v.vectors) } |
||||
func (v vectorSummer) Sum(i int) *big.Int { return v.by(v.vectors[i]) } |
||||
|
||||
func GasSum(v Vector) *big.Int { return v.Gas } |
||||
|
||||
var etherInWei = new(big.Rat).SetInt(ethutil.String2Big("1000000000000000000")) |
||||
|
||||
func GasPrice(bp, gl, ep *big.Int) *big.Int { |
||||
BP := new(big.Rat).SetInt(bp) |
||||
GL := new(big.Rat).SetInt(gl) |
||||
EP := new(big.Rat).SetInt(ep) |
||||
GP := new(big.Rat).Quo(BP, GL) |
||||
GP = GP.Quo(GP, EP) |
||||
|
||||
return GP.Mul(GP, etherInWei).Num() |
||||
} |
@ -0,0 +1,66 @@ |
||||
package math |
||||
|
||||
import ( |
||||
"fmt" |
||||
"math/big" |
||||
"testing" |
||||
) |
||||
|
||||
type summer struct { |
||||
numbers []*big.Int |
||||
} |
||||
|
||||
func (s summer) Len() int { return len(s.numbers) } |
||||
func (s summer) Sum(i int) *big.Int { |
||||
return s.numbers[i] |
||||
} |
||||
|
||||
func TestSum(t *testing.T) { |
||||
summer := summer{numbers: []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}} |
||||
sum := Sum(summer) |
||||
if sum.Cmp(big.NewInt(6)) != 0 { |
||||
t.Errorf("not 6", sum) |
||||
} |
||||
} |
||||
|
||||
func TestDist(t *testing.T) { |
||||
var vectors = []Vector{ |
||||
Vector{big.NewInt(1000), big.NewInt(1234)}, |
||||
Vector{big.NewInt(500), big.NewInt(10023)}, |
||||
Vector{big.NewInt(1034), big.NewInt(1987)}, |
||||
Vector{big.NewInt(1034), big.NewInt(1987)}, |
||||
Vector{big.NewInt(8983), big.NewInt(1977)}, |
||||
Vector{big.NewInt(98382), big.NewInt(1887)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1287)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1487)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1987)}, |
||||
Vector{big.NewInt(12398), big.NewInt(128)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1987)}, |
||||
Vector{big.NewInt(1398), big.NewInt(187)}, |
||||
Vector{big.NewInt(12328), big.NewInt(1927)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1987)}, |
||||
Vector{big.NewInt(22398), big.NewInt(1287)}, |
||||
Vector{big.NewInt(1370), big.NewInt(1981)}, |
||||
Vector{big.NewInt(12398), big.NewInt(1957)}, |
||||
Vector{big.NewInt(42198), big.NewInt(1987)}, |
||||
} |
||||
|
||||
VectorsBy(GasSort).Sort(vectors) |
||||
fmt.Println(vectors) |
||||
|
||||
BP := big.NewInt(15) |
||||
GL := big.NewInt(1000000) |
||||
EP := big.NewInt(100) |
||||
fmt.Println("BP", BP, "GL", GL, "EP", EP) |
||||
GP := GasPrice(BP, GL, EP) |
||||
fmt.Println("GP =", GP, "Wei per GU") |
||||
|
||||
S := len(vectors) / 4 |
||||
fmt.Println("L", len(vectors), "S", S) |
||||
for i := 1; i <= S*4; i += S { |
||||
fmt.Printf("T%d = %v\n", i, vectors[i]) |
||||
} |
||||
|
||||
g := VectorSum(GasSum).Sum(vectors) |
||||
fmt.Printf("G = ∑g* (%v)\n", g) |
||||
} |
Loading…
Reference in new issue