seekia/resources/trainedPredictionModels/trainedPredictionModels_test.go

172 lines
5 KiB
Go

package trainedPredictionModels_test
import "seekia/resources/trainedPredictionModels"
import "testing"
import "seekia/resources/geneticReferences/polygenicDiseases"
import "seekia/resources/geneticReferences/traits"
import "seekia/internal/genetics/locusValue"
import "seekia/internal/helpers"
import "errors"
func TestTrainedPredictionModels(t *testing.T){
err := polygenicDiseases.InitializePolygenicDiseaseVariables()
if (err != nil) {
t.Fatalf("InitializePolygenicDiseaseVariables failed: " + err.Error())
}
err = traits.InitializeTraitVariables()
if (err != nil) {
t.Fatalf("InitializeTraitVariables failed: " + err.Error())
}
err = trainedPredictionModels.InitializeTrainedPredictionModels()
if (err != nil){
t.Fatalf("InitializeTrainedPredictionModels failed: " + err.Error())
}
for i:=0; i < 10; i++{
discreteTraitNamesList := []string{"Eye Color", "Lactose Tolerance"}
for _, traitName := range discreteTraitNamesList{
modelExists := trainedPredictionModels.CheckIfAttributeNeuralNetworkExists(traitName)
if (modelExists == false){
t.Fatalf("Prediction model not found: " + traitName)
}
traitObject, err := traits.GetTraitObject(traitName)
if (err != nil) {
t.Fatalf("GetTraitObject failed: " + err.Error())
}
traitLociList := traitObject.LociList
testGenomeMap, err := getFakeGenomeMap(traitLociList)
if (err != nil){
t.Fatalf("getFakeGenomeMap failed: " + err.Error())
}
neuralNetworkExists, predictionIsPossible, _, _, _, _, err := trainedPredictionModels.GetNeuralNetworkDiscreteTraitPredictionFromGenomeMap(traitName, traitLociList, testGenomeMap)
if (err != nil){
t.Fatalf("GetNeuralNetworkDiscreteTraitPredictionFromGenomeMap failed: " + err.Error())
}
if (neuralNetworkExists == false){
t.Fatalf("GetNeuralNetworkDiscreteTraitPredictionFromGenomeMap claims that neural network doesn't exist for trait: " + traitName)
}
if (predictionIsPossible == false){
t.Fatalf("GetNeuralNetworkDiscreteTraitPredictionFromGenomeMap claims that prediction isn't possible.")
}
}
numericAttributeNamesList := []string{"Height", "Autism", "Obesity", "Homosexualness"}
for _, attributeName := range numericAttributeNamesList{
modelExists := trainedPredictionModels.CheckIfAttributeNeuralNetworkExists(attributeName)
if (modelExists == false){
t.Fatalf("Prediction model not found: " + attributeName)
}
getAttributeLociList := func()([]int64, error){
switch attributeName{
case "Homosexualness",
"Height":{
traitObject, err := traits.GetTraitObject(attributeName)
if (err != nil) {
t.Fatalf("GetTraitObject failed: " + attributeName)
}
traitLociList := traitObject.LociList
return traitLociList, nil
}
case "Obesity",
"Autism":{
diseaseObject, err := polygenicDiseases.GetPolygenicDiseaseObject(attributeName)
if (err != nil){
t.Fatalf("GetPolygenicDiesaseObject failed: " + err.Error())
}
diseaseLociList := diseaseObject.LociList
return diseaseLociList, nil
}
}
return nil, errors.New("Unknown attributeName: " + attributeName)
}
attributeLociList, err := getAttributeLociList()
if (err != nil){
t.Fatalf(err.Error())
}
testGenomeMap, err := getFakeGenomeMap(attributeLociList)
if (err != nil){
t.Fatalf("getFakeGenomeMap failed: " + err.Error())
}
neuralNetworkExists, predictionIsPossible, _, _, _, _, err := trainedPredictionModels.GetNeuralNetworkNumericAttributePredictionFromGenomeMap(attributeName, attributeLociList, testGenomeMap)
if (err != nil){
t.Fatalf("GetNeuralNetworkNumericAttributePredictionFromGenomeMap failed: " + err.Error())
}
if (neuralNetworkExists == false){
t.Fatalf("GetNeuralNetworkNumericAttributePredictionFromGenomeMap claims that neural network doesn't exist for attribute: " + attributeName)
}
if (predictionIsPossible == false){
t.Fatalf("GetNeuralNetworkNumericAttributePredictionFromGenomeMap claims that prediction isn't possible.")
}
}
}
}
func getFakeGenomeMap(lociList []int64)(map[int64]locusValue.LocusValue, error){
// We create a fake genome map
testGenomeMap := make(map[int64]locusValue.LocusValue)
for index, rsID := range lociList{
if (index != 0){
// We always include the first locus
// We will include approximately 80% of the locations in the genome
includeLocusBool, err := helpers.GetRandomBoolWithProbability(0.8)
if (err != nil){ return nil, err }
if (includeLocusBool == false){
continue
}
}
locusIsPhasedBool := helpers.GetRandomBool()
randomAllele1, err := helpers.GetRandomItemFromList([]string{"C", "A", "T", "G", "I", "D"})
if (err != nil){ return nil, err }
randomAllele2, err := helpers.GetRandomItemFromList([]string{"C", "A", "T", "G", "I", "D"})
if (err != nil){ return nil, err }
newLocusValue := locusValue.LocusValue{
Base1Value: randomAllele1,
Base2Value: randomAllele2,
LocusIsPhased: locusIsPhasedBool,
}
testGenomeMap[rsID] = newLocusValue
}
return testGenomeMap, nil
}