Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error driven snowflake multi counter #3092

Merged
merged 25 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5ae5fb9
Implement error driven snowflake hardcoded to a single confidence cou…
aaronbuchwald May 1, 2024
c38091f
clean up comments
aaronbuchwald May 1, 2024
ce2616b
Update consensus nary constructors to take a slice for alphaConfidenc…
aaronbuchwald May 1, 2024
f023f62
Update consensus stringers to support multiple confidence values
aaronbuchwald May 1, 2024
f165b2a
Merge branch 'master' into flexible-snowflake-single-counter
aaronbuchwald Jun 3, 2024
1fd35ce
Move alphaConfidence/beta slices into a slice of structs
aaronbuchwald Jun 4, 2024
ad1dfef
Merge branch 'flexible-snowflake-single-counter' into error-driven-sn…
aaronbuchwald Jun 4, 2024
2f7f79f
Fix merge
aaronbuchwald Jun 4, 2024
70306e7
Use slices.Clone instead of copy for cloning confidence slice
aaronbuchwald Jun 4, 2024
efe599e
Use slices.Clone in unary snowflake
aaronbuchwald Jun 4, 2024
9fe7967
Merge branch 'flexible-snowflake-single-counter' into error-driven-sn…
aaronbuchwald Jun 4, 2024
6d29503
Call RecordSuccessfulPoll for every successful poll
aaronbuchwald Jun 5, 2024
c0b1173
Merge branch 'flexible-snowflake-single-counter' into error-driven-sn…
aaronbuchwald Jun 6, 2024
53ae50c
Add test coverage for multiple termination conditions over unary snow…
aaronbuchwald Jun 6, 2024
0d98675
Merge branch 'master' into error-driven-snowflake-multi-counter
aaronbuchwald Jun 6, 2024
9ecd20a
Align tests
aaronbuchwald Jun 7, 2024
fc0c0c0
Add test coverage for error drive snowflake across unary/binary/nnary
aaronbuchwald Jun 10, 2024
ae23154
Address single import linter
aaronbuchwald Jun 10, 2024
73b767a
Fix test
aaronbuchwald Jun 10, 2024
fb63c3b
Merge branch 'master' into error-driven-snowflake-multi-counter
aaronbuchwald Jun 10, 2024
7d275aa
Add newSingleTerminationCondition helper function for snowflake tests
aaronbuchwald Jun 11, 2024
fdd3e11
Move newSingleTerminationCondition helper to params for re-use in fac…
aaronbuchwald Jun 11, 2024
a068bbc
Rename snowflake test function to AssertEqual
aaronbuchwald Jun 11, 2024
f4eccb0
Update error driven snowflake test of switching choices to result in …
aaronbuchwald Jun 11, 2024
0814e6a
Add getters for error driven snowflake single/multi choice test suites
aaronbuchwald Jun 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions snow/consensus/snowball/binary_snowball.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import "fmt"

var _ Binary = (*binarySnowball)(nil)

func newBinarySnowball(alphaPreference int, alphaConfidence int, beta int, choice int) binarySnowball {
func newBinarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowball {
return binarySnowball{
binarySnowflake: newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice),
binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, choice),
preference: choice,
}
}
Expand Down
54 changes: 42 additions & 12 deletions snow/consensus/snowball/binary_snowball_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,14 @@ func TestBinarySnowball(t *testing.T) {

alphaPreference, alphaConfidence := 2, 3
beta := 2

sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
terminationConditions := []terminationCondition{
marun marked this conversation as resolved.
Show resolved Hide resolved
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newBinarySnowball(alphaPreference, terminationConditions, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

Expand Down Expand Up @@ -47,8 +53,14 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2

sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newBinarySnowball(alphaPreference, terminationConditions, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

Expand All @@ -72,7 +84,7 @@ func TestBinarySnowballRecordPollPreference(t *testing.T) {
require.Equal(red, sb.Preference())
require.True(sb.Finalized())

expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))"
expected := "SB(Preference = 0, PreferenceStrength[0] = 4, PreferenceStrength[1] = 1, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))"
require.Equal(expected, sb.String())
}

Expand All @@ -84,8 +96,14 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2

sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newBinarySnowball(alphaPreference, terminationConditions, red)
require.Equal(red, sb.Preference())
require.False(sb.Finalized())

Expand All @@ -103,7 +121,7 @@ func TestBinarySnowballRecordUnsuccessfulPoll(t *testing.T) {
require.Equal(blue, sb.Preference())
require.True(sb.Finalized())

expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = 2, Finalized = true, SL(Preference = 1)))"
expected := "SB(Preference = 1, PreferenceStrength[0] = 0, PreferenceStrength[1] = 3, SF(Confidence = [2], Finalized = true, SL(Preference = 1)))"
require.Equal(expected, sb.String())
}

Expand All @@ -115,8 +133,14 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
sb := newBinarySnowball(alphaPreference, terminationConditions, red)

require.Equal(red, sb.Preference())
require.False(sb.Finalized())
Expand Down Expand Up @@ -144,7 +168,7 @@ func TestBinarySnowballAcceptWeirdColor(t *testing.T) {
require.Equal(blue, sb.Preference())
require.True(sb.Finalized())

expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = 2, Finalized = true, SL(Preference = 0)))"
expected := "SB(Preference = 1, PreferenceStrength[0] = 2, PreferenceStrength[1] = 2, SF(Confidence = [2], Finalized = true, SL(Preference = 0)))"
require.Equal(expected, sb.String())
}

Expand All @@ -156,8 +180,14 @@ func TestBinarySnowballLockColor(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 1
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newBinarySnowball(alphaPreference, alphaConfidence, beta, red)
sb := newBinarySnowball(alphaPreference, terminationConditions, red)

sb.RecordPoll(alphaConfidence, red)

Expand All @@ -175,6 +205,6 @@ func TestBinarySnowballLockColor(t *testing.T) {
require.Equal(red, sb.Preference())
require.True(sb.Finalized())

expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = 1, Finalized = true, SL(Preference = 0)))"
expected := "SB(Preference = 1, PreferenceStrength[0] = 1, PreferenceStrength[1] = 3, SF(Confidence = [1], Finalized = true, SL(Preference = 0)))"
require.Equal(expected, sb.String())
}
19 changes: 7 additions & 12 deletions snow/consensus/snowball/binary_snowflake.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,12 @@ import "fmt"

var _ Binary = (*binarySnowflake)(nil)

func newBinarySnowflake(alphaPreference, alphaConfidence, beta, choice int) binarySnowflake {
func newBinarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice int) binarySnowflake {
aaronbuchwald marked this conversation as resolved.
Show resolved Hide resolved
return binarySnowflake{
binarySlush: newBinarySlush(choice),
alphaPreference: alphaPreference,
terminationConditions: []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
},
confidence: make([]int, 1),
binarySlush: newBinarySlush(choice),
alphaPreference: alphaPreference,
terminationConditions: terminationConditions,
confidence: make([]int, len(terminationConditions)),
}
}

Expand Down Expand Up @@ -94,8 +89,8 @@ func (sf *binarySnowflake) Finalized() bool {
}

func (sf *binarySnowflake) String() string {
return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)",
sf.confidence[0],
return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)",
sf.confidence,
sf.finalized,
&sf.binarySlush)
}
49 changes: 48 additions & 1 deletion snow/consensus/snowball/binary_snowflake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,14 @@ func TestBinarySnowflake(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sf := newBinarySnowflake(alphaPreference, alphaConfidence, beta, red)
sf := newBinarySnowflake(alphaPreference, terminationConditions, red)

require.Equal(red, sf.Preference())
require.False(sf.Finalized())
Expand Down Expand Up @@ -50,3 +56,44 @@ func TestBinarySnowflake(t *testing.T) {
require.Equal(blue, sf.Preference())
require.True(sf.Finalized())
}

type binarySnowflakeTest struct {
require *require.Assertions

binarySnowflake
}

func newBinarySnowflakeTest(t *testing.T, alphaPreference int, terminationConditions []terminationCondition) snowflakeTest[int] {
require := require.New(t)

return &binarySnowflakeTest{
require: require,
binarySnowflake: newBinarySnowflake(alphaPreference, terminationConditions, 0),
}
}

func (sf *binarySnowflakeTest) RecordPoll(count int, choice int) {
sf.binarySnowflake.RecordPoll(count, choice)
}

func (sf *binarySnowflakeTest) Assert(expectedConfidences []int, expectedFinalized bool, expectedPreference int) {
sf.require.Equal(expectedPreference, sf.Preference())
sf.require.Equal(expectedConfidences, sf.binarySnowflake.confidence)
sf.require.Equal(expectedFinalized, sf.Finalized())
}

func TestBinarySnowflakeTerminateInBetaPolls(t *testing.T) {
executeErrorDrivenTerminatesInBetaPolls(t, newBinarySnowflakeTest, 0)
marun marked this conversation as resolved.
Show resolved Hide resolved
}

func TestBinarySnowflakeErrorDrivenReset(t *testing.T) {
executeErrorDrivenReset(t, newBinarySnowflakeTest, 0)
}

func TestBinarySnowflakeErrorDrivenResetHighestAlphaConfidence(t *testing.T) {
executeErrorDrivenResetHighestAlphaConfidence(t, newBinarySnowflakeTest, 0)
}

func TestBinarySnowflakeErrorDrivenSwitchChoices(t *testing.T) {
executeErrorDrivenSwitchChoices(t, newBinarySnowflakeTest, 0, 1)
}
28 changes: 24 additions & 4 deletions snow/consensus/snowball/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,43 @@ var (
type snowballFactory struct{}

func (snowballFactory) NewNnary(params Parameters, choice ids.ID) Nnary {
sb := newNnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice)
sb := newNnarySnowball(params.AlphaPreference, []terminationCondition{
marun marked this conversation as resolved.
Show resolved Hide resolved
{
alphaConfidence: params.AlphaConfidence,
beta: params.Beta,
},
}, choice)
return &sb
}

func (snowballFactory) NewUnary(params Parameters) Unary {
sb := newUnarySnowball(params.AlphaPreference, params.AlphaConfidence, params.Beta)
sb := newUnarySnowball(params.AlphaPreference, []terminationCondition{
{
alphaConfidence: params.AlphaConfidence,
beta: params.Beta,
},
})
return &sb
}

type snowflakeFactory struct{}

func (snowflakeFactory) NewNnary(params Parameters, choice ids.ID) Nnary {
sf := newNnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta, choice)
sf := newNnarySnowflake(params.AlphaPreference, []terminationCondition{
{
alphaConfidence: params.AlphaConfidence,
beta: params.Beta,
},
}, choice)
return &sf
}

func (snowflakeFactory) NewUnary(params Parameters) Unary {
sf := newUnarySnowflake(params.AlphaPreference, params.AlphaConfidence, params.Beta)
sf := newUnarySnowflake(params.AlphaPreference, []terminationCondition{
{
alphaConfidence: params.AlphaConfidence,
beta: params.Beta,
},
})
return &sf
}
2 changes: 1 addition & 1 deletion snow/consensus/snowball/flat_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ func TestFlat(t *testing.T) {
require.Equal(Green, f.Preference())
require.True(f.Finalized())

expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = 2, Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))"
expected := "SB(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w, PreferenceStrength = 4, SF(Confidence = [2], Finalized = true, SL(Preference = 2mcwQKiD8VEspmMJpL1dc7okQQ5dDVAWeCBZ7FWBFAbxpv3t7w)))"
require.Equal(expected, f.String())
}
4 changes: 2 additions & 2 deletions snow/consensus/snowball/nnary_snowball.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import (

var _ Nnary = (*nnarySnowball)(nil)

func newNnarySnowball(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowball {
func newNnarySnowball(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowball {
return nnarySnowball{
nnarySnowflake: newNnarySnowflake(alphaPreference, alphaConfidence, beta, choice),
nnarySnowflake: newNnarySnowflake(alphaPreference, terminationConditions, choice),
preference: choice,
preferenceStrength: make(map[ids.ID]int),
}
Expand Down
34 changes: 29 additions & 5 deletions snow/consensus/snowball/nnary_snowball_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@ func TestNnarySnowball(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
sb.Add(Blue)
sb.Add(Green)

Expand Down Expand Up @@ -56,8 +62,14 @@ func TestVirtuousNnarySnowball(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 1
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)

require.Equal(Red, sb.Preference())
require.False(sb.Finalized())
Expand All @@ -72,8 +84,14 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
sb.Add(Blue)

require.Equal(Red, sb.Preference())
Expand All @@ -95,7 +113,7 @@ func TestNarySnowballRecordUnsuccessfulPoll(t *testing.T) {
require.Equal(Blue, sb.Preference())
require.True(sb.Finalized())

expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = 2, Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))"
expected := "SB(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES, PreferenceStrength = 3, SF(Confidence = [2], Finalized = true, SL(Preference = TtF4d2QWbk5vzQGTEPrN48x6vwgAoAmKQ9cbp79inpQmcRKES)))"
require.Equal(expected, sb.String())

for i := 0; i < 4; i++ {
Expand All @@ -111,8 +129,14 @@ func TestNarySnowballDifferentSnowflakeColor(t *testing.T) {

alphaPreference, alphaConfidence := 1, 2
beta := 2
terminationConditions := []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
}

sb := newNnarySnowball(alphaPreference, alphaConfidence, beta, Red)
sb := newNnarySnowball(alphaPreference, terminationConditions, Red)
sb.Add(Blue)

require.Equal(Red, sb.Preference())
Expand Down
19 changes: 7 additions & 12 deletions snow/consensus/snowball/nnary_snowflake.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,12 @@ import (

var _ Nnary = (*nnarySnowflake)(nil)

func newNnarySnowflake(alphaPreference, alphaConfidence, beta int, choice ids.ID) nnarySnowflake {
func newNnarySnowflake(alphaPreference int, terminationConditions []terminationCondition, choice ids.ID) nnarySnowflake {
return nnarySnowflake{
nnarySlush: newNnarySlush(choice),
alphaPreference: alphaPreference,
terminationConditions: []terminationCondition{
{
alphaConfidence: alphaConfidence,
beta: beta,
},
},
confidence: make([]int, 1),
nnarySlush: newNnarySlush(choice),
alphaPreference: alphaPreference,
terminationConditions: terminationConditions,
confidence: make([]int, len(terminationConditions)),
}
}

Expand Down Expand Up @@ -101,8 +96,8 @@ func (sf *nnarySnowflake) Finalized() bool {
}

func (sf *nnarySnowflake) String() string {
return fmt.Sprintf("SF(Confidence = %d, Finalized = %v, %s)",
sf.confidence[0],
return fmt.Sprintf("SF(Confidence = %v, Finalized = %v, %s)",
sf.confidence,
sf.finalized,
&sf.nnarySlush)
}
Loading
Loading