Draft version of summary dumper

This commit is contained in:
Kistaro Windrider 2023-11-18 18:03:28 -08:00
parent 117a5e9f2b
commit b83a3ed5c3
Signed by: kistaro
SSH Key Fingerprint: SHA256:TBE2ynfmJqsAf0CP6gsflA0q5X5wD5fVKWPsZ7eVUg8

131
auctionsim/summary.go Normal file
View File

@ -0,0 +1,131 @@
package auctionsim
import (
"strconv"
)
/// Digits of precision in floating-point values in CSVs.
const CSVPrecision = 10
/**
* ResultSummary contains notable results of an auction.
*/
type ResultSummary struct {
/// The number of bidders in the auction.
Bidders int
/// The price the item sold for.
Price float64
/// The amount of value the winner actually got out of the auctioned item.
WinnerValue float64
/**
* The amount by which the winner's value of the item exceeded the price
* they paid. Often negative.
*/
WinnerProfit float64
/**
* Number of losing bidders who had a "true value" of the item in excess
* of the price paid.
*/
LosersWithRegrets int
/// The most the item was genuinely worth to any bidder.
HighestValue float64
/// The most the bidder with the highest value would have been willing to pay.
HighestValuatorBid float64
/**
* How much the bidder with the highest value would have made in profit had
* they won the auction for the price the auction's actual winner paid.
* Often negative, indicating nobody would have made money on the auction.
* If this is zero or negative, there are 0 losers with regrets.
*/
MissedProfit float64
/**
* How much more valuable the item was to the bidder with the highest value
* than it was to the auction's eventual winner, irrespective of winning bid.
*/
ValueDelta float64
/**
* The rank of the bidder who actually had the highest value of the item.
* The winner of the auction has rank 1.
*/
HighestValueRank int
}
/**
* Summarize takes an already-sorted list of bidders (see RunAuctionVerbosely)
* and the winning auction price, and calculates a ResultSummary for that auction.
*/
func Summarize(price float64, allBidders []Bidder) *ResultSummary {
regrets := 0
maxValue := math.Inf(-1)
maxIdx := -1
for i, b := range allBidders {
if b.Value > maxValue {
maxValue = b.Value
maxIdx = i
}
if b.Value > price {
regrets++
}
}
winner := allBidders[len(allBidders) - 1]
rube := Bidder{}
if maxIdx >= 0 {
rube = allBidders[maxIdx]
}
return &ResultSummary {
Bidders: len(allbidders),
Price: price,
WinnerValue: winner.Value,
WinnerProfit: winner.Value - price,
LosersWithRegrets: regrets,
HighestValue: maxValue,
HighestValuatorBid: rube.BidCeiling(),
MissedProfit: rube.Value - price,
ValueDelta: maxValue - winner.Value,
HighestValueRank: len(allBidders) - maxIdx,
}
}
/**
* ResultSummaryCSVHeader returns column labels for the records emitted by
* (*ResultSummary).CSVRecord().
*/
func ResultSummaryCSVHeader() []string {
return []string{
"Bidders",
"Price",
"WinnerValue",
"WinnerProfit",
"LosersWithRegrets",
"HighestValue",
"HighestValuatorBid",
"MissedProfit",
"ValueDelta",
"HighestValueRank",
}
}
func csvFloat(f float64) string {
return strconv.FormatFloat(f, 'g', CSVPrecision)
}
/**
* CSVRecord returns rows intended for use with encoding/csv.Writer, with
* columns in the order specified by ResultSummaryCSVHeader().
*/
func (s *ResultSummary) CSVRecord() []string {
return []string{
strconv.Itoa(s.Bidders),
csvFloat(s.Price),
csvFloat(s.WinnerValue),
csvFloat(s.WinnerProfit),
strconv.Itoa(LosersWithRegrets),
csvFloat(s.HighestValue),
csvFloat(s.HighestValuatorBid),
csvFloat(s.MissedProfit),
csvFloat(s.ValueDelta),
strconv.Itoa(HighestValueRank),
}
}