func buildSkillFactors(ts Config, players Players, draws []bool, varBag *collection.DistributionBag) (skillFactors, []int, factor.List) { sf := skillFactors{} gf := factor.NewGaussianFactors() factorList := factor.NewList() numPlayers := players.Len() skillIndex := []int{} for i := 0; i < numPlayers; i++ { skillIndex = append(skillIndex, varBag.NextIndex()) } for i := 0; i < numPlayers; i++ { priorSkill := players[i] gpf := gf.GaussianPrior(priorSkill.Mean(), priorSkill.Variance()+(ts.Tau*ts.Tau), skillIndex[i], varBag) sf.skillPriorFactors = append(sf.skillPriorFactors, gpf) factorList.Add(gpf) } for i := 0; i < numPlayers; i++ { sf.playerPerformances = append(sf.playerPerformances, varBag.NextIndex()) } for i := 0; i < numPlayers; i++ { glf := gf.GaussianLikeliehood(ts.Beta*ts.Beta, sf.playerPerformances[i], skillIndex[i], varBag, varBag) sf.skillToPerformanceFactors = append(sf.skillToPerformanceFactors, glf) factorList.Add(glf) } for i := 0; i < numPlayers-1; i++ { sf.playerPerformanceDifferences = append(sf.playerPerformanceDifferences, varBag.NextIndex()) } for i := 0; i < numPlayers-1; i++ { gws := gf.GaussianWeightedSum(1.0, -1.0, sf.playerPerformanceDifferences[i], sf.playerPerformances[i], sf.playerPerformances[i+1], varBag, varBag, varBag) sf.performanceToPerformanceDifferencFactors = append(sf.performanceToPerformanceDifferencFactors, gws) factorList.Add(gws) } // TODO: Calculate e (epsilon) separately for each epsilon := drawMargin(ts.Beta, ts.DrawProb) for i, draw := range draws { var f factor.Factor if draw { f = gf.GaussianWithin(epsilon, sf.playerPerformanceDifferences[i], varBag) } else { f = gf.GaussianGreaterThan(epsilon, sf.playerPerformanceDifferences[i], varBag) } sf.greatherThanOrWithinFactors = append(sf.greatherThanOrWithinFactors, f) factorList.Add(f) } return sf, skillIndex, factorList }