Add phylogenetic tree and better cost computation

This commit is contained in:
Dimitri Lozeve 2020-02-21 20:45:16 +01:00
parent d3513c008a
commit c117b9cccb
5 changed files with 888 additions and 12 deletions

View file

@ -5,9 +5,12 @@ version = "0.1.0"
[deps]
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0"
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
Logging = "56ddb016-857b-54e1-b83d-db4d58db5568"
Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
[compat]
julia = "1"

62
data/associations.csv Normal file
View file

@ -0,0 +1,62 @@
name,Liliaceae,Ail,Asperge,Ciboulette,Echalote,Oignon,Poireau,Fabaceae,Fève,Haricot,Pois,Apiaceae,Aneth,Carotte,Celeri,Cerfeuil,Fenouil,Panais,Persil,Solanaceae,Aubergine,Poivron,Pomme de terre,Tomate,Brassicaceae,Chou,Chou rave,Chou rouge,Navet,Radis,Cucurbitaceae,Concombre,Cornichon,Courge,Courgette,Melon,Potiron,Artichaut,Basilic,Bette,Betterave,Bourrache,Capucine,Cardon,Chicoree,Cresson,Epinard,Estragon,Fraisier,Laitue,Mâche,Maïs,Menthe,Oeillet d'inde,Sarriette,Sauge,Scorsonère,Souci,Tétragone,Thym,Tournesol
Liliaceae,,,,,,,,-2,,,,1,,,,,,,,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Ail,,,-1,,,1,,-2,,-2,-2,,,1,,,,,,,,,1,1,,-1,,,1,,,1,,,,,,,,,1,,,,,,1,,1,1,1,,,,,,,1,,,
Asperge,,-1,,,-1,-1,1,,0,1,0,,,,,,,,1,,,,,1,,-1,,,,,,1,1,,,,,1,,-1,,,,,,,,,,,,,,,,,,,,,
Ciboulette,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,1,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,
Echalote,,,-1,,,-1,,,,,-2,,,,,,,,,,,,,,,,,,,,,,,1,1,,,,,,,,,,,,,,1,,,,,,,,,,,,
Oignon,,1,-1,,-1,,-1,-2,-2,-2,-2,,1,1,,,,1,,,-1,1,,1,,-1,,,,,,1,1,1,1,,,1,,1,1,,,,1,,,,1,1,,,,,,,1,1,,,
Poireau,,,1,,,-1,,-2,-2,-2,-2,,,2,1,,1,,,,,,,1,,,,,,,,,,,,1,,,,-1,,,,,,,1,,1,1,,,,,,,1,1,,,
Fabaceae,-2,-2,,,,-2,-2,,,,,,,,,,,,,,,,1,,1,,,,,,1,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,
Feve,,,0,,,-2,-2,,,,,,,,,,,1,,,,,1,1,,,,,,,,,,1,,,,,,,,,,1,,,,,1,,,,,,,,,,,,
Haricot,,-2,1,,,-2,-2,,,0.8,-1,,,1,1,,,1,,,1,,1,,,1,,,,1,,1,1,1,1,1,,,,1,1,1,,,1,,1,,1,1,1,2,,,,,,,1,,
Pois,,-2,0,,-2,-2,-2,,,-1,0.8,,,1,1,,,,,,1,,1,-1,,1,,,1,1,,1,1,1,1,1,,0,,,,,,,1,,1,,,1,1,,,,,,,,,,
Apiaceae,1,,,,,,,,,,,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Aneth,,,,,,1,,,,,,,,1,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,1,,,,,1,,,,,,,,,,,
Carotte,,1,,1,,1,2,,,1,1,,1,,,,,,,,,1,,1,,1,,,,1,,,,,,,,,,1,-1,,,,1,,1,,,1,,,-1,,,,1,,,,
Celeri,,,,,,,1,,,1,1,,,,,,1,,,,,,,1,,1,,,1,,,,,,,,,,,1,,,,,,,,,,,,-1,,,,,,,,,
Cerfeuil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-1,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,
Fenouil,,,,,,,1,,,,,,,,1,,,,,,,-1,,-1,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Panais,,,,,,1,,,1,1,,,,,,,,,,,,,,1,,1,,,,1,,,,,,,,,,,,,,,,,,,,-1,,,,,,,,,,,
Persil,,,1,,,,,,,,,,,,,,,,,,1,,,1,,,,,,,,,,,,,,,,,,,,,-1,,,,1,-1,,,,,,,,,,,
Solanaceae,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Aubergine,,,,,,-1,,,,1,1,,,,,,,,1,,,1,-1,1,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,1,
Poivron,,,,,,1,,,,,,,,1,,,-1,,,,1,,,1,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,
Pomme de terre,,1,,,,,,1,1,1,1,,,,,,,,,,-1,,,-1,,,,,,-1,,,,,-1,,,,,,,,1,,,,,,,,,1,,,,,,1,,,
Tomate,,1,1,,,1,1,,1,,-1,,,1,1,,-1,1,1,,1,1,-1,0.8,,1,,-1,,1,,,,,,,,,2,,-1,,,,,,1,,,1,,1,,2,,,,1,1,,
Brassicaceae,,,,,,,,1,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Chou,,-1,-1,,,-1,,,,1,1,,,1,1,,,1,,,,,,1,,-1,,,,,,1,1,,,,,1,,,1,,1,,1,,1,,-1,1,-1,,,1,1,,,,,,
Chou rave,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,1,,,,
Chou rouge,,,,,,,,,,,,,,,,,,,,,,,,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Navet,,1,,1,,,,,,,1,,,,1,,1,,,,,,,,,,,,,-1,,,,,,,,,,1,,,,,,,1,,,,,,,,,,,,,,
Radis,,,,,,,,,,1,1,,,1,,-1,,1,,,,,-1,1,,,,,-1,,,-1,-1,,,,,1,,1,1,,1,1,,1,1,,,1,1,,,,,,1,,,,
Cucurbitaceae,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Concombre,,1,1,,,1,,,,1,1,,1,,,,,,,,,,,,,1,,,,-1,,0.8,,-1,-1,-1,,,1,,,,1,,1,,,,,1,,1,,1,,,,,,,
Cornichon,,,1,,,1,,,,1,1,,,,,,,,,,,,,,,1,,,,-1,,,0.8,-1,-1,-1,,,1,,,,1,,1,,,,,1,,1,,1,,,,,,,
Courge,,,,1,1,1,,,1,1,1,,,,,,,,,,,,,,,,,,,,,-1,-1,0.8,,,,,,,,,1,,,,,,,,,1,,,,,,,,,
Courgette,,,,1,1,1,,,,1,1,,,,,,,,,,,,-1,,,,,,,,,-1,-1,,0.8,,,,,,,,,,,,,,,,,,,,,,,,1,,
Melon,,,,,,,1,,,1,1,,,,,,,,,,,,,,,,,,,,,-1,-1,,,0.8,1,,,,,,1,,,,,,,1,,1,,,,,,,,,1
Potiron,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,
Artichaut,,,1,,,1,,1,,,0,,,,,,,,,,,,,,,1,,,,1,,,,,,,,,,,,,1,,,,,,,1,,,,,,,,,,,
Basilic,,,,,,,,,,,,,,,,,,,,,,1,,2,,,,,,,,1,1,,,,,,,,,,,,,,,,,,1,,,,,,,,,,
Bette,,,-1,,,1,-1,,,1,,,,1,1,,,,,,,,,,,,1,,1,1,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,
Betterave,,1,,,,1,,,,1,,,,-1,,,,,,,,,,-1,,1,,,,1,,,,,,,,,,,,,,,1,,-1,,,1,,-1,,,,,,,,,
Bourrache,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,
Capucine,,,,,,,,,,,,,,,,,,,,,,,1,,,1,,,,1,,1,1,1,,1,,1,,,,,,,,,,,1,,,,,,,,,,,,
Cardon,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Chicorée,,,,,,1,,,,1,1,,1,1,,,,,-1,,,,,,,1,,,,,,1,1,,,,,,,,1,,,,,,1,,,,-1,,,,,,,1,,,-1
Cresson,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Epinard,,1,,,,,1,,,1,1,,,1,,,,,,,,,,1,,1,,,1,1,,,,,,,,,,,-1,,,,1,,,,1,1,-1,,,,,,,,,,
Estragon,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Fraisier,,1,,,1,1,1,,1,1,,,,,,,,,1,,,,,,,-1,,,,,,,,,,,,,,,,1,1,,,,1,,,1,,,,,,1,,,,,
Laitue,,1,,,,1,1,,,1,1,,1,1,,1,,-1,-1,,,,,1,,1,,,,1,,1,1,,,1,,1,,1,1,,,,,,1,,1,1,,,,,,,1,,,,-1
Mâche,,1,,,,,,,,1,1,,,,,,,,,,,,,,,-1,,,,1,,,,,,,,,1,,,,,,-1,,-1,,,,,,,,,,,,,,
Maïs,,,,,,,,,,2,,,,,-1,,,,,,,,1,1,,,,,,,,1,1,1,,1,,,,,-1,,,,,,,,,,,,,,,,,,,,
Menthe,,,,,,,,,,,,,,-1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Oeillet d'inde,,,,,,,,,,,,,,,,,,,,,,,,2,,1,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Sarriette,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Sauge,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,
Scorsonère,,,,,,1,1,,,,,,,1,,,,,,,,,,,,,1,,,1,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,
Souci,,1,,,,1,1,,,,,,,,,,,,,,,,1,1,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,
Tétragone,,,,,,,,,,1,,,,,,,,,,,,,,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,
Thym,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Tournesol,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,-1,,,,,-1,,,,,,,,,,,
1 name Liliaceae Ail Asperge Ciboulette Echalote Oignon Poireau Fabaceae Fève Haricot Pois Apiaceae Aneth Carotte Celeri Cerfeuil Fenouil Panais Persil Solanaceae Aubergine Poivron Pomme de terre Tomate Brassicaceae Chou Chou rave Chou rouge Navet Radis Cucurbitaceae Concombre Cornichon Courge Courgette Melon Potiron Artichaut Basilic Bette Betterave Bourrache Capucine Cardon Chicoree Cresson Epinard Estragon Fraisier Laitue Mâche Maïs Menthe Oeillet d'inde Sarriette Sauge Scorsonère Souci Tétragone Thym Tournesol
2 Liliaceae -2 1 -1
3 Ail -1 1 -2 -2 -2 1 1 1 -1 1 1 1 1 1 1 1 1
4 Asperge -1 -1 -1 1 0 1 0 1 1 -1 1 1 1 -1
5 Ciboulette 1 1 1 1
6 Echalote -1 -1 -2 1 1 1
7 Oignon 1 -1 -1 -1 -2 -2 -2 -2 1 1 1 -1 1 1 -1 1 1 1 1 1 1 1 1 1 1 1 1
8 Poireau 1 -1 -2 -2 -2 -2 2 1 1 1 1 -1 1 1 1 1 1
9 Fabaceae -2 -2 -2 -2 1 1 1 1
10 Feve 0 -2 -2 1 1 1 1 1 1
11 Haricot -2 1 -2 -2 0.8 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
12 Pois -2 0 -2 -2 -2 -1 0.8 1 1 1 1 -1 1 1 1 1 1 1 1 1 0 1 1 1 1
13 Apiaceae 1 1 1
14 Aneth 1 1 1 1 1
15 Carotte 1 1 1 2 1 1 1 1 1 1 1 1 -1 1 1 1 -1 1
16 Celeri 1 1 1 1 1 1 1 1 -1
17 Cerfeuil -1 1
18 Fenouil 1 1 -1 -1 1
19 Panais 1 1 1 1 1 1 -1
20 Persil 1 1 1 -1 1 -1
21 Solanaceae -1
22 Aubergine -1 1 1 1 1 -1 1 1 1
23 Poivron 1 1 -1 1 1 1
24 Pomme de terre 1 1 1 1 1 -1 -1 -1 -1 1 1 1
25 Tomate 1 1 1 1 1 -1 1 1 -1 1 1 1 1 -1 0.8 1 -1 1 2 -1 1 1 1 2 1 1
26 Brassicaceae 1 1
27 Chou -1 -1 -1 1 1 1 1 1 1 -1 1 1 1 1 1 1 1 -1 1 -1 1 1
28 Chou rave 1 1
29 Chou rouge -1
30 Navet 1 1 1 1 1 -1 1 1
31 Radis 1 1 1 -1 1 -1 1 -1 -1 -1 1 1 1 1 1 1 1 1 1 1
32 Cucurbitaceae 1
33 Concombre 1 1 1 1 1 1 1 -1 0.8 -1 -1 -1 1 1 1 1 1 1
34 Cornichon 1 1 1 1 1 -1 0.8 -1 -1 -1 1 1 1 1 1 1
35 Courge 1 1 1 1 1 1 -1 -1 0.8 1 1
36 Courgette 1 1 1 1 1 -1 -1 -1 0.8 1
37 Melon 1 1 1 -1 -1 0.8 1 1 1 1 1
38 Potiron 1
39 Artichaut 1 1 1 0 1 1 1 1
40 Basilic 1 2 1 1 1
41 Bette -1 1 -1 1 1 1 1 1 1 1
42 Betterave 1 1 1 -1 -1 1 1 1 -1 1 -1
43 Bourrache 1 1
44 Capucine 1 1 1 1 1 1 1 1 1
45 Cardon 1 1
46 Chicorée 1 1 1 1 1 -1 1 1 1 1 1 -1 1 -1
47 Cresson 1
48 Epinard 1 1 1 1 1 1 1 1 1 -1 1 1 1 -1
49 Estragon 1
50 Fraisier 1 1 1 1 1 1 1 -1 1 1 1 1 1
51 Laitue 1 1 1 1 1 1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1
52 Mâche 1 1 1 -1 1 1 -1 -1
53 Maïs 2 -1 1 1 1 1 1 1 -1
54 Menthe -1
55 Oeillet d'inde 2 1 1 1
56 Sarriette 1
57 Sauge 1
58 Scorsonère 1 1 1 1 1 1
59 Souci 1 1 1 1 1 1
60 Tétragone 1 1 1
61 Thym 1
62 Tournesol 1 -1 -1

666
data/classification.json Normal file
View file

@ -0,0 +1,666 @@
{
"name": "God",
"type": "Life",
"children": [
{
"name": "Aizoaceae",
"type": "Family",
"children": [
{
"name": "Tetragonia",
"type": "Genus",
"children": [
{
"name": "Tetragone",
"bio": "Tetragonia tetragonioides",
"type": "Species"
}
]
}
]
},
{
"name": "Apiaceae",
"type": "Family",
"children": [
{
"name": "Anethum",
"type": "Genus",
"children": [
{
"name": "Aneth",
"type": "Species"
}
]
},
{
"name": "Anthriscus",
"type": "Genus",
"children": [
{
"name": "Cerfeuil",
"type": "Species"
}
]
},
{
"name": "Apium",
"type": "Genus",
"children": [
{
"name": "Celeri",
"type": "Species"
}
]
},
{
"name": "Coriandrum",
"type": "Genus",
"children": [
{
"name": "Coriandre",
"type": "Species"
}
]
},
{
"name": "Daucus",
"type": "Genus",
"children": [
{
"name": "Carotte",
"type": "Species"
}
]
},
{
"name": "Foeniculum",
"type": "Genus",
"children": [
{
"name": "Fenouil",
"type": "Species"
}
]
},
{
"name": "Pastinaca",
"type": "Genus",
"children": [
{
"name": "Panais",
"type": "Species"
}
]
},
{
"name": "Petroselinum",
"type": "Genus",
"children": [
{
"name": "Persil",
"type": "Species"
}
]
}
]
},
{
"name": "Asteraceae",
"type": "Family",
"children": [
{
"name": "Artemisia",
"type": "Genus",
"children": [
{
"name": "Estragon",
"bio": "Artemisia dracunculus",
"type": "Species"
}
]
},
{
"name": "Calendula",
"type": "Genus",
"children": [
{
"name": "Souci",
"bio": "Calendula officinalis",
"type": "Species"
}
]
},
{
"name": "Chicoree",
"bio": "Cichorium",
"type": "Genus"
},
{
"name": "Cynara",
"type": "Genus",
"children": [
{
"name": "Cardon",
"bio": "Cynara cardunculus",
"type": "Species",
"children": [
{
"name": "Artichaut",
"type": "Variety"
}
]
}
]
},
{
"name": "Helianthus",
"type": "Genus",
"children": [
{
"name": "Tournesol",
"bio": "Helianthus annuus",
"type": "Species"
}
]
},
{
"name": "Lactuca",
"type": "Genus",
"children": [
{
"name": "Laitue",
"bio": "Lactuca sativa",
"type": "Species",
"children": [
{
"name": "Batavia",
"type": "Variety"
}
]
}
]
},
{
"name": "Scorsonere",
"bio": "Scorzonera",
"type": "Genus"
},
{
"name": "Tagetes",
"type": "Genus",
"children": [
{
"name": "Oeillet d'inde",
"bio": "Tagetes patula",
"type": "Species"
}
]
}
]
},
{
"name": "Boraginaceae",
"type": "Family",
"children": [
{
"name": "Borago",
"type": "Genus",
"chlidren": [
{
"name": "Bourrache",
"bio": "Borago officinalis",
"type": "Species"
}
]
}
]
},
{
"name": "Brassicaceae",
"type": "Family",
"children": [
{
"name": "Brassica",
"type": "Genus",
"children": [
{
"name": "Chou",
"bio": "Brassica oleracea",
"type": "Species",
"children": [
{
"name": "Brocoli",
"type": "Variety"
},
{
"name": "Chou cabus",
"type": "Variety"
}
]
},
{
"name": "Brassica rapa",
"type": "Species",
"children": [
{
"name": "Navet",
"type": "Variety"
}
]
}
]
},
{
"name": "Eruca",
"type": "Genus",
"children": [
{
"name": "Roquette",
"bio": "Eruca sativa",
"type": "Species"
}
]
},
{
"name": "Nasturtium",
"type": "Genus",
"children": [
{
"name": "Cresson",
"bio": "Nasturtium officinale",
"type": "Species"
}
]
},
{
"name": "Raphanus",
"type": "Genus",
"children": [
{
"name": "Radis",
"type": "Species"
}
]
},
{
"name": "Sinapis",
"type": "Genus",
"children": [
{
"name": "Moutarde",
"bio": "Sinapis alba",
"type": "Species"
}
]
}
]
},
{
"name": "Chenopodiaceae",
"type": "Family",
"children": [
{
"name": "Atriplex",
"type": "Genus",
"children": [
{
"name": "Arroche",
"bio": "Atriplex hortensis",
"type": "Species"
}
]
},
{
"name": "Beta",
"type": "Genus",
"children": [
{
"name": "Beta vulgaris",
"type": "Species",
"children": [
{
"name": "Bette",
"type": "Variety"
},
{
"name": "Betterave",
"type": "Variety"
}
]
}
]
},
{
"name": "Spinacia",
"type": "Genus",
"children": [
{
"name": "Epinard",
"type": "Species"
}
]
}
]
},
{
"name": "Cucurbitaceae",
"type": "Family",
"children": [
{
"name": "Cucumis",
"type": "Genus",
"children": [
{
"name": "Melon",
"bio": "Cucumis melo",
"type": "Species"
},
{
"name": "Cucumis sativus",
"type": "Species",
"children": [
{
"name": "Concombre",
"type": "Variety"
},
{
"name": "Cornichon",
"type": "Variety"
}
]
}
]
},
{
"name": "Courge",
"bio": "Cucurbita",
"type": "Genus",
"children": [
{
"name": "Potiron",
"bio": "Cucurbita maxima",
"type": "Species",
"children": [
{
"name": "Potimarron",
"type": "Variety"
}
]
},
{
"name": "Courge musquée",
"bio": "Cucurbita moschata",
"type": "Species",
"children": [
{
"name": "Butternut",
"type": "Variety"
}
]
},
{
"name": "Cucurbita pepo",
"type": "Species",
"children": [
{
"name": "Courgette",
"type": "Variety"
},
{
"name": "Patisson",
"bio": "Ovifera",
"type": "Variety"
}
]
}
]
}
]
},
{
"name": "Fabaceae",
"type": "Family",
"children": [
{
"name": "Phaseolus",
"type": "Genus",
"children": [
{
"name": "Haricot",
"type": "Species"
}
]
},
{
"name": "Pisum",
"type": "Genus",
"children": [
{
"name": "Pois",
"type": "Species"
}
]
},
{
"name": "Vicia",
"type": "Genus",
"children": [
{
"name": "Fève",
"type": "Species"
}
]
}
]
},
{
"name": "Lamiaceae",
"type": "Family",
"children": [
{
"name": "Lavande",
"bio": "Lavandula",
"type": "Genus"
},
{
"name": "Menthe",
"bio": "Mentha",
"type": "Genus"
},
{
"name": "Ocimum",
"type": "Genus",
"children": [
{
"name": "Basilic",
"type": "Species"
}
]
},
{
"name": "Salvia",
"type": "Genus",
"children": [
{
"name": "Sauge",
"bio": "Salvia officinalis",
"type": "Species"
}
]
},
{
"name": "Sarriette",
"bio": "Satureja",
"type": "Genus"
},
{
"name": "Thym",
"bio": "Thymus",
"type": "Genus"
}
]
},
{
"name": "Liliaceae",
"type": "Family",
"children": [
{
"name": "Allium",
"type": "Genus",
"children": [
{
"name": "Ail",
"type": "Species"
},
{
"name": "Allium cepa",
"type": "Species",
"children": [
{
"name": "Echalote",
"type": "Variety"
},
{
"name": "Oignon",
"type": "Variety",
"children": [
{
"name": "Oignon blanc",
"type": "Variety"
}
]
}
]
},
{
"name": "Ciboulette",
"type": "Species"
},
{
"name": "Poireau",
"type": "Species"
}
]
},
{
"name": "Asparagus",
"type": "Genus",
"children": [
{
"name": "Asperge",
"type": "Species"
}
]
}
]
},
{
"name": "Poaceae",
"type": "Family",
"children": [
{
"name": "Zea",
"type": "Genus",
"children": [
{
"name": "Mais",
"bio": "Zea mays",
"type": "Species"
}
]
}
]
},
{
"name": "Rosaceae",
"type": "Family",
"children": [
{
"name": "Fraisier",
"bio": "Fragaria",
"type": "Genus"
}
]
},
{
"name": "Solanaceae",
"type": "Family",
"children": [
{
"name": "Capsicum",
"type": "Genus",
"children": [
{
"name": "Poivron",
"type": "Species"
}
]
},
{
"name": "Solanum",
"type": "Genus",
"children": [
{
"name": "Aubergine",
"type": "Species"
},
{
"name": "Pomme de terre",
"type": "Species"
},
{
"name": "Tomate",
"type": "Species"
}
]
}
]
},
{
"name": "Tropaeolaceae",
"type": "Family",
"children": [
{
"name": "Tropaeolum",
"type": "Genus",
"children": [
{
"name": "Capucine",
"bio": "Tropaeolum majus",
"type": "Species"
}
]
}
]
},
{
"name": "Valerianaceae",
"type": "Family",
"children": [
{
"name": "Valerianella",
"type": "Genus",
"children": [
{
"name": "Mâche",
"bio": "Valerianella locusta",
"type": "Species"
}
]
}
]
},
{
"name": "Vitaceae",
"type": "Family",
"children": [
{
"name": "Vigne",
"bio": "Vitis",
"type": "Genus"
}
]
}
]
}

59
data/plants.csv Normal file
View file

@ -0,0 +1,59 @@
name,count
agretti,2
ail,0
aneth,2
arroche,2
artichaut,0
asperge,0
aubergine,0
basilic,2
bette,3
betterave,3
capucine,0
cardon,12
carotte,6
celeri,3
cerfeuil,0
chicoree,3
chou rave,0
chou rouge,0
chou,6
ciboulette,0
concombre,9
coriandre,2
cornichon,0
courgette,16
cresson,0
cucurbita,0
echalote,0
epinard,0
fenouil,3
feve,0
fraisier,0
haricot,19
laitue,12
lavande,0
mais,6
melon,0
menthe,0
navet,6
oeillet d'inde,2
oignon blanc,3
oignon,12
panais,6
patisson,5
persil,3
poireau,12
pois,12
poivron,0
pomme de terre,0
radis,6
roquette,2
sarriette,2
sauge,0
scorsonere,3
souci,2
tomate,19
tournesol,2
tetragone,3
vigne,0
1 name count
2 agretti 2
3 ail 0
4 aneth 2
5 arroche 2
6 artichaut 0
7 asperge 0
8 aubergine 0
9 basilic 2
10 bette 3
11 betterave 3
12 capucine 0
13 cardon 12
14 carotte 6
15 celeri 3
16 cerfeuil 0
17 chicoree 3
18 chou rave 0
19 chou rouge 0
20 chou 6
21 ciboulette 0
22 concombre 9
23 coriandre 2
24 cornichon 0
25 courgette 16
26 cresson 0
27 cucurbita 0
28 echalote 0
29 epinard 0
30 fenouil 3
31 feve 0
32 fraisier 0
33 haricot 19
34 laitue 12
35 lavande 0
36 mais 6
37 melon 0
38 menthe 0
39 navet 6
40 oeillet d'inde 2
41 oignon blanc 3
42 oignon 12
43 panais 6
44 patisson 5
45 persil 3
46 poireau 12
47 pois 12
48 poivron 0
49 pomme de terre 0
50 radis 6
51 roquette 2
52 sarriette 2
53 sauge 0
54 scorsonere 3
55 souci 2
56 tomate 19
57 tournesol 2
58 tetragone 3
59 vigne 0

View file

@ -1,11 +1,16 @@
module GardenOptim
using DocStringExtensions
using Logging
using Unicode
using DataFrames
using DocStringExtensions
using CSV
using JSON
using Tables
export loadplants, loadgarden, loadcosts, update!, randomgardenevolution!, outputgarden
export loadclassification, loadplants, loadgarden, loadcosts
export update!, randomgardenevolution!, outputgarden
@template (FUNCTIONS, METHODS, MACROS) =
"""
@ -13,9 +18,36 @@ export loadplants, loadgarden, loadcosts, update!, randomgardenevolution!, outpu
$(DOCSTRING)
"""
function loadplants()::Vector{String}
plants = readlines("data/plants.txt")
@info "loaded $(length(plants)) plants"
mutable struct Classification
type::Symbol
name::Symbol
bio::String
children::Vector{Classification}
parent::Classification
function Classification(classif::Dict{String, Any})
children = [Classification(d) for d in get(classif, "children", [])]
type = Symbol(Unicode.normalize(classif["type"], casefold=true, stripmark=true))
name = Symbol(Unicode.normalize(classif["name"], casefold=true, stripmark=true))
classif = new(type, name, get(classif, "bio", ""), children)
for child in children
child.parent = classif
end
classif
end
end
function loadclassification()
clf = JSON.parsefile("data/classification.json")
clf = Classification(clf)
@debug "loaded classification of type $(clf.type)"
clf
end
function loadplants()::DataFrame
plants = CSV.read("data/plants.csv")
@info "loaded $(size(plants, 1)) plants"
plants.name = Symbol.(plants.name)
plants
end
@ -30,13 +62,67 @@ function loadgarden(plants::Vector{String})::Tuple{Matrix{Int}, Matrix{Bool}}
garden, mask
end
function loadcosts()::Matrix{Float64}
df = CSV.read("data/costs.csv")
df = coalesce.(df, 0) # replace missing values by 0
costs = convert(Matrix, df[:, 2:end])
@info "loaded cost matrix of size $(size(costs))"
# ensure the matrix is symmetric: keep the max of itself and its transpose
costs = Float64.(max.(costs, permutedims(costs)))
function loadcosts()::DataFrame
df = CSV.read("data/associations.csv", copycols=true)
colnames = String.(names(df))
colnames = Symbol.(Unicode.normalize.(colnames, casefold=true, stripmark=true))
rename!(df, colnames)
df.name = colnames[2:end]
# df = coalesce.(df, 0.0)
@info "loaded cost matrix for $(size(df, 1)) plants"
df
end
# function loadcosts()::Matrix{Float64}
# df = CSV.read("data/costs.csv")
# df = coalesce.(df, 0) # replace missing values by 0
# costs = convert(Matrix, df[:, 2:end])
# @info "loaded cost matrix of size $(size(costs))"
# # ensure the matrix is symmetric: keep the max of itself and its transpose
# costs = Float64.(max.(costs, permutedims(costs)))
# end
function getparent(name::Symbol, classification::Classification)
if classification.name == name
return classification.parent
else
for child in classification.children
parent = getparent(name, child)
if !isnothing(parent)
return parent
end
end
end
end
function computecost(costs::DataFrame, plant1::Symbol, plant2::Symbol, classification::Classification)::Float64
@debug "$plant1 and $plant2"
if plant1 in names(costs) && plant2 in names(costs)
cost = costs[costs.name .== plant1, plant2][1]
else
@debug "$plant1 and $plant2 not in costs"
cost = missing
end
if !ismissing(cost)
return cost
end
@debug "missing"
try
parent1 = getparent(plant1, classification).name
computecost(costs, parent1, plant2, classification)
catch UndefRefError
return missing
end
try
parent2 = getparent(plant2, classification).name
computecost(costs, plant1, parent2, classification)
catch UndefRefError
return missing
end
end
"Return a random index to be filled from the garden mask."