From 548856bb1431d7fbe78b972c754acbffe7c87cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Brand=C3=A3o?= Date: Thu, 12 Dec 2024 10:39:40 +0000 Subject: [PATCH 1/3] Consider more scores samples in score normalization --- x/emissions/keeper/keeper.go | 22 +++++++------ x/emissions/keeper/keeper_test.go | 33 +++++++++++++++++++ .../module/rewards/worker_rewards_test.go | 9 +++++ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/x/emissions/keeper/keeper.go b/x/emissions/keeper/keeper.go index bb3b4d910..032f86477 100644 --- a/x/emissions/keeper/keeper.go +++ b/x/emissions/keeper/keeper.go @@ -3106,7 +3106,8 @@ func (k *Keeper) InsertWorkerInferenceScore(ctx context.Context, topicId TopicId if err != nil { return errorsmod.Wrapf(err, "Error getting params") } - maxNumScores := moduleParams.MaxSamplesToScaleScores + + maxNumScores := moduleParams.MaxSamplesToScaleScores * moduleParams.MaxTopInferersToReward lenScores := uint64(len(scores.Scores)) if lenScores > maxNumScores { @@ -3137,10 +3138,10 @@ func (k *Keeper) GetInferenceScoresUntilBlock(ctx context.Context, topicId Topic if err != nil { return nil, errorsmod.Wrap(err, "error getting params") } - maxNumTimeSteps := moduleParams.MaxSamplesToScaleScores - scores := make([]*types.Score, 0, maxNumTimeSteps) + maxNumScores := moduleParams.MaxSamplesToScaleScores * moduleParams.MaxTopInferersToReward + scores := make([]*types.Score, 0, maxNumScores) for iter.Valid() { existingScores, err := iter.KeyValue() if err != nil { @@ -3148,13 +3149,13 @@ func (k *Keeper) GetInferenceScoresUntilBlock(ctx context.Context, topicId Topic } for _, score := range existingScores.Value.Scores { - if uint64(len(scores)) < maxNumTimeSteps { + if uint64(len(scores)) < maxNumScores { scores = append(scores, score) } else { break } } - if uint64(len(scores)) >= maxNumTimeSteps { + if uint64(len(scores)) >= maxNumScores { break } iter.Next() @@ -3194,7 +3195,8 @@ func (k *Keeper) InsertWorkerForecastScore(ctx context.Context, topicId TopicId, if err != nil { return errorsmod.Wrap(err, "error getting params") } - maxNumScores := moduleParams.MaxSamplesToScaleScores + + maxNumScores := moduleParams.MaxSamplesToScaleScores * moduleParams.MaxTopForecastersToReward lenScores := uint64(len(scores.Scores)) if lenScores > maxNumScores { @@ -3225,10 +3227,10 @@ func (k *Keeper) GetForecastScoresUntilBlock(ctx context.Context, topicId TopicI if err != nil { return nil, errorsmod.Wrap(err, "error getting params") } - maxNumTimeSteps := moduleParams.MaxSamplesToScaleScores - scores := make([]*types.Score, 0, maxNumTimeSteps) + maxNumScores := moduleParams.MaxSamplesToScaleScores * moduleParams.MaxTopForecastersToReward + scores := make([]*types.Score, 0, maxNumScores) for iter.Valid() { existingScores, err := iter.KeyValue() if err != nil { @@ -3236,13 +3238,13 @@ func (k *Keeper) GetForecastScoresUntilBlock(ctx context.Context, topicId TopicI } for _, score := range existingScores.Value.Scores { - if uint64(len(scores)) < maxNumTimeSteps { + if uint64(len(scores)) < maxNumScores { scores = append(scores, score) } else { break } } - if uint64(len(scores)) >= maxNumTimeSteps { + if uint64(len(scores)) >= maxNumScores { break } iter.Next() diff --git a/x/emissions/keeper/keeper_test.go b/x/emissions/keeper/keeper_test.go index 769aa88e9..95258586c 100644 --- a/x/emissions/keeper/keeper_test.go +++ b/x/emissions/keeper/keeper_test.go @@ -4946,3 +4946,36 @@ func (s *KeeperTestSuite) TestGetCountForecasterInclusionsInTopic() { require.NoError(err) require.Equal(uint64(1), count) } + +func (s *KeeperTestSuite) TestScoreLimiting() { + k := s.emissionsKeeper + ctx := s.ctx + topicId := s.CreateOneTopic(10800) + blockHeight := int64(10) + + params := types.DefaultParams() + params.MaxTopInferersToReward = 2 + params.MaxSamplesToScaleScores = 3 + err := k.SetParams(ctx, params) + s.Require().NoError(err) + + for i := 0; i < 8; i++ { + score := types.Score{ + TopicId: topicId, + BlockHeight: blockHeight, + Address: s.addrsStr[i], + Score: alloraMath.NewDecFromInt64(int64(90 + i)), + } + err := k.InsertWorkerInferenceScore(ctx, topicId, blockHeight, score) + s.Require().NoError(err) + } + + scores, err := k.GetWorkerInferenceScoresAtBlock(ctx, topicId, blockHeight) + s.Require().NoError(err) + s.Require().Equal(6, len(scores.Scores), "Should keep MaxSamplesToScaleScores * MaxTopInferersToReward scores") + + for i, score := range scores.Scores { + expectedWorker := s.addrsStr[i+2] + s.Require().Equal(expectedWorker, score.Address) + } +} diff --git a/x/emissions/module/rewards/worker_rewards_test.go b/x/emissions/module/rewards/worker_rewards_test.go index ebe4fd3ea..31171ad60 100644 --- a/x/emissions/module/rewards/worker_rewards_test.go +++ b/x/emissions/module/rewards/worker_rewards_test.go @@ -227,6 +227,15 @@ func (s *RewardsTestSuite) TestGetWorkersRewardFractionsFromCsv() { forecaster2 := s.addrsStr[7] forecasterAddresses := []string{forecaster0, forecaster1, forecaster2} + // CSV values were generated considering just max scores = 10 + // The actual implementation considers max scores = 10 * max actors to reward + params, err := s.emissionsKeeper.GetParams(s.ctx) + s.Require().NoError(err) + params.MaxTopInferersToReward = 1 + params.MaxTopForecastersToReward = 1 + err = s.emissionsKeeper.SetParams(s.ctx, params) + s.Require().NoError(err) + // Add scores from previous epochs infererLastScores := make([]types.Score, 0) forecasterLastScores := make([]types.Score, 0) From c91ac94fb825d117ef8d87e679b65b40f591278f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Brand=C3=A3o?= Date: Thu, 12 Dec 2024 11:41:25 +0000 Subject: [PATCH 2/3] Fix tests --- CHANGELOG.md | 3 +++ x/emissions/keeper/keeper_test.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad9bad42c..81f34952c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed +* [#702](https://github.com/allora-network/allora-chain/pull/702) Adjust score normalization to consider more scores samples + ## v0.7.0 ### Added diff --git a/x/emissions/keeper/keeper_test.go b/x/emissions/keeper/keeper_test.go index 95258586c..65f55b246 100644 --- a/x/emissions/keeper/keeper_test.go +++ b/x/emissions/keeper/keeper_test.go @@ -2642,6 +2642,7 @@ func (s *KeeperTestSuite) TestInsertWorkerInferenceScore() { maxNumScores := 5 params := types.DefaultParams() params.MaxSamplesToScaleScores = uint64(maxNumScores) + params.MaxTopInferersToReward = 1 err := keeper.SetParams(ctx, params) s.Require().NoError(err, "Setting parameters should not fail") @@ -2667,6 +2668,7 @@ func (s *KeeperTestSuite) TestInsertWorkerInferenceScore2() { maxNumScores := 5 params := types.DefaultParams() params.MaxSamplesToScaleScores = uint64(maxNumScores) + params.MaxTopInferersToReward = 1 err := keeper.SetParams(ctx, params) s.Require().NoError(err, "Setting parameters should not fail") @@ -2740,6 +2742,7 @@ func (s *KeeperTestSuite) TestInsertWorkerForecastScore() { maxNumScores := 5 params := types.DefaultParams() params.MaxSamplesToScaleScores = uint64(maxNumScores) + params.MaxTopForecastersToReward = 1 err := keeper.SetParams(ctx, params) s.Require().NoError(err, "Setting parameters should not fail") From 1efc9b0ec3bc65fc3fe1e68356ec05750395d5b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Brand=C3=A3o?= Date: Thu, 12 Dec 2024 11:54:53 +0000 Subject: [PATCH 3/3] Fix tests and lint --- x/emissions/keeper/keeper_test.go | 2 +- x/emissions/keeper/queryserver/query_server_score_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/x/emissions/keeper/keeper_test.go b/x/emissions/keeper/keeper_test.go index 65f55b246..f601aaf5d 100644 --- a/x/emissions/keeper/keeper_test.go +++ b/x/emissions/keeper/keeper_test.go @@ -4975,7 +4975,7 @@ func (s *KeeperTestSuite) TestScoreLimiting() { scores, err := k.GetWorkerInferenceScoresAtBlock(ctx, topicId, blockHeight) s.Require().NoError(err) - s.Require().Equal(6, len(scores.Scores), "Should keep MaxSamplesToScaleScores * MaxTopInferersToReward scores") + s.Require().Len(scores.Scores, 6, "Should keep MaxSamplesToScaleScores * MaxTopInferersToReward scores") for i, score := range scores.Scores { expectedWorker := s.addrsStr[i+2] diff --git a/x/emissions/keeper/queryserver/query_server_score_test.go b/x/emissions/keeper/queryserver/query_server_score_test.go index ca20af122..9634975e2 100644 --- a/x/emissions/keeper/queryserver/query_server_score_test.go +++ b/x/emissions/keeper/queryserver/query_server_score_test.go @@ -131,6 +131,7 @@ func (s *QueryServerTestSuite) TestGetWorkerInferenceScoresAtBlock() { maxNumScores := 5 params := types.DefaultParams() params.MaxSamplesToScaleScores = uint64(maxNumScores) + params.MaxTopInferersToReward = 1 err := keeper.SetParams(ctx, params) s.Require().NoError(err, "Setting parameters should not fail")