def _get_scorers(
  seed: Optional[int],
  pseudoraters: Optional[bool],
  useStableInitialization: bool = True,
) -> Dict[Scorers, List[Scorer]]:
  """Instantiate all Scorer objects which should be used for note ranking.

  Args:
    seed (int, optional): if not None, base distinct seeds for the first and second MF rounds on this value
    pseudoraters (bool, optional): if True, compute optional pseudorater confidence intervals

  Returns:
    Dict[Scorers, List[Scorer]] containing instantiated Scorer objects for note ranking.
  """
  scorers: Dict[Scorers, List[Scorer]] = dict()
  scorers[Scorers.MFCoreWithTopicsScorer] = [
    MFCoreWithTopicsScorer(
      seed, pseudoraters, useStableInitialization=useStableInitialization, threads=12
    )
  ]
  scorers[Scorers.MFCoreScorer] = [
    MFCoreScorer(seed, pseudoraters, useStableInitialization=useStableInitialization, threads=12)
  ]
  scorers[Scorers.MFExpansionScorer] = [
    MFExpansionScorer(seed, useStableInitialization=useStableInitialization, threads=12)
  ]
  scorers[Scorers.MFExpansionPlusScorer] = [
    MFExpansionPlusScorer(seed, useStableInitialization=useStableInitialization, threads=12)
  ]
  scorers[Scorers.ReputationScorer] = [
    ReputationScorer(seed, useStableInitialization=useStableInitialization, threads=12)
  ]
  # Note that index 0 is reserved, corresponding to no group assigned, so scoring group
  # numbers begin with index 1.
  scorers[Scorers.MFGroupScorer] = [
    # Scoring Group 13 is currently the largest by far, so total runtime benefits from
    # adding the group scorers in descending order so we start work on Group 13 first.
    MFGroupScorer(includedGroups={i}, groupId=i, threads=groupScorerParalleism.get(i, 4), seed=seed)
    for i in range(groupScorerCount, 0, -1)
    if i != trialScoringGroup
  ]
  scorers[Scorers.MFGroupScorer].append(
    MFGroupScorer(
      includedGroups={trialScoringGroup},
      groupId=trialScoringGroup,
      threads=groupScorerParalleism.get(trialScoringGroup, 4),
      seed=seed,
      noteInterceptLambda=0.03 * 30,
      userInterceptLambda=0.03 * 5,
      globalInterceptLambda=0.03 * 5,
      noteFactorLambda=0.03 / 3,
      userFactorLambda=0.03 / 4,
      diamondLambda=0.03 * 25,
      normalizedLossHyperparameters=NormalizedLossHyperparameters(
        globalSignNorm=True, noteSignAlpha=None, noteNormExp=0, raterNormExp=-0.25
      ),
      maxFinalMFTrainError=0.16,
      groupThreshold=0.4,
      minMeanNoteScore=-0.01,
      crhThreshold=0.15,
      crhSuperThreshold=None,
      crnhThresholdIntercept=-0.01,
      crnhThresholdNoteFactorMultiplier=0,
      crnhThresholdNMIntercept=-0.02,
      crhThresholdNoHighVol=0.12,
      lowDiligenceThreshold=1000,
      factorThreshold=0.4,
      multiplyPenaltyByHarassmentScore=False,
      minimumHarassmentScoreToPenalize=2.5,
      tagConsensusHarassmentHelpfulRatingPenalty=10,
      tagFilterPercentile=90,
      incorrectFilterThreshold=1.5,
    )
  )
  scorers[Scorers.MFGroupScorer].append(
    MFGroupScorer(
      includedGroups={nmrScoringGroup},
      strictInclusion=True,
      groupThreshold=0.8,
      groupId=nmrScoringGroup,
      threads=groupScorerParalleism.get(nmrScoringGroup, 4),
      seed=seed,
    )
  )
  scorers[Scorers.MFTopicScorer] = [
    MFTopicScorer(topicName=topic.name, seed=seed) for topic in Topics
  ]
  scorers[Scorers.MFMultiGroupScorer] = [
    MFMultiGroupScorer(includedGroups={4, 5, 7, 12, 26}, groupId=1, threads=4, seed=seed),
  ]

  return scorers
Instantiate all Scorer objects which should be used for note ranking.

  Args:
    seed (int, optional): if not None, base distinct seeds for the first and second MF rounds on this value
    pseudoraters (bool, optional): if True, compute optional pseudorater confidence intervals

  Returns:
    Dict[Scorers, List[Scorer]] containing instantiated Scorer objects for note ranking.
  
sourcecode/scoring/run_scoring.py