173 lines
5 KiB
Go
173 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
|
||
|
}
|
||
|
|