70 lines
2.8 KiB
Go
70 lines
2.8 KiB
Go
package coordinate
|
|
|
|
// Config is used to set the parameters of the Vivaldi-based coordinate mapping
|
|
// algorithm.
|
|
//
|
|
// The following references are called out at various points in the documentation
|
|
// here:
|
|
//
|
|
// [1] Dabek, Frank, et al. "Vivaldi: A decentralized network coordinate system."
|
|
// ACM SIGCOMM Computer Communication Review. Vol. 34. No. 4. ACM, 2004.
|
|
// [2] Ledlie, Jonathan, Paul Gardner, and Margo I. Seltzer. "Network Coordinates
|
|
// in the Wild." NSDI. Vol. 7. 2007.
|
|
// [3] Lee, Sanghwan, et al. "On suitability of Euclidean embedding for
|
|
// host-based network coordinate systems." Networking, IEEE/ACM Transactions
|
|
// on 18.1 (2010): 27-40.
|
|
type Config struct {
|
|
// The dimensionality of the coordinate system. As discussed in [2], more
|
|
// dimensions improves the accuracy of the estimates up to a point. Per [2]
|
|
// we chose 8 dimensions plus a non-Euclidean height.
|
|
Dimensionality uint
|
|
|
|
// VivaldiErrorMax is the default error value when a node hasn't yet made
|
|
// any observations. It also serves as an upper limit on the error value in
|
|
// case observations cause the error value to increase without bound.
|
|
VivaldiErrorMax float64
|
|
|
|
// VivaldiCE is a tuning factor that controls the maximum impact an
|
|
// observation can have on a node's confidence. See [1] for more details.
|
|
VivaldiCE float64
|
|
|
|
// VivaldiCC is a tuning factor that controls the maximum impact an
|
|
// observation can have on a node's coordinate. See [1] for more details.
|
|
VivaldiCC float64
|
|
|
|
// AdjustmentWindowSize is a tuning factor that determines how many samples
|
|
// we retain to calculate the adjustment factor as discussed in [3]. Setting
|
|
// this to zero disables this feature.
|
|
AdjustmentWindowSize uint
|
|
|
|
// HeightMin is the minimum value of the height parameter. Since this
|
|
// always must be positive, it will introduce a small amount error, so
|
|
// the chosen value should be relatively small compared to "normal"
|
|
// coordinates.
|
|
HeightMin float64
|
|
|
|
// LatencyFilterSamples is the maximum number of samples that are retained
|
|
// per node, in order to compute a median. The intent is to ride out blips
|
|
// but still keep the delay low, since our time to probe any given node is
|
|
// pretty infrequent. See [2] for more details.
|
|
LatencyFilterSize uint
|
|
|
|
// GravityRho is a tuning factor that sets how much gravity has an effect
|
|
// to try to re-center coordinates. See [2] for more details.
|
|
GravityRho float64
|
|
}
|
|
|
|
// DefaultConfig returns a Config that has some default values suitable for
|
|
// basic testing of the algorithm, but not tuned to any particular type of cluster.
|
|
func DefaultConfig() *Config {
|
|
return &Config{
|
|
Dimensionality: 8,
|
|
VivaldiErrorMax: 1.5,
|
|
VivaldiCE: 0.25,
|
|
VivaldiCC: 0.25,
|
|
AdjustmentWindowSize: 20,
|
|
HeightMin: 10.0e-6,
|
|
LatencyFilterSize: 3,
|
|
GravityRho: 150.0,
|
|
}
|
|
}
|