From 20c9f4345bafb2a6b88ab7f8babaf0ddab1792c2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 27 Dec 2021 17:49:10 +0100 Subject: [PATCH 01/57] add first example --- notebook/TribalWars_BatlleOptimizer.jl | 245 +++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 notebook/TribalWars_BatlleOptimizer.jl diff --git a/notebook/TribalWars_BatlleOptimizer.jl b/notebook/TribalWars_BatlleOptimizer.jl new file mode 100644 index 00000000..ccda5f99 --- /dev/null +++ b/notebook/TribalWars_BatlleOptimizer.jl @@ -0,0 +1,245 @@ +### A Pluto.jl notebook ### +# v0.17.1 + +using Markdown +using InteractiveUtils + +# ╔═╡ 476385f0-66f8-11ec-0f51-5930b44e312e +md"# Optimizing Attacks in Tribal Wars using MAP-Elites" + +# ╔═╡ 66906f53-c68c-4236-b471-fc1b0d2a84dc +md"""## Introduction +Objective = lose as less population as possible + +Constraints = amount of population + +Axis = amount of units, percentage footsoldiers +""" + +# ╔═╡ 090f2dda-fe30-4419-9430-2092a4313a41 +md"## The Battle System" + +# ╔═╡ 9b061489-8116-4714-8f47-c0c7a3264581 + + +# ╔═╡ 1a888ee1-310b-4f28-b532-9f03ab4387e6 +md"## MAP-Elites" + +# ╔═╡ 9162a984-075c-4fab-b0f5-c58525a63aa9 +md"### Generating The Archive" + +# ╔═╡ 434b6b98-ef07-4953-bf74-f164d6846b87 +md"### Making New Combinations" + +# ╔═╡ f16ada76-41d3-40ac-b61a-4fb46df6de1c +md"### Optimizing The Army" + +# ╔═╡ 104fa247-08a6-4317-8ee3-467d75455879 +md"""## Function Corner +🏹 Do not touch this young warrior, or you will take an arrow to the knee! 🏹 +""" + +# ╔═╡ 71302c52-3c3f-4398-811d-b0dde5d166e9 +begin + # introduce the general type + abstract type Unit end + + # add the foot units + abstract type Footunit <: Unit end + + struct Spear <: Footunit + numUnits::Int64 + att::Int64 + defGeneral::Int64 + defHorse::Int64 + defArcher::Int64 + materialCost::Vector{Int64} + populationCost::Int64 + end + + Spear(x) = Spear(x,10,15,45,20,[50,30,10],1) + + struct Sword <: Footunit + numUnits::Int64 + att::Int64 + defGeneral::Int64 + defHorse::Int64 + defArcher::Int64 + materialCost::Vector{Int64} + populationCost::Int64 + end + + Sword(x) = Sword(x,25,50,25,40,[30,30,70],1) + + struct Axe <: Footunit + numUnits::Int64 + att::Int64 + defGeneral::Int64 + defHorse::Int64 + defArcher::Int64 + materialCost::Vector{Int64} + populationCost::Int64 + end + + Axe(x) = Axe(x,40,10,5,10,[60,30,40],1) + + # add the mounted units + abstract type Cavalry <: Unit end + + struct LC <: Cavalry + numUnits::Int64 + att::Int64 + defGeneral::Int64 + defHorse::Int64 + defArcher::Int64 + materialCost::Vector{Int64} + populationCost::Int64 + end + + LC(x) = LC(x,130,30,40,30,[125,100,250],4) + + struct HC <: Cavalry + numUnits::Int64 + att::Int64 + defGeneral::Int64 + defHorse::Int64 + defArcher::Int64 + materialCost::Vector{Int64} + populationCost::Int64 + end + + HC(x) = HC(x,150,200,80,180,[200,150,600],6) + + # make it so that our units get displayed correctly + Base.show(io::IO, x::Unit) = print(io, "$(x.numUnits) $(split(string(typeof(x)),".")[end]), ") +end; + +# ╔═╡ 5aa06456-0a19-4e6e-842d-fbf75e83e91c +begin + maxPopulation = 400 + DefendingVillage = [Spear(200), Sword(120)] +end + +# ╔═╡ 9770d704-f364-4df7-8569-853aec3ca6e7 +function Battle(Attacker::Vector{<:Unit}, Defender::Vector{<:Unit}) + + # check if there is only cavalry and calculate attack stats + if any([x isa Cavalry for x in Attacker]) && sum([x isa Cavalry for x in Attacker]) < length(Attacker) + total_cavalry_att = sum([x.numUnits * x.att for x in Attacker if x isa Cavalry]) + total_foot_att = sum([x.numUnits * x.att for x in Attacker if x isa Footunit]) + total_att = total_cavalry_att + total_foot_att + ratio_cavalry = total_cavalry_att/total_att + ratio_foot = 1 - ratio_cavalry + else + if Attacker[1] isa Cavalry + ratio_cavalry = 1 + ratio_foot = 0 + else + ratio_cavalry = 0 + ratio_foot = 1 + end + total_att = sum([x.numUnits * x.att for x in Attacker]) + end + + # calculate defense stats + total_foot_def = sum([x.numUnits * x.defGeneral for x in Defender]) + total_cavalry_def = sum([x.numUnits * x.defHorse for x in Defender]) + total_def = total_foot_def * ratio_foot + total_cavalry_def * ratio_cavalry + + # check if win and return population loss + if total_att > total_def + win_loss_ratio = sqrt((total_def/total_att))/(total_att/total_def) + population_lost = sum([x.populationCost * round(x.numUnits * win_loss_ratio) for x in Attacker]) + return population_lost + else + return Inf + end +end + +# ╔═╡ 4b5b26b4-0b43-4079-a5d4-a556593bf1fd +function CreateArmy(amountUnits::Int64, percentageFoot::Float64, maxPopulation::Int64) + + # calculate the amount of cavalry and footsoldiers + amountFoot = round(amountUnits * percentageFoot) + amountCavalry = amountUnits - amountFoot + + # calculate if this combination is possible, we multiply the amount of cavalry by 4 since this is the least amount of population needed per cavalry unit + if (amountFoot + amountCavalry * 4) > maxPopulation + return Inf + end + + # create army + if amountFoot > 0 + axemen = Axe(amountFoot) + army = Unit[axemen] + else + army = Unit[] + end + amountHC = floor((maxPopulation - amountFoot - amountCavalry * 4) / 2) + if amountHC >= amountCavalry + amountHC = amountCavalry + else + lc = LC(amountCavalry - amountHC) + push!(army,lc) + end + + if amountHC > 0 + hc = HC(amountHC) + push!(army,hc) + end + + return army +end + +# ╔═╡ b6809b85-9b9a-42e3-9135-f2b6ffbe23cc +begin + maxUnits = maxPopulation + minUnits = floor(Int64, maxPopulation/6) + + UnitAxis = Array(minUnits:maxUnits) + FootPercentageAxis = Array(0:0.1:1) + + archive = fill([],(length(UnitAxis),length(FootPercentageAxis))) + scores = fill(Inf,(length(UnitAxis),length(FootPercentageAxis))) + + for amountUnits in UnitAxis + for percentageFoot in FootPercentageAxis + army = CreateArmy(amountUnits, percentageFoot, maxPopulation) + + if !(army isa Float64) + x = UnitAxis .== amountUnits + y = FootPercentageAxis .== percentageFoot + archive[x, y] = [army] + scores[x, y] .= Battle(army,DefendingVillage) + end + end + end +end + +# ╔═╡ 2d63fa8c-bab7-475f-952f-72ed7b5d7b17 +md"With $(archive[argmin(scores)])you lose $(Int64(scores[argmin(scores)])) people." + +# ╔═╡ 2515b9ec-48ca-41c3-bd6d-127e180e1d90 +function DetermineCharacteristics(army::Vector{<:Unit}) + amountUnits = sum([x.numUnits for x in army]) + percentageFoot = sum([x.numUnits for x in army if x isa Footunit])/amountUnits + return amountUnits, percentageFoot +end + +# ╔═╡ Cell order: +# ╟─476385f0-66f8-11ec-0f51-5930b44e312e +# ╟─66906f53-c68c-4236-b471-fc1b0d2a84dc +# ╟─090f2dda-fe30-4419-9430-2092a4313a41 +# ╠═9b061489-8116-4714-8f47-c0c7a3264581 +# ╟─1a888ee1-310b-4f28-b532-9f03ab4387e6 +# ╠═5aa06456-0a19-4e6e-842d-fbf75e83e91c +# ╟─9162a984-075c-4fab-b0f5-c58525a63aa9 +# ╠═b6809b85-9b9a-42e3-9135-f2b6ffbe23cc +# ╟─434b6b98-ef07-4953-bf74-f164d6846b87 +# ╟─f16ada76-41d3-40ac-b61a-4fb46df6de1c +# ╟─2d63fa8c-bab7-475f-952f-72ed7b5d7b17 +# ╟─104fa247-08a6-4317-8ee3-467d75455879 +# ╠═9770d704-f364-4df7-8569-853aec3ca6e7 +# ╠═4b5b26b4-0b43-4079-a5d4-a556593bf1fd +# ╠═2515b9ec-48ca-41c3-bd6d-127e180e1d90 +# ╠═71302c52-3c3f-4398-811d-b0dde5d166e9 From 9ed0f2aae69cada2bbfc26eee69501efcd06748c Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 6 Jan 2022 13:54:27 +0100 Subject: [PATCH 02/57] added auto static-export --- .github/workflows/ExportPluto.yaml | 56 ++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .github/workflows/ExportPluto.yaml diff --git a/.github/workflows/ExportPluto.yaml b/.github/workflows/ExportPluto.yaml new file mode 100644 index 00000000..4c6aa2c9 --- /dev/null +++ b/.github/workflows/ExportPluto.yaml @@ -0,0 +1,56 @@ +name: Export Pluto notebooks +on: + push: + branches: + - main + - master + workflow_dispatch: + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + + - name: Install Julia + uses: julia-actions/setup-julia@v1 + with: + version: 1.7 + + + # We set up a folder that Pluto can use to cache exported notebooks. If the notebook file did not change, then Pluto can take the exported file from cache instead of running the notebook. + - name: Set up notebook state cache + uses: actions/cache@v2 + with: + path: pluto_state_cache + key: ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }}-${{ hashFiles('**/*jl') }} + restore-keys: | + ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }} + + + - name: Run & export Pluto notebooks + run: | + julia -e 'using Pkg + Pkg.activate(mktempdir()) + Pkg.add([ + Pkg.PackageSpec(name="PlutoSliderServer", version="0.3.2-0.3"), + ]) + + import PlutoSliderServer + + PlutoSliderServer.github_action("."; + Export_cache_dir="pluto_state_cache", + Export_baked_notebookfile=false, + Export_baked_state=false, + # more parameters can go here + )' + + + - name: Deploy to gh-pages + uses: JamesIves/github-pages-deploy-action@releases/v3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages + FOLDER: ./notebook \ No newline at end of file From 6ceb039e90281fc97650017be734765b6956f475 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 9 Jan 2022 22:37:13 +0100 Subject: [PATCH 03/57] added files for fridge optimization project --- .gitignore | 3 + src/fridge.jl | 120 ++++++++++++++++++++++++++++++++++++++++ src/recipeWebscraper.jl | 77 ++++++++++++++++++++++++++ test/fridgeTest.jl | 25 +++++++++ 4 files changed, 225 insertions(+) create mode 100644 src/fridge.jl create mode 100644 src/recipeWebscraper.jl create mode 100644 test/fridgeTest.jl diff --git a/.gitignore b/.gitignore index cfb93320..0b3358c5 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,6 @@ docs/site/ # committed for packages, but should be committed for applications that require a static # environment. Manifest.toml + +# Large Data Files +data diff --git a/src/fridge.jl b/src/fridge.jl new file mode 100644 index 00000000..0c7243f6 --- /dev/null +++ b/src/fridge.jl @@ -0,0 +1,120 @@ +# A package that optimizes your fridge use!! +# concept: Maximize amount of fridge used. Minimize amount of recipes used, minimize amount of extra ingredients needed + +include("../src/recipeWebscraper.jl") + +using .recipeWebscraper + +function createIngredientDatabase(recipeDict) + # create an unique vector of all possible ingredients + ingredientList = [] + for ingredients in values(recipeDict) + append!(ingredientList,ingredients) + end + ingredientList = unique(ingredientList) + + return ingredientList +end + +function checkIngredients(fridgeList,ingredientList) + print("Checking if the food in your fridge is found in our database.\n\n") + + # check if the ingredients in the fridge are found in the database + for food in fridgeList + if food in ingredientList + print("Found $food in the ingredient database.\n") + else + print("Did not find $food in the ingredient database.\n\n") + if any(occursin.(food,ingredientList)) + print("Possible alternatives in database:\n") + alternatives = ingredientList[occursin.(food,ingredientList)] + for (indexNum, alternative) in enumerate(alternatives) + print("[$indexNum] $alternative\n") + end + print("If you want to take an alternative type its number, else type no.\n") + answer = readline() + if answer != "no" + correctInput = false + while !correctInput + try + answer = parse(Int64,answer) + correctInput = true + catch + print("Please only type the number of the alternative, eg. 1\n") + answer = readline() + end + end + fridgeList[fridgeList .== food] .= alternatives[answer] + print("Replaced $food with $(alternatives[answer])\n") + end + else + print("Did not find any alternative in the ingredient database.\n") + end + end + end + print("Done checking ingredients.\n\n") + + return fridgeList +end + +fridgeObjective(x::Array{Float64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] + +function fridgeObjective(ingredientList,fridgeList) + overlap = sum([food in ingredientList for food in fridgeList]) + remainingFood = length(fridgeList) - overlap + extraIngredients = length(ingredientList) - overlap + return overlap + 6*remainingFood + 2*extraIngredients +end + +function bestOverlap(recipeDict,fridgeList) + bestObjective = Inf + bestRecipe = "" + for recipe in keys(recipeDict) + objective = fridgeObjective(recipeDict[recipe],fridgeList) + if objective < bestObjective + bestObjective = objective + bestRecipe = recipe + end + end + return bestRecipe +end + +function findBestRecipe(fridgeList, csvPath) + # load the recipe dictionary from the csv file + recipeDict = loadRecipeDBCSV(csvPath) + + # create a list of all ingredients in your database + ingredientList = createIngredientDatabase(recipeDict) + + # check for every food in your fridge if it's in the database. If not check if their are alternatives. + fridgeList = checkIngredients(fridgeList, ingredientList) + + # find the best recipe + return bestOverlap(recipeDict,fridgeList) +end + +function recipeToNumVector(fridgeList,ingredientList) + numVector = zeros(length(fridgeList)+1) + for i in 1:length(fridgeList) + numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 + end + numVector[end] = length(ingredientList) - sum(numVector) + return numVector +end + +compatible(x...) = !any(sum(x)[1:end-1] .== 2) + +function findBestCombo(fridgeList, recipeDict) + +end + +testList = ["cheese","potato","tomato","cabbage"] +recipeDict = loadRecipeDBCSV("./docs/recipeDB.csv") + +print(fridgeObjective(recipeToNumVector(testList,recipeDict["New England Dinner"]))) + +#bestRecipe = findBestRecipe(testList, "./docs/recipeDB.csv") + +#print(bestRecipe) + + diff --git a/src/recipeWebscraper.jl b/src/recipeWebscraper.jl new file mode 100644 index 00000000..457d3409 --- /dev/null +++ b/src/recipeWebscraper.jl @@ -0,0 +1,77 @@ + +module recipeWebscraper + +using HTTP, Gumbo, Cascadia, CSV + +export scrapeRecipe, loadRecipeDBCSV + +# recipe number goes from 2610 to 149191 +# downloaded everything until 18788 + +function scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) +""" + scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) + +Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. +The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. +To get a recipenumber one should look at the last number of the url of a certain recipe. +For example, the recipe for 'Speculoosbavarois' is number 106585. +The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column +is the list of ingredients. + +## Input: +- scrapeBegin: The recipe number where the iteration should begin. +- scrapeEnd: The recipe number after which the iteration should and. +- csvPath: The path where the csv file is stored. + +## Examples: + +The example below downloads the recipes 2700 to 2702 and +stores them in the csv file 'recipedb.csv' in the current folder. + +```julia-repl +julia> scrapeRecipe(2700,2702,"./recipedb.csv") +``` +""" + for i = scrapeBegin:scrapeEnd + # get the webpage + htmlText = HTTP.request("GET","https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/$i") + htmlBody = parsehtml(String(htmlText.body)) + + # get the needed elements out of the webpage + recipeTitle = eachmatch(Selector("h3"),htmlBody.root)[1].children[1].text + print("recipe number $i : $recipeTitle\n") + ingredientTab = eachmatch(Selector("#ingredient_nutri"),htmlBody.root) + ingredientTabel = eachmatch(Selector("#myTable"),ingredientTab[1]) + ingredientLinks = eachmatch(Selector("td a"),ingredientTabel[1]) + ingredientList = [] + for ingredientLink in ingredientLinks + try + append!(ingredientList, [ingredientLink.children[1].text]) + catch y + end + end + + # write the data to the DB + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) + end + print("done") +end + + +function loadRecipeDBCSV(csvPath) + # read the dictionary from the csv file + print("Loading the recipe database.\n") + tempDict = CSV.File(csvPath) |> Dict + recipeDict = Dict() + + # parse the ingredient list to the right format + print("Parsing ingredients to right format.\n\n") + for recipe in keys(tempDict) + ingredientList = tempDict[recipe] + recipeDict[recipe] = eval(Meta.parse(ingredientList)) + end + return recipeDict +end + +end \ No newline at end of file diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl new file mode 100644 index 00000000..fc525cec --- /dev/null +++ b/test/fridgeTest.jl @@ -0,0 +1,25 @@ +include("../src/recipeWebscraper.jl") + +using .recipeWebscraper + +recipeDict = loadRecipeDBCSV("./docs/recipeDB-small.csv") +ingredientList = [] + +for ingredients in values(recipeDict) + append!(ingredientList,ingredients) +end + +ingredientList = unique(ingredientList) + +testList = ["cheese","potato"] + +for testProd in testList + if testProd in ingredientList + print("found $testProd in the ingredientlist") + else + print("did not find $testProd in the ingredientlist") + end + print("\n") +end + +print(ingredientList[occursin.("cheese",ingredientList)]) \ No newline at end of file From 8f4009311832730344b5dbffb2cf6738cfe652e0 Mon Sep 17 00:00:00 2001 From: warvbell Date: Wed, 12 Jan 2022 21:24:29 +0100 Subject: [PATCH 04/57] added greedy search for fridge --- src/fridge.jl | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 0c7243f6..88824338 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -102,16 +102,51 @@ function recipeToNumVector(fridgeList,ingredientList) return numVector end -compatible(x...) = !any(sum(x)[1:end-1] .== 2) +compatible(x...) = !any(sum(x)[1:end-1] .>= 2) -function findBestCombo(fridgeList, recipeDict) - +function findBestCombo(fridgeList, recipeDict, numRecipes) + + bestCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + bestOrder = sortperm(ingredientsArray, by=fridgeObjective) + ingredientsArray = ingredientsArray[bestOrder] + namesArray = namesArray[bestOrder] + + tempRecipeName = namesArray[i] + bestCombo[tempRecipeName] = ingredientsArray[i] + + if all(isone.(sum(values(bestCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList .== bestCombo[tempRecipeName]) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList .== bestCombo[tempRecipeName]) == 0] + + if isempty(namesArray) + print("found max $i compatible recipes.\n") + break + end + + end + + for recipeName in keys(bestCombo) + print("$(recipeName) : $(recipeDict[recipeName])\n") + end end testList = ["cheese","potato","tomato","cabbage"] -recipeDict = loadRecipeDBCSV("./docs/recipeDB.csv") +recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") -print(fridgeObjective(recipeToNumVector(testList,recipeDict["New England Dinner"]))) +findBestCombo(testList, recipeDict, 3) #bestRecipe = findBestRecipe(testList, "./docs/recipeDB.csv") From 0502e0b1f5813593f4c69d6805093fe9c3ca1dcd Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 13 Jan 2022 14:57:24 +0100 Subject: [PATCH 05/57] added some structure to fridge.jl and started on SA functions --- src/fridge.jl | 169 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 124 insertions(+), 45 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 88824338..0bf96745 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -5,6 +5,10 @@ include("../src/recipeWebscraper.jl") using .recipeWebscraper +#================================================== + CHECK INGREDIENTS FUNCTIONS +==================================================# + function createIngredientDatabase(recipeDict) # create an unique vector of all possible ingredients ingredientList = [] @@ -57,54 +61,19 @@ function checkIngredients(fridgeList,ingredientList) return fridgeList end -fridgeObjective(x::Array{Float64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] - -function fridgeObjective(ingredientList,fridgeList) - overlap = sum([food in ingredientList for food in fridgeList]) - remainingFood = length(fridgeList) - overlap - extraIngredients = length(ingredientList) - overlap - return overlap + 6*remainingFood + 2*extraIngredients -end - -function bestOverlap(recipeDict,fridgeList) - bestObjective = Inf - bestRecipe = "" - for recipe in keys(recipeDict) - objective = fridgeObjective(recipeDict[recipe],fridgeList) - if objective < bestObjective - bestObjective = objective - bestRecipe = recipe - end - end - return bestRecipe -end - -function findBestRecipe(fridgeList, csvPath) - # load the recipe dictionary from the csv file - recipeDict = loadRecipeDBCSV(csvPath) - - # create a list of all ingredients in your database - ingredientList = createIngredientDatabase(recipeDict) +#================================================== + OBJECTIVE FUNCTIONS +==================================================# - # check for every food in your fridge if it's in the database. If not check if their are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList) - - # find the best recipe - return bestOverlap(recipeDict,fridgeList) -end +fridgeObjective(x::Array{Float64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] -function recipeToNumVector(fridgeList,ingredientList) - numVector = zeros(length(fridgeList)+1) - for i in 1:length(fridgeList) - numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 - end - numVector[end] = length(ingredientList) - sum(numVector) - return numVector -end +fridgeObjective(x::Array{Array{Float64}}) = print("true") -compatible(x...) = !any(sum(x)[1:end-1] .>= 2) +#================================================== + GREEDY ALGORITHM +==================================================# -function findBestCombo(fridgeList, recipeDict, numRecipes) +function GreedyFindCombo(fridgeList, recipeDict, numRecipes) bestCombo = Dict() ingredientsArray = [] @@ -138,15 +107,125 @@ function findBestCombo(fridgeList, recipeDict, numRecipes) end + print("Greedy search results:\n") + for recipeName in keys(bestCombo) print("$(recipeName) : $(recipeDict[recipeName])\n") end + + return bestCombo +end + +#================================================== + NEIGBOURHOODS +==================================================# + +#= +IDEETJES + +1) verwijder 1 ingredient en kijk of je dan een andere combinatie kan vormen met mindere score +2) verwijder een recept en kijk of je een combo kan vinden van recepten die een betere score geven dan de huidige versie +=# + +function removeRecipe(curSolution, fridgeList, recipeDict) + +end + +#================================================== + SIMULATED ANNEALING ALGORITHM +==================================================# + +function SAFindCombo(curSolution, fridgeList, recipeDict; + kT=100, # repetitions per temperature + r=0.95, # cooling rate + Tmax=2, # maximal temperature to start + Tmin=1) # minimal temperature to end + + @assert 0 < Tmin < Tmax "Temperatures should be positive" + @assert 0 < r < 1 "cooling rate is between 0 and 1" + solution = curSolution + obj = fridgeObjective(solution) + #track!(tracker, f, s) # not yet implemented, maybe later + + # current temperature + T = Tmax + while T > Tmin + # repeat kT times + for _ in 1:kT + sn = removeRecipe(curSolution, fridgeList, recipeDict) # random neighbor + obj_sn = fridgeObjective(sn) + # if the neighbor improves the solution, keep it + # otherwise accept with a probability determined by the + # Metropolis heuristic + if obj_sn > obj || rand() < exp(-(obj-obj_sn)/T) + solution = sn + obj = obj_sn + end + end + #track!(tracker, f, s) # not yet implemented, maybe later + + # decay temperature + T *= r + end + + return solution +end + +#================================================== + OVERVIEW FUNCTION +==================================================# + +function findBestRecipe(fridgeList, csvPath; numRecipes=3) + # load the recipe dictionary from the csv file + recipeDict = loadRecipeDBCSV(csvPath) + + # create a list of all ingredients in your database + ingredientList = createIngredientDatabase(recipeDict) + + # check for every food in your fridge if it's in the database. If not check if their are alternatives. + fridgeList = checkIngredients(fridgeList, ingredientList) + + # find the best greedy recipe + greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + + # find the best recipe with SA + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict) + + # print the solution + print("The best recipes to make are:\n\n") + for recipeName in keys(SASolution) + print("$(recipeName) : $(recipeDict[recipeName])\n") + end + + return SASolution end +#================================================== + SUPPORTING FUNCTIONS +==================================================# + +function recipeToNumVector(fridgeList,ingredientList) + numVector = zeros(length(fridgeList)+1) + for i in 1:length(fridgeList) + numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 + end + numVector[end] = length(ingredientList) - sum(numVector) + return numVector +end + +compatible(x...) = !any(sum(x)[1:end-1] .>= 2) + + +#================================================== + TEST CORNER - MOVE LATER TO fridgeTest.jl +==================================================# + + testList = ["cheese","potato","tomato","cabbage"] recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") -findBestCombo(testList, recipeDict, 3) +GreedyFindCombo(testList, recipeDict, 3) + #bestRecipe = findBestRecipe(testList, "./docs/recipeDB.csv") From e99ed05a0337fbf2da7b700f2354b64f727cfb1a Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 13 Jan 2022 15:47:12 +0100 Subject: [PATCH 06/57] added objective function for recipe combination --- src/fridge.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 0bf96745..109f0416 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -67,7 +67,7 @@ end fridgeObjective(x::Array{Float64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] -fridgeObjective(x::Array{Array{Float64}}) = print("true") +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*4 + sum(x)[end]*2 : Inf # arbitrary weight for now #================================================== GREEDY ALGORITHM @@ -213,7 +213,7 @@ function recipeToNumVector(fridgeList,ingredientList) return numVector end -compatible(x...) = !any(sum(x)[1:end-1] .>= 2) +compatible(x) = !any(sum(x)[1:end-1] .>= 2) #================================================== @@ -224,7 +224,9 @@ compatible(x...) = !any(sum(x)[1:end-1] .>= 2) testList = ["cheese","potato","tomato","cabbage"] recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") -GreedyFindCombo(testList, recipeDict, 3) +test = GreedyFindCombo(testList, recipeDict, 3) +testRecipes = [i for i in values(test)] + #bestRecipe = findBestRecipe(testList, "./docs/recipeDB.csv") From f4cf66d4442639c7124d61a953316d73ba10e3f9 Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 13 Jan 2022 17:07:13 +0100 Subject: [PATCH 07/57] added way to load recipeDB with JLD2 --- src/fridge.jl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 109f0416..3bff5c64 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -3,7 +3,7 @@ include("../src/recipeWebscraper.jl") -using .recipeWebscraper +using .recipeWebscraper, JLD2 #================================================== CHECK INGREDIENTS FUNCTIONS @@ -222,7 +222,9 @@ compatible(x) = !any(sum(x)[1:end-1] .>= 2) testList = ["cheese","potato","tomato","cabbage"] -recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") +# recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") # this should be used the first time, else load jld2 file + +recipeDict = load("./data/recipeDB.jld2") test = GreedyFindCombo(testList, recipeDict, 3) testRecipes = [i for i in values(test)] From c8ed44dcd3ad18a5482336527e548c1c5d7f3c85 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sat, 15 Jan 2022 19:16:19 +0100 Subject: [PATCH 08/57] added neighbour function. Overview function is now working. --- src/fridge.jl | 51 +++++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 3bff5c64..e0405a0b 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -101,18 +101,11 @@ function GreedyFindCombo(fridgeList, recipeDict, numRecipes) ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList .== bestCombo[tempRecipeName]) == 0] if isempty(namesArray) - print("found max $i compatible recipes.\n") break end end - print("Greedy search results:\n") - - for recipeName in keys(bestCombo) - print("$(recipeName) : $(recipeDict[recipeName])\n") - end - return bestCombo end @@ -127,37 +120,51 @@ IDEETJES 2) verwijder een recept en kijk of je een combo kan vinden van recepten die een betere score geven dan de huidige versie =# -function removeRecipe(curSolution, fridgeList, recipeDict) - +function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) + toRemove = rand(curSolution)[1] + # adapt the fridgeList so that only ingredients from the removed ingredient are available + tempFridgeList = [i for i in fridgeList if in(i,recipeDict[toRemove])] + + # adapt the recipeDict and use greedy search to find a new solution + tempRecipeDict = copy(recipeDict) + for recipe in keys(curSolution) + delete!(tempRecipeDict,recipe) + end + + neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + + return neighbour end #================================================== SIMULATED ANNEALING ALGORITHM ==================================================# -function SAFindCombo(curSolution, fridgeList, recipeDict; +function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; kT=100, # repetitions per temperature - r=0.95, # cooling rate - Tmax=2, # maximal temperature to start + r=0.75, # cooling rate + Tmax=4, # maximal temperature to start Tmin=1) # minimal temperature to end @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" solution = curSolution - obj = fridgeObjective(solution) + obj = fridgeObjective([i for i in values(solution)]) #track!(tracker, f, s) # not yet implemented, maybe later # current temperature T = Tmax while T > Tmin + print("T = $T \n") # repeat kT times for _ in 1:kT - sn = removeRecipe(curSolution, fridgeList, recipeDict) # random neighbor - obj_sn = fridgeObjective(sn) + sn = removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) # random neighbor + obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the # Metropolis heuristic if obj_sn > obj || rand() < exp(-(obj-obj_sn)/T) + print(sn) solution = sn obj = obj_sn end @@ -176,8 +183,8 @@ end ==================================================# function findBestRecipe(fridgeList, csvPath; numRecipes=3) - # load the recipe dictionary from the csv file - recipeDict = loadRecipeDBCSV(csvPath) + # load the recipe dictionary from the db file + recipeDict = csvPath[end-3:end] == ".csv" ? loadRecipeDBCSV(csvPath) : load(csvPath) # create a list of all ingredients in your database ingredientList = createIngredientDatabase(recipeDict) @@ -189,7 +196,7 @@ function findBestRecipe(fridgeList, csvPath; numRecipes=3) greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) # find the best recipe with SA - SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict) + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes) # print the solution print("The best recipes to make are:\n\n") @@ -221,13 +228,9 @@ compatible(x) = !any(sum(x)[1:end-1] .>= 2) ==================================================# -testList = ["cheese","potato","tomato","cabbage"] -# recipeDict = loadRecipeDBCSV("./data/recipeDB.csv") # this should be used the first time, else load jld2 file - -recipeDict = load("./data/recipeDB.jld2") +testList = ["cheese","potato","tomato","cabbage","salt","beetroot","cauliflower"] -test = GreedyFindCombo(testList, recipeDict, 3) -testRecipes = [i for i in values(test)] +test = findBestRecipe(testList, "./data/recipeDB.jld2", numRecipes=10) From 3dec5af7ccf4cb156040adae6b497ff2502e4ea3 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sat, 15 Jan 2022 20:45:25 +0100 Subject: [PATCH 09/57] fixed SA function --- src/fridge.jl | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index e0405a0b..3ac8f3b2 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -122,8 +122,14 @@ IDEETJES function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) toRemove = rand(curSolution)[1] + print("toRemove = $toRemove\n") # adapt the fridgeList so that only ingredients from the removed ingredient are available - tempFridgeList = [i for i in fridgeList if in(i,recipeDict[toRemove])] + tempFridgeList = copy(fridgeList) + for recipe in keys(curSolution) + if recipe != toRemove + tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + end + end # adapt the recipeDict and use greedy search to find a new solution tempRecipeDict = copy(recipeDict) @@ -132,6 +138,18 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) end neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + print("neighbour = $neighbour\n") + + # correct recipe vectors + for recipe in keys(neighbour) + neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) + end + + # here combine the two dictionaries + tempCurSolution = copy(curSolution) + delete!(tempCurSolution,toRemove) + print("tempCurSolution = $tempCurSolution\n") + neighbour = merge(neighbour,tempCurSolution) return neighbour end @@ -158,15 +176,15 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; print("T = $T \n") # repeat kT times for _ in 1:kT - sn = removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) # random neighbor + sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes) # random neighbor obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the # Metropolis heuristic - if obj_sn > obj || rand() < exp(-(obj-obj_sn)/T) - print(sn) + if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) solution = sn obj = obj_sn + print("solution = $solution\n") end end #track!(tracker, f, s) # not yet implemented, maybe later From 2fb996da63d21407147cdd36de94ac55cd9c05e2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 16 Jan 2022 15:00:32 +0100 Subject: [PATCH 10/57] fixed bug in greedy search where too much recipes got removed --- src/fridge.jl | 53 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index 3ac8f3b2..4985fb94 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -65,9 +65,9 @@ end OBJECTIVE FUNCTIONS ==================================================# -fridgeObjective(x::Array{Float64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] +fridgeObjective(x::Array{Int64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] -fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*4 + sum(x)[end]*2 : Inf # arbitrary weight for now +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf # arbitrary weight for now #================================================== GREEDY ALGORITHM @@ -90,15 +90,15 @@ function GreedyFindCombo(fridgeList, recipeDict, numRecipes) ingredientsArray = ingredientsArray[bestOrder] namesArray = namesArray[bestOrder] - tempRecipeName = namesArray[i] - bestCombo[tempRecipeName] = ingredientsArray[i] + tempRecipeName = namesArray[1] + bestCombo[tempRecipeName] = ingredientsArray[1] if all(isone.(sum(values(bestCombo)))) break end - namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList .== bestCombo[tempRecipeName]) == 0] - ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList .== bestCombo[tempRecipeName]) == 0] + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] if isempty(namesArray) break @@ -120,9 +120,8 @@ IDEETJES 2) verwijder een recept en kijk of je een combo kan vinden van recepten die een betere score geven dan de huidige versie =# -function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) +function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList) toRemove = rand(curSolution)[1] - print("toRemove = $toRemove\n") # adapt the fridgeList so that only ingredients from the removed ingredient are available tempFridgeList = copy(fridgeList) for recipe in keys(curSolution) @@ -137,8 +136,13 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) delete!(tempRecipeDict,recipe) end + for recipe in tabuList + try delete!(tempRecipeDict,recipe) + catch e + end + end + neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) - print("neighbour = $neighbour\n") # correct recipe vectors for recipe in keys(neighbour) @@ -148,7 +152,6 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes) # here combine the two dictionaries tempCurSolution = copy(curSolution) delete!(tempCurSolution,toRemove) - print("tempCurSolution = $tempCurSolution\n") neighbour = merge(neighbour,tempCurSolution) return neighbour @@ -162,12 +165,14 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; kT=100, # repetitions per temperature r=0.75, # cooling rate Tmax=4, # maximal temperature to start - Tmin=1) # minimal temperature to end + Tmin=1, # minimal temperature to end + tabuLength=3) # number of cycli that recipe needs to be blocked @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" solution = curSolution obj = fridgeObjective([i for i in values(solution)]) + tabuList = String[i for i in keys(curSolution)] #track!(tracker, f, s) # not yet implemented, maybe later # current temperature @@ -176,7 +181,7 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; print("T = $T \n") # repeat kT times for _ in 1:kT - sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes) # random neighbor + sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList) # random neighbor obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the @@ -186,6 +191,17 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; obj = obj_sn print("solution = $solution\n") end + + for recipe in keys(sn) + if !in(recipe, tabuList) + if length(tabuList) < tabuLength + pushfirst!(tabuList,recipe) + else + pop!(tabuList) + pushfirst!(tabuList,recipe) + end + end + end end #track!(tracker, f, s) # not yet implemented, maybe later @@ -230,7 +246,7 @@ end ==================================================# function recipeToNumVector(fridgeList,ingredientList) - numVector = zeros(length(fridgeList)+1) + numVector = zeros(Int64,length(fridgeList)+1) for i in 1:length(fridgeList) numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 end @@ -246,14 +262,7 @@ compatible(x) = !any(sum(x)[1:end-1] .>= 2) ==================================================# -testList = ["cheese","potato","tomato","cabbage","salt","beetroot","cauliflower"] +testList = ["cheese","potato","tomato","cabbage","beetroot","cauliflower"] +testList2 = ["cheese","potato","tomato","cabbage"] test = findBestRecipe(testList, "./data/recipeDB.jld2", numRecipes=10) - - - -#bestRecipe = findBestRecipe(testList, "./docs/recipeDB.csv") - -#print(bestRecipe) - - From a7a49d29f5bde8eeac84b0f16a50c6d81855c3f1 Mon Sep 17 00:00:00 2001 From: warvbell Date: Wed, 26 Jan 2022 12:11:50 +0100 Subject: [PATCH 11/57] added README and added module to Fridge.jl --- Project.toml | 13 ++++---- README.md | 31 ++++++++++++------- project ideas.md | 59 ------------------------------------ src/STMOZOO.jl | 5 ++-- src/fridge.jl | 75 +++++++++++++++++++++++++++++----------------- test/fridgeTest.jl | 27 ++--------------- 6 files changed, 80 insertions(+), 130 deletions(-) delete mode 100644 project ideas.md diff --git a/Project.toml b/Project.toml index 881f78bc..99ddc07f 100644 --- a/Project.toml +++ b/Project.toml @@ -1,9 +1,6 @@ -name = "STMOZOO" -uuid = "8e7dc78f-7190-4116-bf88-3d148ae9f088" -authors = ["michielstock "] -version = "0.1.0" - [deps] -Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" +Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" diff --git a/README.md b/README.md index e2ced9a6..d82db978 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,25 @@ -# STMO-ZOO +# Fridge.jl +by *Ward Van Belle* \ +A package that optimizes your fridge use while reducing your waste pile!! -Welcome to the STMO zoo! This is your final assignment for the course Selected Topics in Mathematical Optimization. Your goal is to implement an optimization method in Julia and contribute this to this repository. To pass, you have to: +This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store. -- fork this repo and create a pull request; -- add a module to `src` with **at least one function** -- add at least one unit test to the folder `test`; -- document all your functions and add a page to the documentation page; -- make a notebook in [Pluto](https://github.com/fonsp/Pluto.jl) and add it to `notebooks`; -- perform a small code review of two other students. +## How to use this package? +There are several ways for you to use this package. + +1. First and foremost you should have a **recipe database**. This database should be a .csv file or a .jld2 file containing the recipe names in one column and a list containing the ingredient names in the next column. For instance: + + | recipeName | Ingredients | + |:----------:|:-----------:| + | french fries| potatoes, salt| + | boiled eggs | eggs, salt| + +2. If you just want to find an approximation of the best recipe combo. Then you can use the `greedyFindCombo` function. This performs a greedy search to find a quick solution. However, if you want a chance for a better solution, then you can use the `findBestRecipe` function. This function checks if your ingredients are in the database, and if not it offers possible alternatives. Next it uses **simulated annealing** to find a better recipe combination. + +## Help I don't have a database (recipeWebscraper.jl) + +Don't worry, we got you covered with `recipeWebscraper.jl`. This module includes a function that downloads recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/) based on their recipe number and exports them to a **.csv** file. + +You can use the `scrapeRecipe` function for this. Using this method it is possible to download around 16 000 recipes before you get kicked from the site. Therefore it is recommended to look at the cuisine you would like to download and start from the earliest recipe number in this cuisine. Recipe numbers can be found by looking at the end of the url of a recipe page eg. [Belgian Chocolate Mousse](https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/106541) is the first Belgian recipe and has the recipe number **106541**. -Depending on the project you choose some of these individual assignments might be really minimalistic, with other parts larger. For example, if you want to develop an application, say solving the graph coloring problem with Tabu Search, you might have only a single function in the source code (e.g., generating an instance) but have a fairly large notebook with a tutorial. On the other hand, if you work on a method, e.g., implementing Bee Colony Optimization, you might have many functions in the source code, while your notebook is only a demonstration on the test functions. -[![Build Status](https://travis-ci.org/MichielStock/STMOZOO.svg?branch=master)](https://travis-ci.org/MichielStock/STMOZOO)[![Coverage Status](https://coveralls.io/repos/github/MichielStock/STMOZOO/badge.svg?branch=master)](https://coveralls.io/github/MichielStock/STMOZOO?branch=master) \ No newline at end of file diff --git a/project ideas.md b/project ideas.md deleted file mode 100644 index 1c74e8dc..00000000 --- a/project ideas.md +++ /dev/null @@ -1,59 +0,0 @@ -# Project ideas - -Here are some suggestions for projects to do. Either pick something from this list or use it as inspiration. - -If you choose a project use strikthrought to remove it -> ~~crossed~~ - -## Teaching 👨‍🏫 - -Explain an optimization method not covered in the course though an interactive notebook. Gold standard is [Distill](https://distill.pub/2017/momentum/) - -- Conjugate gradient descent -- [Cross-entropy method](https://en.wikipedia.org/wiki/Cross-Entropy_Method) -- Levenberg–Marquardt algorithm (for nonlinear regression and inverse kinematics) -- training adverserial neural networks -- Q-learning -- link between [fractals and the Newton method](https://www.youtube.com/watch?v=-RdOwhmqP5s) -- [MAP-elites](https://arxiv.org/abs/1504.04909) -- [information-geometric opitmization algorithms](http://www.cmap.polytechnique.fr/~anne.auger/teaching-slides/05_DFO-IGO.pdf) -- the big deal with multi-objective optimization -- Thompson sampling: optimal gambling 🎲 -- Christofides' algorithm for solving the TSP -- ... - -## Tools 🔧 - -Solve a problem using a method from the course or a new one. - -- time table scheduling -- my own RNA folder! -- color transfer using optimal transportation done right -- analytic solution of a ODE using genetic programming -- graph matching using simulated annealing -- optimal task for every person using the Hungarian algorithm -- finding negative cycles using the Bellman–Ford algorithm -- multiple sequence alignment using Genetic Algorithms -- using MaxEnt to find the best probability distribution -- finding design patterns in phage lytic proteins using evolutionary algorithms -- homebrew SVM -- recovering images from a few pixels using [compressed sensing](https://www.youtube.com/watch?v=SbU1pahbbkc) (L1-norm minimization) -- visalizing complex networks using quadratic optimization -- ... - -## Research projects ⚗️ - -Experiment and learn. Reproduce the results of a paper (in simplified form). Show me something exciting about optimization! Use [visuals](https://www.youtube.com/watch?v=gvck7ssg9dE) to tell a story. - -- [fitting a neural network by optimizing one weigth at a time](http://arxiv.org/abs/2005.05955) -- search paths of Hill Climbing: an exhaustive search -- [convex restrictions in physical design](https://stanford.edu/~boyd/papers/pdf/cvx_restrictions_physical_design.pdf) -- non-covergence as a regularization mechanism in machine learning -- improving gradient descent or learning using [gradient startvation](https://mohammadpz.github.io/GradientStarvation.html) -- improving the convergence of evolutionary algorithms by varying the objective function -- the optimization landscape of ANNs -- comparision of optimizers for deep learning -- Newton methods for lazy bums: is the diagonal sufficient? -- utilitarian ethics: optimization for the Good Place? -- [Maze solver using bacteria](https://www.technologyreview.com/2021/11/09/1039107/e-coli-maze-solving-biocomputer/?s=03) (simulation of an experiment) -- [discovering natural laws](https://www.science.org/doi/abs/10.1126/science.1165893) -- ... diff --git a/src/STMOZOO.jl b/src/STMOZOO.jl index 34b94d12..2f6e52e0 100644 --- a/src/STMOZOO.jl +++ b/src/STMOZOO.jl @@ -2,7 +2,8 @@ module STMOZOO # execute your source file and export the module you made -include("example.jl") -export Example +include("fridge.jl") + +export Fridge end # module diff --git a/src/fridge.jl b/src/fridge.jl index 4985fb94..b0fca522 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -1,10 +1,11 @@ -# A package that optimizes your fridge use!! -# concept: Maximize amount of fridge used. Minimize amount of recipes used, minimize amount of extra ingredients needed +module Fridge -include("../src/recipeWebscraper.jl") +include("recipewebscraper.jl") using .recipeWebscraper, JLD2 +export checkIngredients, greedyFindCombo, findBestRecipe, removeRecipe, SAFindCombo + #================================================== CHECK INGREDIENTS FUNCTIONS ==================================================# @@ -73,7 +74,7 @@ fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf # GREEDY ALGORITHM ==================================================# -function GreedyFindCombo(fridgeList, recipeDict, numRecipes) +function greedyFindCombo(fridgeList, recipeDict, numRecipes) bestCombo = Dict() ingredientsArray = [] @@ -113,14 +114,39 @@ end NEIGBOURHOODS ==================================================# -#= -IDEETJES +function RandomCombo(fridgeList, recipeDict, numRecipes) + randCombo = Dict() + ingredientsArray = [] + namesArray = [] -1) verwijder 1 ingredient en kijk of je dan een andere combinatie kan vormen met mindere score -2) verwijder een recept en kijk of je een combo kan vinden van recepten die een betere score geven dan de huidige versie -=# + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end -function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList) + for i = 1:numRecipes + + randIndex = rand(1:length(namesArray)) + tempRecipeName = namesArray[randIndex] + randCombo[tempRecipeName] = ingredientsArray[randIndex] + + if all(isone.(sum(values(randCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return randCombo +end + +function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) toRemove = rand(curSolution)[1] # adapt the fridgeList so that only ingredients from the removed ingredient are available tempFridgeList = copy(fridgeList) @@ -142,7 +168,11 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList) end end - neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + if randRecipe + neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) + else + neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + end # correct recipe vectors for recipe in keys(neighbour) @@ -161,7 +191,7 @@ end SIMULATED ANNEALING ALGORITHM ==================================================# -function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; +function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, # repetitions per temperature r=0.75, # cooling rate Tmax=4, # maximal temperature to start @@ -180,8 +210,8 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; while T > Tmin print("T = $T \n") # repeat kT times - for _ in 1:kT - sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList) # random neighbor + for i in 1:kT + sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the @@ -189,7 +219,6 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes; if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) solution = sn obj = obj_sn - print("solution = $solution\n") end for recipe in keys(sn) @@ -216,7 +245,7 @@ end OVERVIEW FUNCTION ==================================================# -function findBestRecipe(fridgeList, csvPath; numRecipes=3) +function findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) # load the recipe dictionary from the db file recipeDict = csvPath[end-3:end] == ".csv" ? loadRecipeDBCSV(csvPath) : load(csvPath) @@ -228,9 +257,10 @@ function findBestRecipe(fridgeList, csvPath; numRecipes=3) # find the best greedy recipe greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + print("greedySolution = $greedySolution\n") # find the best recipe with SA - SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes) + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) # print the solution print("The best recipes to make are:\n\n") @@ -256,13 +286,4 @@ end compatible(x) = !any(sum(x)[1:end-1] .>= 2) - -#================================================== - TEST CORNER - MOVE LATER TO fridgeTest.jl -==================================================# - - -testList = ["cheese","potato","tomato","cabbage","beetroot","cauliflower"] -testList2 = ["cheese","potato","tomato","cabbage"] - -test = findBestRecipe(testList, "./data/recipeDB.jld2", numRecipes=10) +end # module \ No newline at end of file diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index fc525cec..68f4cc4a 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -1,25 +1,4 @@ -include("../src/recipeWebscraper.jl") +testList = ["cheese","potato","tomato","cabbage","beetroot","cauliflower"] +testList2 = ["cheese","potato","tomato","cabbage"] -using .recipeWebscraper - -recipeDict = loadRecipeDBCSV("./docs/recipeDB-small.csv") -ingredientList = [] - -for ingredients in values(recipeDict) - append!(ingredientList,ingredients) -end - -ingredientList = unique(ingredientList) - -testList = ["cheese","potato"] - -for testProd in testList - if testProd in ingredientList - print("found $testProd in the ingredientlist") - else - print("did not find $testProd in the ingredientlist") - end - print("\n") -end - -print(ingredientList[occursin.("cheese",ingredientList)]) \ No newline at end of file +test = findBestRecipe(testList, "./data/recipeDB.jld2", numRecipes=10, randRecipe=true) From 9cbfbac24282db8695610b988632e82869e1f52e Mon Sep 17 00:00:00 2001 From: warvbell Date: Wed, 26 Jan 2022 14:29:36 +0100 Subject: [PATCH 12/57] docs test --- Project.toml | 1 + docs/make.jl | 8 ++++---- docs/src/man/scrapeRecipe.md | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 docs/src/man/scrapeRecipe.md diff --git a/Project.toml b/Project.toml index 99ddc07f..27ce26db 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,7 @@ [deps] CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" +Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" diff --git a/docs/make.jl b/docs/make.jl index 21d4327e..b6fe271a 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,13 +1,13 @@ using Documenter using STMOZOO -using STMOZOO.Example +using STMOZOO.Fridge -makedocs(sitename="STMO ZOO", +makedocs(sitename="Fridge.jl", format = Documenter.HTML(), - modules=[Example], # add your module + modules=[Fridge], # add your module pages=Any[ - "Example"=> "man/example.md", # add the page to your documentation + "scrapeRecipe"=> "man/scrapeRecipe.md", # add the page to your documentation ]) #= diff --git a/docs/src/man/scrapeRecipe.md b/docs/src/man/scrapeRecipe.md new file mode 100644 index 00000000..d143896b --- /dev/null +++ b/docs/src/man/scrapeRecipe.md @@ -0,0 +1,33 @@ +```@docs + +``` + + +# recipeWebscraper + +This is a supporting module that allows the user to download recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/) based on their recipe number and exports them to a **.csv** file. + +```@docs + scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) + +Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. +The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. +To get a recipenumber one should look at the last number of the url of a certain recipe. +For example, the recipe for 'Speculoosbavarois' is number 106585. +The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column +is the list of ingredients. + +## Input: +- scrapeBegin: The recipe number where the iteration should begin. +- scrapeEnd: The recipe number after which the iteration should and. +- csvPath: The path where the csv file is stored. + +## Examples: + +The example below downloads the recipes 2700 to 2702 and +stores them in the csv file 'recipedb.csv' in the current folder. + +```julia-repl +julia> scrapeRecipe(2700,2702,"./recipedb.csv") +``` +``` \ No newline at end of file From 659408b4ea9ac3796da46a3012cdcf8367b053c5 Mon Sep 17 00:00:00 2001 From: warvbell Date: Wed, 26 Jan 2022 17:24:56 +0100 Subject: [PATCH 13/57] added documentation to all functions --- src/fridge.jl | 139 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 133 insertions(+), 6 deletions(-) diff --git a/src/fridge.jl b/src/fridge.jl index b0fca522..b0f85926 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -11,7 +11,7 @@ export checkIngredients, greedyFindCombo, findBestRecipe, removeRecipe, SAFindCo ==================================================# function createIngredientDatabase(recipeDict) - # create an unique vector of all possible ingredients + # create an unique vector of all ingredients used in the recipe database ingredientList = [] for ingredients in values(recipeDict) append!(ingredientList,ingredients) @@ -22,6 +22,23 @@ function createIngredientDatabase(recipeDict) end function checkIngredients(fridgeList,ingredientList) +""" + checkIngredients(fridgeList,ingredientList) + +This function checks if the foods in your fridge are also found in the ingredient overview +of the recipe database. If they are not found in the database, regex is used to find possible alternatives. +For instance cheese may be replaced by swiss cheese. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the different ingredients that are used in the recipe database. + +## Output: +- fridgeList: The (adapted) given fridgeList + +""" + + print("Checking if the food in your fridge is found in our database.\n\n") # check if the ingredients in the fridge are found in the database @@ -66,15 +83,34 @@ end OBJECTIVE FUNCTIONS ==================================================# +# objective function used to score a single recipe fridgeObjective(x::Array{Int64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] -fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf # arbitrary weight for now +# objective function used to score a combination of recipes +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf #================================================== GREEDY ALGORITHM ==================================================# function greedyFindCombo(fridgeList, recipeDict, numRecipes) +""" + greedyFindCombo(fridgeList, recipeDict, numRecipes) + +This function uses greedy search to find a good combination of recipes that match your fridge content. +It ranks all recipes based on the following formula + +``score = (ingredients from fridge used) + 6*(ingredients in fridge remaining) + 2*(extra ingredients needed)`` + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- bestCombo: A dictionary containing the best found combination of recipes. + +""" bestCombo = Dict() ingredientsArray = [] @@ -115,6 +151,19 @@ end ==================================================# function RandomCombo(fridgeList, recipeDict, numRecipes) +""" + randomCombo(fridgeList, recipeDict, numRecipes) + +This function gives a random combination of recipes from the provided recipe dictionary. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- randCombo: A dictionary containing a random combination of recipes. +""" randCombo = Dict() ingredientsArray = [] namesArray = [] @@ -147,6 +196,24 @@ function RandomCombo(fridgeList, recipeDict, numRecipes) end function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) +""" + removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + +This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. +It also uses a tabulist to stimulate the use of new solutions. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Output: +- neighbour: A dictionary containing a combination of recipes. + +""" toRemove = rand(curSolution)[1] # adapt the fridgeList so that only ingredients from the removed ingredient are available tempFridgeList = copy(fridgeList) @@ -197,13 +264,38 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip Tmax=4, # maximal temperature to start Tmin=1, # minimal temperature to end tabuLength=3) # number of cycli that recipe needs to be blocked + +""" + SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, r=0.75, Tmax=4, Tmin=1, tabuLength=3) + +This function uses simulated annealing to find a better combination of recipes that match your fridge content. +It starts with the current solution and tries to improve this. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Optional Inputs: +- kT: repetitions per temperature +- r: cooling rate +- Tmax: maximal temperature to start +- Tmin: minimal temperature to end +- tabuLength: Number of cycli that recipe needs to be blocked + +## Output: +- solution: A dictionary containing the best found combination of recipes. + +""" @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" solution = curSolution obj = fridgeObjective([i for i in values(solution)]) tabuList = String[i for i in keys(curSolution)] - #track!(tracker, f, s) # not yet implemented, maybe later # current temperature T = Tmax @@ -245,9 +337,28 @@ end OVERVIEW FUNCTION ==================================================# -function findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) +""" + findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) + +This function combines all other functions. This function checks if your ingredients are in the database, +if not it offers possible alternatives. Next it uses simulated annealing to find a better recipe combination. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- dataPath: A relative or absolute path to a .csv or .jld2 file containing the recipe database. + +## Optional Inputs: +- numRecipes: The max amount of recipes that a combo should contain. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. + +## Output: +- SASolution: A dictionary containing the best found combination of recipes. + +""" + # load the recipe dictionary from the db file - recipeDict = csvPath[end-3:end] == ".csv" ? loadRecipeDBCSV(csvPath) : load(csvPath) + recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) # create a list of all ingredients in your database ingredientList = createIngredientDatabase(recipeDict) @@ -276,6 +387,22 @@ end ==================================================# function recipeToNumVector(fridgeList,ingredientList) +""" + recipeToNumVector(fridgeList,ingredientList) + +This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal +to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. +If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the ingredients used in a specific recipe. + +## Output: +- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, +that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +""" numVector = zeros(Int64,length(fridgeList)+1) for i in 1:length(fridgeList) numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 @@ -284,6 +411,6 @@ function recipeToNumVector(fridgeList,ingredientList) return numVector end -compatible(x) = !any(sum(x)[1:end-1] .>= 2) +compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient end # module \ No newline at end of file From eac27562c1d87ce60484fd208cea4233db233853 Mon Sep 17 00:00:00 2001 From: warvbell Date: Wed, 26 Jan 2022 17:33:31 +0100 Subject: [PATCH 14/57] added Documenter documents --- docs/make.jl | 11 ++++++----- docs/src/index.md | 6 +++--- docs/src/man/example.md | 14 -------------- docs/src/man/mainFunction.md | 11 +++++++++++ docs/src/man/recipeWebscraper.md | 14 ++++++++++++++ docs/src/man/scrapeRecipe.md | 33 -------------------------------- docs/src/man/searchAlgorithms.md | 22 +++++++++++++++++++++ src/fridge.jl | 2 +- 8 files changed, 57 insertions(+), 56 deletions(-) delete mode 100644 docs/src/man/example.md create mode 100644 docs/src/man/mainFunction.md create mode 100644 docs/src/man/recipeWebscraper.md delete mode 100644 docs/src/man/scrapeRecipe.md create mode 100644 docs/src/man/searchAlgorithms.md diff --git a/docs/make.jl b/docs/make.jl index b6fe271a..8902ab62 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,17 +1,18 @@ -using Documenter - -using STMOZOO +using Documenter, STMOZOO using STMOZOO.Fridge makedocs(sitename="Fridge.jl", format = Documenter.HTML(), modules=[Fridge], # add your module pages=Any[ - "scrapeRecipe"=> "man/scrapeRecipe.md", # add the page to your documentation + "index.md", + "main function" => "man/mainFunction.md", + "search algorithms" => "man/searchAlgorithms", + "recipe webscraper"=> "man/recipeWebscraper.md", ]) #= deploydocs( - repo = "github.com/michielstock/STMOZOO.jl.git", + repo = "github.com/wardvanbelle/Fridge.jl", ) =# \ No newline at end of file diff --git a/docs/src/index.md b/docs/src/index.md index ad33d99d..a2c5a225 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -1,7 +1,7 @@ -# STMO ZOO documentation +# Fridge +by *Ward Van Belle* -This is the documentation page for the STMO ZOO packages (edition 2020-2021). This is the place for the **documentation** -of your function. So explain the main functionality of your module and list the documentation of your funtions. +This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store. ```@contents ``` \ No newline at end of file diff --git a/docs/src/man/example.md b/docs/src/man/example.md deleted file mode 100644 index 08857ecb..00000000 --- a/docs/src/man/example.md +++ /dev/null @@ -1,14 +0,0 @@ -## Example - -This is the example code, written by Michiel Stock. It contains some basic functionality -to solve quadratic systems of the form: - -``\min_{\mathbf{x}} \frac{1}{2} \mathbf{x}^\intercal P\mathbf{x} + \mathbf{q} \cdot \mathbf{x} + r\,,`` - -It contains a function to solve this optimization problem and a helper function that generates a quadratic function from -the parameters in their canonical form. - -```@docs -solve_quadratic_system -quadratic_function -``` \ No newline at end of file diff --git a/docs/src/man/mainFunction.md b/docs/src/man/mainFunction.md new file mode 100644 index 00000000..e4ed80df --- /dev/null +++ b/docs/src/man/mainFunction.md @@ -0,0 +1,11 @@ +## Overview Function + +```@docs +findBestRecipe +``` + +This function checks the ingredients by using the `checkIngredients` function: + +```@docs +checkIngredients +``` \ No newline at end of file diff --git a/docs/src/man/recipeWebscraper.md b/docs/src/man/recipeWebscraper.md new file mode 100644 index 00000000..02daffba --- /dev/null +++ b/docs/src/man/recipeWebscraper.md @@ -0,0 +1,14 @@ +```@docs + +``` + + +# recipeWebscraper + +This is a supporting module that allows the user to download recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/) based on their recipe number and exports them to a **.csv** file. + +## scrapeRecipe + +```@docs +scrapeRecipe +``` diff --git a/docs/src/man/scrapeRecipe.md b/docs/src/man/scrapeRecipe.md deleted file mode 100644 index d143896b..00000000 --- a/docs/src/man/scrapeRecipe.md +++ /dev/null @@ -1,33 +0,0 @@ -```@docs - -``` - - -# recipeWebscraper - -This is a supporting module that allows the user to download recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/) based on their recipe number and exports them to a **.csv** file. - -```@docs - scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) - -Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. -The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. -To get a recipenumber one should look at the last number of the url of a certain recipe. -For example, the recipe for 'Speculoosbavarois' is number 106585. -The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column -is the list of ingredients. - -## Input: -- scrapeBegin: The recipe number where the iteration should begin. -- scrapeEnd: The recipe number after which the iteration should and. -- csvPath: The path where the csv file is stored. - -## Examples: - -The example below downloads the recipes 2700 to 2702 and -stores them in the csv file 'recipedb.csv' in the current folder. - -```julia-repl -julia> scrapeRecipe(2700,2702,"./recipedb.csv") -``` -``` \ No newline at end of file diff --git a/docs/src/man/searchAlgorithms.md b/docs/src/man/searchAlgorithms.md new file mode 100644 index 00000000..6e3482a7 --- /dev/null +++ b/docs/src/man/searchAlgorithms.md @@ -0,0 +1,22 @@ +## Search Algorithms + +This page includes some more information on the two search methods used. + +### Greedy Search + +```@docs +greedyFindCombo +``` + +### Simulated Annealing + +```@docs +SAFindCombo +``` + +### Neighbour Functions + +```@docs +RandomCombo +removeRecipe +``` \ No newline at end of file diff --git a/src/fridge.jl b/src/fridge.jl index b0f85926..83811b54 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -4,7 +4,7 @@ include("recipewebscraper.jl") using .recipeWebscraper, JLD2 -export checkIngredients, greedyFindCombo, findBestRecipe, removeRecipe, SAFindCombo +export checkIngredients, greedyFindCombo, findBestRecipe, RandomCombo, removeRecipe, SAFindCombo #================================================== CHECK INGREDIENTS FUNCTIONS From d888a27a8da872f0268a7e170132622061d1163d Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 12:15:47 +0100 Subject: [PATCH 15/57] added a logo and initiated notebook --- FridgeLogo.png | Bin 0 -> 366179 bytes README.md | 5 +++- notebook/fridgeNotebook.jl | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 FridgeLogo.png create mode 100644 notebook/fridgeNotebook.jl diff --git a/FridgeLogo.png b/FridgeLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..aa50b00a54d87580771903eeb655afca7fdb1f55 GIT binary patch literal 366179 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 z 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$MkBZiRw*eTA+Wof#l& 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

pO?)Aovb|X5r3Wz(Hy(j^9yiKL7g`#dIyO>(M~* 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 LOixGPsCE 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 +by Ward Van Belle + A package that optimizes your fridge use while reducing your waste pile!! This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store. diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl new file mode 100644 index 00000000..5d4c1fc8 --- /dev/null +++ b/notebook/fridgeNotebook.jl @@ -0,0 +1,48 @@ +### A Pluto.jl notebook ### +# v0.17.1 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═╡ 8c6e005b-eb0b-4644-aa86-f5242770e87d +begin + using PlutoUI, Pkg + Pkg.activate("../") + include("../src/recipewebscraper.jl") + using .recipeWebscraper +end + +# ╔═╡ ae625e40-7f56-11ec-3cd5-d1244e23a3ba +md"""# Fridge.jl +by *Ward Van Belle* +""" + +# ╔═╡ 06db3cc2-1680-49b9-a054-281a6b35205a +md"""A package that optimizes your fridge use while reducing your waste pile!! + +This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store.""" + +# ╔═╡ 2f8fdff5-0d3f-4167-b415-e7f5f85e006b +md"Download example recipe database: $(@bind downloadDB CheckBox())" + +# ╔═╡ cd5458a5-2136-4559-b4e5-2d91abea870c +if downloadDB + missing +end + +# ╔═╡ Cell order: +# ╟─8c6e005b-eb0b-4644-aa86-f5242770e87d +# ╟─ae625e40-7f56-11ec-3cd5-d1244e23a3ba +# ╟─06db3cc2-1680-49b9-a054-281a6b35205a +# ╟─2f8fdff5-0d3f-4167-b415-e7f5f85e006b +# ╠═cd5458a5-2136-4559-b4e5-2d91abea870c From 33af0ad2ff9a252f5e3e835788232df1a54c1e8b Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 12:17:00 +0100 Subject: [PATCH 16/57] updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9801f502..737d6223 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fridge.jl - + by Ward Van Belle A package that optimizes your fridge use while reducing your waste pile!! From 254899c4442f87f22643c449b180a6339e0a9347 Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 14:48:46 +0100 Subject: [PATCH 17/57] add functions and explanation from src to Fridge notebook --- notebook/TribalWars_BatlleOptimizer.jl | 245 ------- notebook/fridgeNotebook.jl | 976 ++++++++++++++++++++++++- 2 files changed, 964 insertions(+), 257 deletions(-) delete mode 100644 notebook/TribalWars_BatlleOptimizer.jl diff --git a/notebook/TribalWars_BatlleOptimizer.jl b/notebook/TribalWars_BatlleOptimizer.jl deleted file mode 100644 index ccda5f99..00000000 --- a/notebook/TribalWars_BatlleOptimizer.jl +++ /dev/null @@ -1,245 +0,0 @@ -### A Pluto.jl notebook ### -# v0.17.1 - -using Markdown -using InteractiveUtils - -# ╔═╡ 476385f0-66f8-11ec-0f51-5930b44e312e -md"# Optimizing Attacks in Tribal Wars using MAP-Elites" - -# ╔═╡ 66906f53-c68c-4236-b471-fc1b0d2a84dc -md"""## Introduction -Objective = lose as less population as possible - -Constraints = amount of population - -Axis = amount of units, percentage footsoldiers -""" - -# ╔═╡ 090f2dda-fe30-4419-9430-2092a4313a41 -md"## The Battle System" - -# ╔═╡ 9b061489-8116-4714-8f47-c0c7a3264581 - - -# ╔═╡ 1a888ee1-310b-4f28-b532-9f03ab4387e6 -md"## MAP-Elites" - -# ╔═╡ 9162a984-075c-4fab-b0f5-c58525a63aa9 -md"### Generating The Archive" - -# ╔═╡ 434b6b98-ef07-4953-bf74-f164d6846b87 -md"### Making New Combinations" - -# ╔═╡ f16ada76-41d3-40ac-b61a-4fb46df6de1c -md"### Optimizing The Army" - -# ╔═╡ 104fa247-08a6-4317-8ee3-467d75455879 -md"""## Function Corner -🏹 Do not touch this young warrior, or you will take an arrow to the knee! 🏹 -""" - -# ╔═╡ 71302c52-3c3f-4398-811d-b0dde5d166e9 -begin - # introduce the general type - abstract type Unit end - - # add the foot units - abstract type Footunit <: Unit end - - struct Spear <: Footunit - numUnits::Int64 - att::Int64 - defGeneral::Int64 - defHorse::Int64 - defArcher::Int64 - materialCost::Vector{Int64} - populationCost::Int64 - end - - Spear(x) = Spear(x,10,15,45,20,[50,30,10],1) - - struct Sword <: Footunit - numUnits::Int64 - att::Int64 - defGeneral::Int64 - defHorse::Int64 - defArcher::Int64 - materialCost::Vector{Int64} - populationCost::Int64 - end - - Sword(x) = Sword(x,25,50,25,40,[30,30,70],1) - - struct Axe <: Footunit - numUnits::Int64 - att::Int64 - defGeneral::Int64 - defHorse::Int64 - defArcher::Int64 - materialCost::Vector{Int64} - populationCost::Int64 - end - - Axe(x) = Axe(x,40,10,5,10,[60,30,40],1) - - # add the mounted units - abstract type Cavalry <: Unit end - - struct LC <: Cavalry - numUnits::Int64 - att::Int64 - defGeneral::Int64 - defHorse::Int64 - defArcher::Int64 - materialCost::Vector{Int64} - populationCost::Int64 - end - - LC(x) = LC(x,130,30,40,30,[125,100,250],4) - - struct HC <: Cavalry - numUnits::Int64 - att::Int64 - defGeneral::Int64 - defHorse::Int64 - defArcher::Int64 - materialCost::Vector{Int64} - populationCost::Int64 - end - - HC(x) = HC(x,150,200,80,180,[200,150,600],6) - - # make it so that our units get displayed correctly - Base.show(io::IO, x::Unit) = print(io, "$(x.numUnits) $(split(string(typeof(x)),".")[end]), ") -end; - -# ╔═╡ 5aa06456-0a19-4e6e-842d-fbf75e83e91c -begin - maxPopulation = 400 - DefendingVillage = [Spear(200), Sword(120)] -end - -# ╔═╡ 9770d704-f364-4df7-8569-853aec3ca6e7 -function Battle(Attacker::Vector{<:Unit}, Defender::Vector{<:Unit}) - - # check if there is only cavalry and calculate attack stats - if any([x isa Cavalry for x in Attacker]) && sum([x isa Cavalry for x in Attacker]) < length(Attacker) - total_cavalry_att = sum([x.numUnits * x.att for x in Attacker if x isa Cavalry]) - total_foot_att = sum([x.numUnits * x.att for x in Attacker if x isa Footunit]) - total_att = total_cavalry_att + total_foot_att - ratio_cavalry = total_cavalry_att/total_att - ratio_foot = 1 - ratio_cavalry - else - if Attacker[1] isa Cavalry - ratio_cavalry = 1 - ratio_foot = 0 - else - ratio_cavalry = 0 - ratio_foot = 1 - end - total_att = sum([x.numUnits * x.att for x in Attacker]) - end - - # calculate defense stats - total_foot_def = sum([x.numUnits * x.defGeneral for x in Defender]) - total_cavalry_def = sum([x.numUnits * x.defHorse for x in Defender]) - total_def = total_foot_def * ratio_foot + total_cavalry_def * ratio_cavalry - - # check if win and return population loss - if total_att > total_def - win_loss_ratio = sqrt((total_def/total_att))/(total_att/total_def) - population_lost = sum([x.populationCost * round(x.numUnits * win_loss_ratio) for x in Attacker]) - return population_lost - else - return Inf - end -end - -# ╔═╡ 4b5b26b4-0b43-4079-a5d4-a556593bf1fd -function CreateArmy(amountUnits::Int64, percentageFoot::Float64, maxPopulation::Int64) - - # calculate the amount of cavalry and footsoldiers - amountFoot = round(amountUnits * percentageFoot) - amountCavalry = amountUnits - amountFoot - - # calculate if this combination is possible, we multiply the amount of cavalry by 4 since this is the least amount of population needed per cavalry unit - if (amountFoot + amountCavalry * 4) > maxPopulation - return Inf - end - - # create army - if amountFoot > 0 - axemen = Axe(amountFoot) - army = Unit[axemen] - else - army = Unit[] - end - amountHC = floor((maxPopulation - amountFoot - amountCavalry * 4) / 2) - if amountHC >= amountCavalry - amountHC = amountCavalry - else - lc = LC(amountCavalry - amountHC) - push!(army,lc) - end - - if amountHC > 0 - hc = HC(amountHC) - push!(army,hc) - end - - return army -end - -# ╔═╡ b6809b85-9b9a-42e3-9135-f2b6ffbe23cc -begin - maxUnits = maxPopulation - minUnits = floor(Int64, maxPopulation/6) - - UnitAxis = Array(minUnits:maxUnits) - FootPercentageAxis = Array(0:0.1:1) - - archive = fill([],(length(UnitAxis),length(FootPercentageAxis))) - scores = fill(Inf,(length(UnitAxis),length(FootPercentageAxis))) - - for amountUnits in UnitAxis - for percentageFoot in FootPercentageAxis - army = CreateArmy(amountUnits, percentageFoot, maxPopulation) - - if !(army isa Float64) - x = UnitAxis .== amountUnits - y = FootPercentageAxis .== percentageFoot - archive[x, y] = [army] - scores[x, y] .= Battle(army,DefendingVillage) - end - end - end -end - -# ╔═╡ 2d63fa8c-bab7-475f-952f-72ed7b5d7b17 -md"With $(archive[argmin(scores)])you lose $(Int64(scores[argmin(scores)])) people." - -# ╔═╡ 2515b9ec-48ca-41c3-bd6d-127e180e1d90 -function DetermineCharacteristics(army::Vector{<:Unit}) - amountUnits = sum([x.numUnits for x in army]) - percentageFoot = sum([x.numUnits for x in army if x isa Footunit])/amountUnits - return amountUnits, percentageFoot -end - -# ╔═╡ Cell order: -# ╟─476385f0-66f8-11ec-0f51-5930b44e312e -# ╟─66906f53-c68c-4236-b471-fc1b0d2a84dc -# ╟─090f2dda-fe30-4419-9430-2092a4313a41 -# ╠═9b061489-8116-4714-8f47-c0c7a3264581 -# ╟─1a888ee1-310b-4f28-b532-9f03ab4387e6 -# ╠═5aa06456-0a19-4e6e-842d-fbf75e83e91c -# ╟─9162a984-075c-4fab-b0f5-c58525a63aa9 -# ╠═b6809b85-9b9a-42e3-9135-f2b6ffbe23cc -# ╟─434b6b98-ef07-4953-bf74-f164d6846b87 -# ╟─f16ada76-41d3-40ac-b61a-4fb46df6de1c -# ╟─2d63fa8c-bab7-475f-952f-72ed7b5d7b17 -# ╟─104fa247-08a6-4317-8ee3-467d75455879 -# ╠═9770d704-f364-4df7-8569-853aec3ca6e7 -# ╠═4b5b26b4-0b43-4079-a5d4-a556593bf1fd -# ╠═2515b9ec-48ca-41c3-bd6d-127e180e1d90 -# ╠═71302c52-3c3f-4398-811d-b0dde5d166e9 diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index 5d4c1fc8..eff66eb6 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -14,35 +14,987 @@ macro bind(def, element) end end -# ╔═╡ 8c6e005b-eb0b-4644-aa86-f5242770e87d -begin - using PlutoUI, Pkg - Pkg.activate("../") - include("../src/recipewebscraper.jl") - using .recipeWebscraper -end - # ╔═╡ ae625e40-7f56-11ec-3cd5-d1244e23a3ba +begin +using PlutoUI, HTTP, Gumbo, Cascadia, CSV, JLD2 + md"""# Fridge.jl by *Ward Van Belle* """ +end + # ╔═╡ 06db3cc2-1680-49b9-a054-281a6b35205a -md"""A package that optimizes your fridge use while reducing your waste pile!! +md"""$(LocalResource("../FridgeLogo.png", :width => 150, :align => "right")) + +A package that optimizes your fridge use while reducing your waste pile!! This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store.""" +# ╔═╡ 3ad1af72-7096-4106-a3c7-47326695e2cb +md""" +## Checking The Ingredients +If you want to optimize the fridge usage. It's best to know which ingredients are in the fridge. By checking all the ingredients and offering possible alternatives, it is easier for the algorithm to give better results. +""" + +# ╔═╡ 8e58f807-1db9-495e-8679-430f953292ea +function checkIngredients(fridgeList,ingredientList) +""" + checkIngredients(fridgeList,ingredientList) + +This function checks if the foods in your fridge are also found in the ingredient overview +of the recipe database. If they are not found in the database, regex is used to find possible alternatives. +For instance cheese may be replaced by swiss cheese. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the different ingredients that are used in the recipe database. + +## Output: +- fridgeList: The (adapted) given fridgeList + +""" + + + print("Checking if the food in your fridge is found in our database.\n\n") + + # check if the ingredients in the fridge are found in the database + for food in fridgeList + if food in ingredientList + print("Found $food in the ingredient database.\n") + else + print("Did not find $food in the ingredient database.\n\n") + if any(occursin.(food,ingredientList)) + print("Possible alternatives in database:\n") + alternatives = ingredientList[occursin.(food,ingredientList)] + for (indexNum, alternative) in enumerate(alternatives) + print("[$indexNum] $alternative\n") + end + print("If you want to take an alternative type its number, else type no.\n") + answer = readline() + if answer != "no" + correctInput = false + while !correctInput + try + answer = parse(Int64,answer) + correctInput = true + catch + print("Please only type the number of the alternative, eg. 1\n") + answer = readline() + end + end + fridgeList[fridgeList .== food] .= alternatives[answer] + print("Replaced $food with $(alternatives[answer])\n") + end + else + print("Did not find any alternative in the ingredient database.\n") + end + end + end + print("Done checking ingredients.\n\n") + + return fridgeList +end + +# ╔═╡ 264b1eb5-c421-4a69-a55c-8fbbbb7715d1 +md""" +## Objective Functions +Of course, we want to be able to score how good our objective function will be. This objective function is based on the following formula where ``u`` is the number of ingredients used from the fridge, ``r`` is the number of ingredients remaining in the fridge and ``e`` are the extra ingredients needed. ``w_1``, ``w_2`` and ``w_3`` are a set of weights. + +``score = w_1 * u + w_2 * r + w_3*e`` +""" + +# ╔═╡ c793a149-2cbe-462a-b69a-6ecab53320a6 +md""" +``w_1``: $(@bind w_1 Slider(0:10))\ +``w_2``: $(@bind w_2 Slider(0:10))\ +``w_3``: $(@bind w_3 Slider(0:10))\ +""" + +# ╔═╡ 52c497d7-36b9-4017-934a-1ea6190cbbb5 +md"``w_1``: $(w_1) ``w_2``: $(w_2) ``w_3``: $(w_3)" + +# ╔═╡ 1752889a-513a-4620-add4-a9ca7fa92c8e +md""" +## The Search Algorithm +Let's now take a look at the different search algorithms that you can use in the Fridge.jl module. +""" + +# ╔═╡ a65c0925-7a67-4da3-9a6d-2ade8d3529e9 +md"""### Greedy Algorithm +It ranks all recipes based on the previously discussed objective function. +""" + +# ╔═╡ 954fe2b3-171b-43ad-a1df-cbb3414988de +md""" +### Simulated Annealing +To improve our earlier result, we can use simulated annealing. The algorithm below is based on the one seen in class. The biggest difference is the fact that we also use a Tabu list to block recipes for a certain number of cycles. +""" + +# ╔═╡ 7315f676-0d0e-43ae-8231-b6274dc5c8de +md""" +### Neighbours +There are two types of neighbours to use. One is a random combination of recipes, the other is based on the Greedy Search algorithm. +""" + +# ╔═╡ b6205bd3-41da-45e0-81f1-a480a3f0e737 +md""" +## Overview Function +Finally we want to bring all the functions together in one. +""" + +# ╔═╡ 6af2a6dd-ba7e-470e-8915-12ae6eff8357 +md"## Example Time" + # ╔═╡ 2f8fdff5-0d3f-4167-b415-e7f5f85e006b -md"Download example recipe database: $(@bind downloadDB CheckBox())" +md"""Download example recipe database: $(@bind downloadDB CheckBox())\ +\ +It is recommended to only use this once, otherwise you will have copies of some recipes in your database.""" + +# ╔═╡ c51f2b76-fe4c-4c29-87dc-c7784e5200c2 +md""" +## Supporting Functions +Below you can find all the supporting functions used in this notebook. These can also be found in the src folder in the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). Please do not adapt them. +""" + +# ╔═╡ 09d6393c-9b14-4401-babe-708a88ef0a16 +function scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) +""" + scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) + +Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. +The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. +To get a recipenumber one should look at the last number of the url of a certain recipe. +For example, the recipe for 'Speculoosbavarois' is number 106585. +The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column +is the list of ingredients. + +## Input: +- scrapeBegin: The recipe number where the iteration should begin. +- scrapeEnd: The recipe number after which the iteration should and. +- csvPath: The path where the csv file is stored. + +## Examples: + +The example below downloads the recipes 2700 to 2702 and +stores them in the csv file 'recipedb.csv' in the current folder. + +```julia-repl +julia> scrapeRecipe(2700,2702,"./recipedb.csv") +``` +""" + for i = scrapeBegin:scrapeEnd + # get the webpage + htmlText = HTTP.request("GET","https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/$i") + htmlBody = parsehtml(String(htmlText.body)) + + # get the needed elements out of the webpage + recipeTitle = eachmatch(Selector("h3"),htmlBody.root)[1].children[1].text + print("recipe number $i : $recipeTitle\n") + ingredientTab = eachmatch(Selector("#ingredient_nutri"),htmlBody.root) + ingredientTabel = eachmatch(Selector("#myTable"),ingredientTab[1]) + ingredientLinks = eachmatch(Selector("td a"),ingredientTabel[1]) + ingredientList = [] + for ingredientLink in ingredientLinks + try + append!(ingredientList, [ingredientLink.children[1].text]) + catch y + end + end + + # write the data to the DB + if isfile(csvPath) + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) + else + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = false) + end + + end + print("done") +end # ╔═╡ cd5458a5-2136-4559-b4e5-2d91abea870c if downloadDB - missing + scrapeRecipe(106541,106641,"../data/BelgianRecipeDB.csv") +end + +# ╔═╡ 87b72838-260f-4ffb-ac79-03860165afa1 +function loadRecipeDBCSV(csvPath) + # read the dictionary from the csv file + print("Loading the recipe database.\n") + tempDict = CSV.File(csvPath) |> Dict + recipeDict = Dict() + + # parse the ingredient list to the right format + print("Parsing ingredients to right format.\n\n") + for recipe in keys(tempDict) + ingredientList = tempDict[recipe] + recipeDict[recipe] = eval(Meta.parse(ingredientList)) + end + return recipeDict +end + +# ╔═╡ adde7105-4a4a-453b-a7a8-9c9471dc29d3 +function createIngredientDatabase(recipeDict) + # create an unique vector of all ingredients used in the recipe database + ingredientList = [] + for ingredients in values(recipeDict) + append!(ingredientList,ingredients) + end + ingredientList = unique(ingredientList) + + return ingredientList +end + +# ╔═╡ 89e58385-4db9-4ae3-9495-d8a2e63f2d72 +function recipeToNumVector(fridgeList,ingredientList) +""" + recipeToNumVector(fridgeList,ingredientList) + +This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal +to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. +If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the ingredients used in a specific recipe. + +## Output: +- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, +that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +""" + numVector = zeros(Int64,length(fridgeList)+1) + for i in 1:length(fridgeList) + numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 + end + numVector[end] = length(ingredientList) - sum(numVector) + return numVector +end + +# ╔═╡ 3ed830c9-e3f7-4632-9ff3-cdd48c00f315 +function RandomCombo(fridgeList, recipeDict, numRecipes) +""" + randomCombo(fridgeList, recipeDict, numRecipes) + +This function gives a random combination of recipes from the provided recipe dictionary. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- randCombo: A dictionary containing a random combination of recipes. +""" + randCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + randIndex = rand(1:length(namesArray)) + tempRecipeName = namesArray[randIndex] + randCombo[tempRecipeName] = ingredientsArray[randIndex] + + if all(isone.(sum(values(randCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return randCombo +end + +# ╔═╡ 7365d57b-fd33-46af-9dcd-2c07908f64a3 +function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) +""" + removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + +This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. +It also uses a tabulist to stimulate the use of new solutions. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Output: +- neighbour: A dictionary containing a combination of recipes. + +""" + toRemove = rand(curSolution)[1] + # adapt the fridgeList so that only ingredients from the removed ingredient are available + tempFridgeList = copy(fridgeList) + for recipe in keys(curSolution) + if recipe != toRemove + tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + end + end + + # adapt the recipeDict and use greedy search to find a new solution + tempRecipeDict = copy(recipeDict) + for recipe in keys(curSolution) + delete!(tempRecipeDict,recipe) + end + + for recipe in tabuList + try delete!(tempRecipeDict,recipe) + catch e + end + end + + if randRecipe + neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) + else + neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + end + + # correct recipe vectors + for recipe in keys(neighbour) + neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) + end + + # here combine the two dictionaries + tempCurSolution = copy(curSolution) + delete!(tempCurSolution,toRemove) + neighbour = merge(neighbour,tempCurSolution) + + return neighbour end +# ╔═╡ a6e77624-606a-49ea-941d-8180cbd94a27 +compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient + +# ╔═╡ 644c2809-5b2b-4426-8deb-f952372a8438 +begin + +# objective function used to score a single recipe +fridgeObjective(x::Array{Int64}) = w_1 * sum(x[1:end-1]) + w_2 *sum(x[1:end-1] .== 0) + w_3 *x[end] + +# objective function used to score a combination of recipes +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 1)*w_1 + sum(sum(x) .== 0)*w_2 + sum(x)[end]*w_3 : Inf + +end + +# ╔═╡ ace6ecfa-319b-48f3-a675-51b4bc26abd0 +function greedyFindCombo(fridgeList, recipeDict, numRecipes) +""" + greedyFindCombo(fridgeList, recipeDict, numRecipes) + +This function uses greedy search to find a good combination of recipes that match your fridge content. +It ranks all recipes based on the following formula + +``score = (ingredients from fridge used) + 6*(ingredients in fridge remaining) + 2*(extra ingredients needed)`` + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- bestCombo: A dictionary containing the best found combination of recipes. + +""" + + bestCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + bestOrder = sortperm(ingredientsArray, by=fridgeObjective) + ingredientsArray = ingredientsArray[bestOrder] + namesArray = namesArray[bestOrder] + + tempRecipeName = namesArray[1] + bestCombo[tempRecipeName] = ingredientsArray[1] + + if all(isone.(sum(values(bestCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return bestCombo +end + +# ╔═╡ 6f1d6e44-30a1-42ee-b888-4cbb105b5348 +function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; + kT=100, # repetitions per temperature + r=0.75, # cooling rate + Tmax=4, # maximal temperature to start + Tmin=1, # minimal temperature to end + tabuLength=3) # number of cycli that recipe needs to be blocked + +""" + SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, r=0.75, Tmax=4, Tmin=1, tabuLength=3) + +This function uses simulated annealing to find a better combination of recipes that match your fridge content. +It starts with the current solution and tries to improve this. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Optional Inputs: +- kT: repetitions per temperature +- r: cooling rate +- Tmax: maximal temperature to start +- Tmin: minimal temperature to end +- tabuLength: Number of cycli that recipe needs to be blocked + +## Output: +- solution: A dictionary containing the best found combination of recipes. + +""" + + @assert 0 < Tmin < Tmax "Temperatures should be positive" + @assert 0 < r < 1 "cooling rate is between 0 and 1" + solution = curSolution + obj = fridgeObjective([i for i in values(solution)]) + tabuList = String[i for i in keys(curSolution)] + + # current temperature + T = Tmax + while T > Tmin + print("T = $T \n") + # repeat kT times + for i in 1:kT + sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor + obj_sn = fridgeObjective([i for i in values(sn)]) + # if the neighbor improves the solution, keep it + # otherwise accept with a probability determined by the + # Metropolis heuristic + if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) + solution = sn + obj = obj_sn + end + + for recipe in keys(sn) + if !in(recipe, tabuList) + if length(tabuList) < tabuLength + pushfirst!(tabuList,recipe) + else + pop!(tabuList) + pushfirst!(tabuList,recipe) + end + end + end + end + #track!(tracker, f, s) # not yet implemented, maybe later + + # decay temperature + T *= r + end + + return solution +end + +# ╔═╡ 9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) +""" + findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) + +This function combines all other functions. This function checks if your ingredients are in the database, +if not it offers possible alternatives. Next it uses simulated annealing to find a better recipe combination. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- dataPath: A relative or absolute path to a .csv or .jld2 file containing the recipe database. + +## Optional Inputs: +- numRecipes: The max amount of recipes that a combo should contain. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. + +## Output: +- SASolution: A dictionary containing the best found combination of recipes. + +""" + + # load the recipe dictionary from the db file + recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) + + # create a list of all ingredients in your database + ingredientList = createIngredientDatabase(recipeDict) + + # check for every food in your fridge if it's in the database. If not check if their are alternatives. + fridgeList = checkIngredients(fridgeList, ingredientList) + + # find the best greedy recipe + greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + print("greedySolution = $greedySolution\n") + + # find the best recipe with SA + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) + + # print the solution + print("The best recipes to make are:\n\n") + for recipeName in keys(SASolution) + print("$(recipeName) : $(recipeDict[recipeName])\n") + end + + return SASolution +end + +# ╔═╡ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" +Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +CSV = "~0.10.2" +Cascadia = "~1.0.1" +Gumbo = "~0.8.0" +HTTP = "~0.9.17" +JLD2 = "~0.4.18" +PlutoUI = "~0.7.32" +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[AbstractTrees]] +git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.3.4" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "9519274b50500b8029973d241d32cfbf0b127d97" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.2" + +[[Cascadia]] +deps = ["AbstractTrees", "Gumbo"] +git-tree-sha1 = "95629728197821d21a41778d0e0a49bc2d58ab9b" +uuid = "54eefc05-d75b-58de-a785-1a3403f0919f" +version = "1.0.1" + +[[CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "67551df041955cc6ee2ed098718c8fcd7fc7aebe" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.12.0" + +[[FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "04d13bfa8ef11720c24e4d840c0033d145537df7" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.17" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[Gumbo]] +deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] +git-tree-sha1 = "e711d08d896018037d6ff0ad4ebe675ca67119d4" +uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +version = "0.8.0" + +[[Gumbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" +uuid = "528830af-5a63-567c-a44a-034ed33b8444" +version = "0.10.2+0" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[HypertextLiteral]] +git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.3" + +[[IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "8d70835a3759cdd75881426fced1508bb7b7e1b6" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.1.1" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[JLD2]] +deps = ["DataStructures", "FileIO", "MacroTools", "Mmap", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "39f22411266cdd1621092c762a3f0648dbdc8433" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.18" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "22df5b96feef82434b07327e2d3c770a9b21e023" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.2.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "ae6145ca68947569058866e443df69587acc1806" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.32" + +[[PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "db3a23166af8aebf4db5ef87ac5b00d36eb771e2" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.0" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.3" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "15dfe6b103c2a993be24404124b8791a09460983" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.11" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.6.1" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.6" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.1" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + # ╔═╡ Cell order: -# ╟─8c6e005b-eb0b-4644-aa86-f5242770e87d # ╟─ae625e40-7f56-11ec-3cd5-d1244e23a3ba # ╟─06db3cc2-1680-49b9-a054-281a6b35205a +# ╟─3ad1af72-7096-4106-a3c7-47326695e2cb +# ╠═8e58f807-1db9-495e-8679-430f953292ea +# ╟─264b1eb5-c421-4a69-a55c-8fbbbb7715d1 +# ╟─c793a149-2cbe-462a-b69a-6ecab53320a6 +# ╟─52c497d7-36b9-4017-934a-1ea6190cbbb5 +# ╠═644c2809-5b2b-4426-8deb-f952372a8438 +# ╟─1752889a-513a-4620-add4-a9ca7fa92c8e +# ╟─a65c0925-7a67-4da3-9a6d-2ade8d3529e9 +# ╠═ace6ecfa-319b-48f3-a675-51b4bc26abd0 +# ╟─954fe2b3-171b-43ad-a1df-cbb3414988de +# ╠═6f1d6e44-30a1-42ee-b888-4cbb105b5348 +# ╟─7315f676-0d0e-43ae-8231-b6274dc5c8de +# ╠═3ed830c9-e3f7-4632-9ff3-cdd48c00f315 +# ╠═7365d57b-fd33-46af-9dcd-2c07908f64a3 +# ╟─b6205bd3-41da-45e0-81f1-a480a3f0e737 +# ╠═9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc +# ╟─6af2a6dd-ba7e-470e-8915-12ae6eff8357 # ╟─2f8fdff5-0d3f-4167-b415-e7f5f85e006b # ╠═cd5458a5-2136-4559-b4e5-2d91abea870c +# ╟─c51f2b76-fe4c-4c29-87dc-c7784e5200c2 +# ╟─09d6393c-9b14-4401-babe-708a88ef0a16 +# ╟─87b72838-260f-4ffb-ac79-03860165afa1 +# ╟─adde7105-4a4a-453b-a7a8-9c9471dc29d3 +# ╟─89e58385-4db9-4ae3-9495-d8a2e63f2d72 +# ╟─a6e77624-606a-49ea-941d-8180cbd94a27 +# ╟─00000000-0000-0000-0000-000000000001 +# ╟─00000000-0000-0000-0000-000000000002 From cc9be4d263a1d28a887ef834163525d3a6327fdb Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 14:54:57 +0100 Subject: [PATCH 18/57] forced push --- .gitignore | 2 +- Project.toml | 1 + src/recipeWebscraper.jl | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 0b3358c5..51c546f4 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,4 @@ docs/site/ Manifest.toml # Large Data Files -data +data/* diff --git a/Project.toml b/Project.toml index 27ce26db..b882aad7 100644 --- a/Project.toml +++ b/Project.toml @@ -5,3 +5,4 @@ Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +STMOZOO = "8e7dc78f-7190-4116-bf88-3d148ae9f088" diff --git a/src/recipeWebscraper.jl b/src/recipeWebscraper.jl index 457d3409..ada369bb 100644 --- a/src/recipeWebscraper.jl +++ b/src/recipeWebscraper.jl @@ -53,7 +53,12 @@ julia> scrapeRecipe(2700,2702,"./recipedb.csv") end # write the data to the DB - CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) + if isfile(csvPath) + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) + else + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = false) + end + end print("done") end From a00bf0935ab6298e9e952b85b143300187bbc53f Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 18:41:24 +0100 Subject: [PATCH 19/57] added more clarification to notebook --- notebook/fridgeNotebook.jl | 316 ++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 176 deletions(-) diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index eff66eb6..54ac0c31 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -34,28 +34,17 @@ This package tries to find the best recipes for you based on a recipe database. # ╔═╡ 3ad1af72-7096-4106-a3c7-47326695e2cb md""" ## Checking The Ingredients -If you want to optimize the fridge usage. It's best to know which ingredients are in the fridge. By checking all the ingredients and offering possible alternatives, it is easier for the algorithm to give better results. +If you want to optimize fridge usage. It's best to know which ingredients are in the fridge. By checking all the ingredients and offering possible alternatives, it is easier for the algorithm to give better results. For instance, cheese may be replaced by swiss cheese.\ +\ +It takes two inputs: +- The fridge list: A list containing the different foods in your fridge as a string. +- The ingredient list: A list containing all the different ingredients that are used in the recipe database. + +After searching for the different ingredients, it outputs an adapted fridge list. """ # ╔═╡ 8e58f807-1db9-495e-8679-430f953292ea function checkIngredients(fridgeList,ingredientList) -""" - checkIngredients(fridgeList,ingredientList) - -This function checks if the foods in your fridge are also found in the ingredient overview -of the recipe database. If they are not found in the database, regex is used to find possible alternatives. -For instance cheese may be replaced by swiss cheese. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- ingredientList: A list containing all the different ingredients that are used in the recipe database. - -## Output: -- fridgeList: The (adapted) given fridgeList - -""" - - print("Checking if the food in your fridge is found in our database.\n\n") # check if the ingredients in the fridge are found in the database @@ -106,14 +95,11 @@ Of course, we want to be able to score how good our objective function will be. # ╔═╡ c793a149-2cbe-462a-b69a-6ecab53320a6 md""" -``w_1``: $(@bind w_1 Slider(0:10))\ -``w_2``: $(@bind w_2 Slider(0:10))\ -``w_3``: $(@bind w_3 Slider(0:10))\ +``w_1``: $(@bind w_1 Slider(0:10, default=1, show_value=true))\ +``w_2``: $(@bind w_2 Slider(0:10, default=6, show_value=true))\ +``w_3``: $(@bind w_3 Slider(0:10, default=2, show_value=true))\ """ -# ╔═╡ 52c497d7-36b9-4017-934a-1ea6190cbbb5 -md"``w_1``: $(w_1) ``w_2``: $(w_2) ``w_3``: $(w_3)" - # ╔═╡ 1752889a-513a-4620-add4-a9ca7fa92c8e md""" ## The Search Algorithm @@ -122,34 +108,95 @@ Let's now take a look at the different search algorithms that you can use in the # ╔═╡ a65c0925-7a67-4da3-9a6d-2ade8d3529e9 md"""### Greedy Algorithm -It ranks all recipes based on the previously discussed objective function. +This algorithm works like the one seen in class. +It ranks all recipes based on the previously discussed objective function. Picks the best scoring recipe. Adapts the recipe options and picks the new best recipe. +It keeps repeating this until the amount of chosen recipes is equal to `numRecipes` or if there are no recipes left to pick.\ +\ +As an input, it takes the earlier mentioned `fridgeList`, a dictionary containing all the recipes and their ingredients (`recipeDict`) and, the max number of recipes that a combination should have (`numRecipes`). \ +\ +After searching, it outputs the best-found combination. """ # ╔═╡ 954fe2b3-171b-43ad-a1df-cbb3414988de md""" ### Simulated Annealing To improve our earlier result, we can use simulated annealing. The algorithm below is based on the one seen in class. The biggest difference is the fact that we also use a Tabu list to block recipes for a certain number of cycles. + +To start searching, it needs the earlier mentioned `fridgeList`, `recipeDict` and `numRecipes` but also the following things: +- `initSolution`: The initial solution from which it should start looking. +- `tabuList`: A list of recipes that should not be used in the found neighbour. +- `randRecipe`: A Boolean `true` or `false` value. When `true`, random recipes are used to create the neighbour. + +After searching it also outputs the best-found combination of recipes. +""" + +# ╔═╡ eee53924-fd20-44d8-a3eb-a2af9f9112b9 +md""" +To optimize this searching method, there are a lot of parameters that can be tweaked. +The following options are available: +- `kT`: repetitions per temperature +- `r`: cooling rate +- `Tmax`: maximal temperature to start +- `Tmin`: minimal temperature to end +- `tabuLength`: Number of cycles that recipe needs to be blocked + +You can experiment with them further on below! """ # ╔═╡ 7315f676-0d0e-43ae-8231-b6274dc5c8de md""" ### Neighbours -There are two types of neighbours to use. One is a random combination of recipes, the other is based on the Greedy Search algorithm. +There are two types of neighbours to use in the module. One uses a random combination of recipes, the other is based on the Greedy Search algorithm. Both are implemented in the `Neighbour()` function. """ +# ╔═╡ 134a2dd7-69d2-449e-82ab-5bfff90ede1b +md"""A neighbour is created by first removing a recipe from the current combination `curSolution`. Next, the Neighbour function looks for other recipes that are compatible with the other recipes that are in the current combination.""" + # ╔═╡ b6205bd3-41da-45e0-81f1-a480a3f0e737 md""" ## Overview Function -Finally we want to bring all the functions together in one. +Finally, we want to bring all the functions together in one clean overview function. +The only things that need to be provided are: +- A list containing the different foods in your fridge as a string. `fridgeList` +- A relative or absolute path to a .csv or .jld2 file containing the recipe database. `dataPath` + +Optionally you can also adapt the max amount of recipes in a combination (`numRecipes`) and wether or not random recipes should be used to create a neighbour (`randRecipe`). + """ # ╔═╡ 6af2a6dd-ba7e-470e-8915-12ae6eff8357 -md"## Example Time" +md"""## Example Time +To start of we'll need to get our hands on a recipe database. Don't fear if you don't have one laying around. By using the `scrapeRecipe()` function provided in this module, you can create a .csv file containing recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/). -# ╔═╡ 2f8fdff5-0d3f-4167-b415-e7f5f85e006b -md"""Download example recipe database: $(@bind downloadDB CheckBox())\ -\ -It is recommended to only use this once, otherwise you will have copies of some recipes in your database.""" +You just need to provide the following things: +- a starting recipe number +- a stopping recipe number +- the path to where the .csv file should be saved (you can copy this from your file explorer) + +Next al that is left to do is to check the `Download database now` box. Since this will take a few minutes we provide you with a 🍪 and some ☕, enjoy! +""" + +# ╔═╡ 656f211d-d1e8-4325-a12b-b89eca0351da +md""" +#### recipe database selection menu +Starting recipe number: $(@bind startNumber TextField(default="106541"))\ +Stopping recipe number: $(@bind endNumber TextField(default="106866"))\ +Filepath: $(@bind filePath TextField(default="../data/BelgianRecipeDB.csv"))\ +Download database now: $(@bind downloadDB CheckBox()) + +It is recommended to only use this once. Otherwise, you will have copies of some recipes in your database. +""" + +# ╔═╡ bf2725c1-55e6-4c6a-9b83-53f5984cae75 +md"Next it is time to look at the things we have left in our kitchen:" + +# ╔═╡ fd02d76a-0ae6-4869-96bb-516c536fb91d +fridgeList = ["chocolate", "potato", "salt", "cheese"] + +# ╔═╡ 34544e10-e4a1-4cfe-b0bc-43f8927bb19c +md""" +Now that we have a small database and the content of our fridge, we can start looking for a recipe combination. Keep an eye on your terminal since it is possible that you need to give some input! +""" # ╔═╡ c51f2b76-fe4c-4c29-87dc-c7784e5200c2 md""" @@ -215,7 +262,7 @@ end # ╔═╡ cd5458a5-2136-4559-b4e5-2d91abea870c if downloadDB - scrapeRecipe(106541,106641,"../data/BelgianRecipeDB.csv") + scrapeRecipe(parse(Int64,startNumber), parse(Int64,endNumber), filePath) end # ╔═╡ 87b72838-260f-4ffb-ac79-03860165afa1 @@ -273,20 +320,8 @@ that position in the vector is a 1. If not it is a 0. The last index of the vect end # ╔═╡ 3ed830c9-e3f7-4632-9ff3-cdd48c00f315 -function RandomCombo(fridgeList, recipeDict, numRecipes) -""" - randomCombo(fridgeList, recipeDict, numRecipes) - -This function gives a random combination of recipes from the provided recipe dictionary. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. +function randomCombo(fridgeList, recipeDict, numRecipes) -## Output: -- randCombo: A dictionary containing a random combination of recipes. -""" randCombo = Dict() ingredientsArray = [] namesArray = [] @@ -318,66 +353,6 @@ This function gives a random combination of recipes from the provided recipe dic return randCombo end -# ╔═╡ 7365d57b-fd33-46af-9dcd-2c07908f64a3 -function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) -""" - removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) - -This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. -It also uses a tabulist to stimulate the use of new solutions. - -## Input: -- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. -- tabuList: A list of recipes that should not be used in the found neighbour. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. - -## Output: -- neighbour: A dictionary containing a combination of recipes. - -""" - toRemove = rand(curSolution)[1] - # adapt the fridgeList so that only ingredients from the removed ingredient are available - tempFridgeList = copy(fridgeList) - for recipe in keys(curSolution) - if recipe != toRemove - tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] - end - end - - # adapt the recipeDict and use greedy search to find a new solution - tempRecipeDict = copy(recipeDict) - for recipe in keys(curSolution) - delete!(tempRecipeDict,recipe) - end - - for recipe in tabuList - try delete!(tempRecipeDict,recipe) - catch e - end - end - - if randRecipe - neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) - else - neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) - end - - # correct recipe vectors - for recipe in keys(neighbour) - neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) - end - - # here combine the two dictionaries - tempCurSolution = copy(curSolution) - delete!(tempCurSolution,toRemove) - neighbour = merge(neighbour,tempCurSolution) - - return neighbour -end - # ╔═╡ a6e77624-606a-49ea-941d-8180cbd94a27 compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient @@ -394,23 +369,6 @@ end # ╔═╡ ace6ecfa-319b-48f3-a675-51b4bc26abd0 function greedyFindCombo(fridgeList, recipeDict, numRecipes) -""" - greedyFindCombo(fridgeList, recipeDict, numRecipes) - -This function uses greedy search to find a good combination of recipes that match your fridge content. -It ranks all recipes based on the following formula - -``score = (ingredients from fridge used) + 6*(ingredients in fridge remaining) + 2*(extra ingredients needed)`` - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. - -## Output: -- bestCombo: A dictionary containing the best found combination of recipes. - -""" bestCombo = Dict() ingredientsArray = [] @@ -446,45 +404,62 @@ It ranks all recipes based on the following formula return bestCombo end +# ╔═╡ 7365d57b-fd33-46af-9dcd-2c07908f64a3 +function Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + + toRemove = rand(curSolution)[1] + # adapt the fridgeList so that only ingredients from the removed ingredient are available + tempFridgeList = copy(fridgeList) + for recipe in keys(curSolution) + if recipe != toRemove + tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + end + end + + # adapt the recipeDict and use greedy search to find a new solution + tempRecipeDict = copy(recipeDict) + for recipe in keys(curSolution) + delete!(tempRecipeDict,recipe) + end + + for recipe in tabuList + try delete!(tempRecipeDict,recipe) + catch e + end + end + + if randRecipe + neighbour = randomCombo(tempFridgeList, tempRecipeDict, numRecipes) + else + neighbour = greedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + end + + # correct recipe vectors + for recipe in keys(neighbour) + neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) + end + + # here combine the two dictionaries + tempCurSolution = copy(curSolution) + delete!(tempCurSolution,toRemove) + neighbour = merge(neighbour,tempCurSolution) + + return neighbour +end + # ╔═╡ 6f1d6e44-30a1-42ee-b888-4cbb105b5348 -function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; +function SAFindCombo(initSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, # repetitions per temperature r=0.75, # cooling rate Tmax=4, # maximal temperature to start Tmin=1, # minimal temperature to end tabuLength=3) # number of cycli that recipe needs to be blocked - -""" - SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, r=0.75, Tmax=4, Tmin=1, tabuLength=3) - -This function uses simulated annealing to find a better combination of recipes that match your fridge content. -It starts with the current solution and tries to improve this. - -## Input: -- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. -- tabuList: A list of recipes that should not be used in the found neighbour. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. - -## Optional Inputs: -- kT: repetitions per temperature -- r: cooling rate -- Tmax: maximal temperature to start -- Tmin: minimal temperature to end -- tabuLength: Number of cycli that recipe needs to be blocked - -## Output: -- solution: A dictionary containing the best found combination of recipes. - -""" @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" - solution = curSolution + solution = initSolution obj = fridgeObjective([i for i in values(solution)]) - tabuList = String[i for i in keys(curSolution)] + tabuList = String[i for i in keys(initSolution)] # current temperature T = Tmax @@ -492,7 +467,7 @@ It starts with the current solution and tries to improve this. print("T = $T \n") # repeat kT times for i in 1:kT - sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor + sn = Neighbour(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the @@ -513,7 +488,6 @@ It starts with the current solution and tries to improve this. end end end - #track!(tracker, f, s) # not yet implemented, maybe later # decay temperature T *= r @@ -524,24 +498,6 @@ end # ╔═╡ 9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) -""" - findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) - -This function combines all other functions. This function checks if your ingredients are in the database, -if not it offers possible alternatives. Next it uses simulated annealing to find a better recipe combination. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- dataPath: A relative or absolute path to a .csv or .jld2 file containing the recipe database. - -## Optional Inputs: -- numRecipes: The max amount of recipes that a combo should contain. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. - -## Output: -- SASolution: A dictionary containing the best found combination of recipes. - -""" # load the recipe dictionary from the db file recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) @@ -549,11 +505,11 @@ if not it offers possible alternatives. Next it uses simulated annealing to find # create a list of all ingredients in your database ingredientList = createIngredientDatabase(recipeDict) - # check for every food in your fridge if it's in the database. If not check if their are alternatives. + # check for every food in your fridge if it's in the database. If not check if there are alternatives. fridgeList = checkIngredients(fridgeList, ingredientList) # find the best greedy recipe - greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) print("greedySolution = $greedySolution\n") # find the best recipe with SA @@ -568,6 +524,9 @@ if not it offers possible alternatives. Next it uses simulated annealing to find return SASolution end +# ╔═╡ 3569550e-0157-4d7a-8cda-4df327c92b81 +findBestRecipe(fridgeList, filePath) + # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ [deps] @@ -975,21 +934,26 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╠═8e58f807-1db9-495e-8679-430f953292ea # ╟─264b1eb5-c421-4a69-a55c-8fbbbb7715d1 # ╟─c793a149-2cbe-462a-b69a-6ecab53320a6 -# ╟─52c497d7-36b9-4017-934a-1ea6190cbbb5 # ╠═644c2809-5b2b-4426-8deb-f952372a8438 # ╟─1752889a-513a-4620-add4-a9ca7fa92c8e # ╟─a65c0925-7a67-4da3-9a6d-2ade8d3529e9 # ╠═ace6ecfa-319b-48f3-a675-51b4bc26abd0 # ╟─954fe2b3-171b-43ad-a1df-cbb3414988de # ╠═6f1d6e44-30a1-42ee-b888-4cbb105b5348 +# ╟─eee53924-fd20-44d8-a3eb-a2af9f9112b9 # ╟─7315f676-0d0e-43ae-8231-b6274dc5c8de # ╠═3ed830c9-e3f7-4632-9ff3-cdd48c00f315 +# ╟─134a2dd7-69d2-449e-82ab-5bfff90ede1b # ╠═7365d57b-fd33-46af-9dcd-2c07908f64a3 # ╟─b6205bd3-41da-45e0-81f1-a480a3f0e737 # ╠═9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc # ╟─6af2a6dd-ba7e-470e-8915-12ae6eff8357 -# ╟─2f8fdff5-0d3f-4167-b415-e7f5f85e006b +# ╟─656f211d-d1e8-4325-a12b-b89eca0351da # ╠═cd5458a5-2136-4559-b4e5-2d91abea870c +# ╟─bf2725c1-55e6-4c6a-9b83-53f5984cae75 +# ╠═fd02d76a-0ae6-4869-96bb-516c536fb91d +# ╟─34544e10-e4a1-4cfe-b0bc-43f8927bb19c +# ╠═3569550e-0157-4d7a-8cda-4df327c92b81 # ╟─c51f2b76-fe4c-4c29-87dc-c7784e5200c2 # ╟─09d6393c-9b14-4401-babe-708a88ef0a16 # ╟─87b72838-260f-4ffb-ac79-03860165afa1 From ccbe8a20e482feec8fd53842abef03a97a60bfc8 Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 21:12:05 +0100 Subject: [PATCH 20/57] finalized fridge notebook --- notebook/example.jl | 159 ------ notebook/fridgeNotebook.jl | 84 ++- notebook/index.jl | 1022 ++++++++++++++++++++++++++++++++++++ src/example.jl | 61 --- 4 files changed, 1093 insertions(+), 233 deletions(-) delete mode 100644 notebook/example.jl create mode 100644 notebook/index.jl delete mode 100644 src/example.jl diff --git a/notebook/example.jl b/notebook/example.jl deleted file mode 100644 index 950417f0..00000000 --- a/notebook/example.jl +++ /dev/null @@ -1,159 +0,0 @@ -### A Pluto.jl notebook ### -# v0.14.8 - -using Markdown -using InteractiveUtils - -# ╔═╡ 5ad5c202-20f8-11eb-23f1-4f38b687c285 -using STMOZOO.Example - -# ╔═╡ d2d007b8-20f8-11eb-0ddd-1181d4565a85 -using Plots - -# ╔═╡ 45189a82-20fa-11eb-0423-05ce1b84639d -using Zygote - -# ╔═╡ 171fee18-20f6-11eb-37e5-2d04caea8c35 -md""" -# Example: solving quadratic systems - -By Michiel Stock - -## Introduction - -In this notebook, I have chosen to write code so minimize *quadratic functions* of the form: - -$$f(\mathbf{x}) = \frac{1}{2} \mathbf{x}^\intercal P\mathbf{x} + \mathbf{q} \cdot \mathbf{x} + r\,,$$ - -where $P \succ 0$. - -Hence, solving - -$$\min_\mathbf{x}\, f(\mathbf{x})\,.$$ -""" - -# ╔═╡ fb4aeb8c-20f7-11eb-0444-259de7b76883 -md""" - -## Derivation - -The gradient of the quadratic function is - -$$\nabla f(\mathbf{x})=P\mathbf{x} +\mathbf{q}\,.$$ - -Setting this to zero gives - -$$\mathbf{x}^\star=-P^{-1}\mathbf{q}\,.$$ - -We also know that $\nabla^2f(\mathbf{x}) = P \succ 0$, so $\mathbf{x}^\star$ is a minimizer. -""" - -# ╔═╡ 52e87238-20f8-11eb-2ea0-27ee1208d3c3 -md""" -## Illustration - -We will use a simple 2D example to illustrate this code. -""" - -# ╔═╡ e9a9d69e-20f8-11eb-0d9d-330ee5e9cf25 -P = [7 -1; -1 2] - -# ╔═╡ fdd4e550-20f8-11eb-227b-25f36708484d -q = [-14.0, -2.0] - -# ╔═╡ 025fd6e8-20f9-11eb-3e7d-3519f3c4b58f -r = 1 - -# ╔═╡ 096eff98-20f9-11eb-1e61-99d5714895ba -md"We have a function to generate the quadratic function." - -# ╔═╡ 165509ca-20f9-11eb-107c-550cbba0f0e9 -f_quadr = quadratic_function(P, q, r) - -# ╔═╡ 1fffc82a-20f9-11eb-198c-c160d7dac87d -f_quadr([2, 1]) - -# ╔═╡ 26ab6ce2-20f9-11eb-1836-1756b290e5e3 -md"No more need to remember the formulla for the minimizer! Just use `solve_quadratic_system`!" - -# ╔═╡ 49832a8e-20f9-11eb-0841-19a40a12db18 -x_star = solve_quadratic_system(P, q, r) - -# ╔═╡ 55e0e274-20f9-11eb-36c0-753f228f7e9b -begin - contourf(-20:0.1:20, -20:0.1:20, (x, y) -> f_quadr([x,y]), color=:speed) - scatter!([x_star[1]], [x_star[2]], label="minimizer") -end - -# ╔═╡ b1551758-20f9-11eb-3e8f-ff9a7127d7f8 -md""" -## Approximating non-quadratic functions - -We can approximate non-quadratic functions by a quadratic function: The second order Taylor approximation $\hat{f}$ of a function $f$ at $\mathbf{x}$ is -$$f(\mathbf{x}+\mathbf{v})\approx\hat{f}(\mathbf{x}+\mathbf{v}) = f(\mathbf{x}) + \nabla f(\mathbf{x})^\top \mathbf{v} + \frac{1}{2} \mathbf{v}^\top \nabla^2 f(\mathbf{x}) \mathbf{v}\,.$$ - -Let us use this idea for the Rosenbrock function. -""" - -# ╔═╡ 41d8f1dc-20fa-11eb-3586-a989427c1fd6 -f_nonquadr((x1, x2); a=1, b=5) = (a-x1)^2 + b * (x2 - x1^2)^2 - -# ╔═╡ 4ed4215e-20fa-11eb-11ee-f7741591163c -x = [0.0, 0.0] - -# ╔═╡ 56af99ee-20fa-11eb-0240-69c675efb78c -fx = f_nonquadr(x) - -# ╔═╡ 6c5473b4-20fa-11eb-327b-51ac560530eb -∇fx = f_nonquadr'(x) - -# ╔═╡ 7518c2c0-20fa-11eb-32c0-a9db2a91cbc5 -∇²fx = Zygote.hessian(f_nonquadr, x) - -# ╔═╡ 34027942-20fb-11eb-261e-3b991ce4c9f8 -v = solve_quadratic_system(∇²fx, ∇fx, fx) - -# ╔═╡ 3bbeb85c-20fc-11eb-04d0-fb12d8ace50a -f̂(x′) = quadratic_function(∇²fx, ∇fx, fx)(x′ .- x) - -# ╔═╡ 8623ac1a-20fa-11eb-2d45-49cce0fdac86 -begin - plot_nonquadr = contourf(-2:0.01:2, -2:0.01:2, (x, y) -> f_nonquadr([x,y]), color=:speed, title="non-quadratic function") - scatter!(plot_nonquadr, [x[1]], [x[2]], label="x") - scatter!(plot_nonquadr, [x[1]+v[1]], [x[2]+v[2]], label="x + v") - - plot_approx = contourf(-2:0.01:2, -2:0.01:2, (x, y) -> f̂([x,y]), color=:speed, - title="quadratic approximation") - scatter!(plot_approx, [x[1]], [x[2]], label="x") - scatter!(plot_approx, [x[1]+v[1]], [x[2]+v[2]], label="x + v") - - plot(plot_nonquadr, plot_approx, layout=(2,1), size=(600, 800)) - -end - - -# ╔═╡ Cell order: -# ╟─171fee18-20f6-11eb-37e5-2d04caea8c35 -# ╠═5ad5c202-20f8-11eb-23f1-4f38b687c285 -# ╠═d2d007b8-20f8-11eb-0ddd-1181d4565a85 -# ╟─fb4aeb8c-20f7-11eb-0444-259de7b76883 -# ╟─52e87238-20f8-11eb-2ea0-27ee1208d3c3 -# ╠═e9a9d69e-20f8-11eb-0d9d-330ee5e9cf25 -# ╠═fdd4e550-20f8-11eb-227b-25f36708484d -# ╠═025fd6e8-20f9-11eb-3e7d-3519f3c4b58f -# ╟─096eff98-20f9-11eb-1e61-99d5714895ba -# ╠═165509ca-20f9-11eb-107c-550cbba0f0e9 -# ╠═1fffc82a-20f9-11eb-198c-c160d7dac87d -# ╟─26ab6ce2-20f9-11eb-1836-1756b290e5e3 -# ╠═49832a8e-20f9-11eb-0841-19a40a12db18 -# ╠═55e0e274-20f9-11eb-36c0-753f228f7e9b -# ╟─b1551758-20f9-11eb-3e8f-ff9a7127d7f8 -# ╠═41d8f1dc-20fa-11eb-3586-a989427c1fd6 -# ╠═45189a82-20fa-11eb-0423-05ce1b84639d -# ╠═4ed4215e-20fa-11eb-11ee-f7741591163c -# ╠═56af99ee-20fa-11eb-0240-69c675efb78c -# ╠═6c5473b4-20fa-11eb-327b-51ac560530eb -# ╠═7518c2c0-20fa-11eb-32c0-a9db2a91cbc5 -# ╠═34027942-20fb-11eb-261e-3b991ce4c9f8 -# ╠═3bbeb85c-20fc-11eb-04d0-fb12d8ace50a -# ╟─8623ac1a-20fa-11eb-2d45-49cce0fdac86 diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index 54ac0c31..03f1898c 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -93,13 +93,6 @@ Of course, we want to be able to score how good our objective function will be. ``score = w_1 * u + w_2 * r + w_3*e`` """ -# ╔═╡ c793a149-2cbe-462a-b69a-6ecab53320a6 -md""" -``w_1``: $(@bind w_1 Slider(0:10, default=1, show_value=true))\ -``w_2``: $(@bind w_2 Slider(0:10, default=6, show_value=true))\ -``w_3``: $(@bind w_3 Slider(0:10, default=2, show_value=true))\ -""" - # ╔═╡ 1752889a-513a-4620-add4-a9ca7fa92c8e md""" ## The Search Algorithm @@ -179,12 +172,14 @@ Next al that is left to do is to check the `Download database now` box. Since th # ╔═╡ 656f211d-d1e8-4325-a12b-b89eca0351da md""" #### recipe database selection menu +The standard inputs are 106 541 to 106 866 since this downloads all the Belgian recipes. If you would like to download recipes from another country, please take a look at the explanation provided in the readme on the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). + Starting recipe number: $(@bind startNumber TextField(default="106541"))\ Stopping recipe number: $(@bind endNumber TextField(default="106866"))\ Filepath: $(@bind filePath TextField(default="../data/BelgianRecipeDB.csv"))\ Download database now: $(@bind downloadDB CheckBox()) -It is recommended to only use this once. Otherwise, you will have copies of some recipes in your database. +It is recommended to only use this once. Otherwise, you will have copies of some recipes in your database. So you better uncheck the box above! """ # ╔═╡ bf2725c1-55e6-4c6a-9b83-53f5984cae75 @@ -195,9 +190,46 @@ fridgeList = ["chocolate", "potato", "salt", "cheese"] # ╔═╡ 34544e10-e4a1-4cfe-b0bc-43f8927bb19c md""" -Now that we have a small database and the content of our fridge, we can start looking for a recipe combination. Keep an eye on your terminal since it is possible that you need to give some input! +Now that we have a small database and the content of our fridge, we can start looking for a recipe combination. Keep an eye on your terminal since it is possible that you need to give some input! If you are ready, check the box below! +""" + +# ╔═╡ 312fabf7-7d11-4bac-b52b-14de82d13e73 +md"Ready to start searching? $(@bind readyToSearch CheckBox())" + +# ╔═╡ 15a97461-7096-4ea0-acbc-edbc5db79cde +md""" +Congratulations! You made it through the notebook! +You can now continue to the **experimental section** below to play with the different parameters used in the algorithms. Enjoy the food! 🍔 +""" + +# ╔═╡ d49cf674-088f-47a1-9795-7641b3f01cd1 +md"""## Experimental Section +We will now load the .csv file and save it in a dictionary so that it doesn't need to load every time you run the simulated annealing algorithm. +""" + +# ╔═╡ 86f03d01-4f97-4487-9683-38f8dc9d826a +md""" +### Parameter Options: +**General**\ +`numRecipes` : $(@bind numRecipesExp Slider(1:10, default=3, show_value=true))\ +`tabuLength` : $(@bind tabuLengthExp Slider(1:15, default=5, show_value=true))\ +`randRecipe` : $(@bind randRecipeExp CheckBox())\ +\ +**Simulated Annealing specific**\ +`kT` : $(@bind kTExp Slider(20:10:150, default=100, show_value=true))\ +`r` : $(@bind rExp Slider(0.1:0.05:0.95, default=0.75, show_value=true))\ +`Tmax` : $(@bind TmaxExp Slider(2:10, default=4, show_value=true))\ +`Tmin` : $(@bind TminExp Slider(1:9, default=1, show_value=true))\ +\ +**Objective specific**\ +``w_1``: $(@bind w_1 Slider(0:10, default=1, show_value=true))\ +``w_2``: $(@bind w_2 Slider(0:10, default=6, show_value=true))\ +``w_3``: $(@bind w_3 Slider(0:10, default=2, show_value=true))\ """ +# ╔═╡ 70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 +md"Start experimenting: $(@bind startExperimenting CheckBox())" + # ╔═╡ c51f2b76-fe4c-4c29-87dc-c7784e5200c2 md""" ## Supporting Functions @@ -281,6 +313,11 @@ function loadRecipeDBCSV(csvPath) return recipeDict end +# ╔═╡ 11b589ff-3a09-4395-921a-872feb190022 +if isfile(filePath) + recipeDictExp = loadRecipeDBCSV(filePath) +end + # ╔═╡ adde7105-4a4a-453b-a7a8-9c9471dc29d3 function createIngredientDatabase(recipeDict) # create an unique vector of all ingredients used in the recipe database @@ -464,7 +501,6 @@ function SAFindCombo(initSolution, fridgeList, recipeDict, numRecipes, randReci # current temperature T = Tmax while T > Tmin - print("T = $T \n") # repeat kT times for i in 1:kT sn = Neighbour(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor @@ -510,7 +546,6 @@ function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) # find the best greedy recipe greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) - print("greedySolution = $greedySolution\n") # find the best recipe with SA SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) @@ -525,7 +560,24 @@ function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) end # ╔═╡ 3569550e-0157-4d7a-8cda-4df327c92b81 -findBestRecipe(fridgeList, filePath) +if readyToSearch + findBestRecipe(fridgeList, filePath) +end + +# ╔═╡ e10c7ddf-aef0-470a-be22-ac250d84fb7e +begin +if startExperimenting + greedySolutionExp = greedyFindCombo(fridgeList, recipeDictExp, numRecipesExp) + SASolutionExp = SAFindCombo(greedySolutionExp, fridgeList, recipeDictExp, numRecipesExp, randRecipeExp, kT=kTExp, r=rExp, Tmax=TmaxExp, Tmin=TminExp, tabuLength=tabuLengthExp) + + md""" + greedy output: $([recipe * ", " for recipe in keys(greedySolutionExp)])\ + SA output: $([recipe * ", " for recipe in keys(SASolutionExp)]) + """ +else + md"Check the `Start experimenting` checkbox to see the output of your parameter combination." +end +end # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ @@ -933,7 +985,6 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╟─3ad1af72-7096-4106-a3c7-47326695e2cb # ╠═8e58f807-1db9-495e-8679-430f953292ea # ╟─264b1eb5-c421-4a69-a55c-8fbbbb7715d1 -# ╟─c793a149-2cbe-462a-b69a-6ecab53320a6 # ╠═644c2809-5b2b-4426-8deb-f952372a8438 # ╟─1752889a-513a-4620-add4-a9ca7fa92c8e # ╟─a65c0925-7a67-4da3-9a6d-2ade8d3529e9 @@ -953,7 +1004,14 @@ uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" # ╟─bf2725c1-55e6-4c6a-9b83-53f5984cae75 # ╠═fd02d76a-0ae6-4869-96bb-516c536fb91d # ╟─34544e10-e4a1-4cfe-b0bc-43f8927bb19c +# ╟─312fabf7-7d11-4bac-b52b-14de82d13e73 # ╠═3569550e-0157-4d7a-8cda-4df327c92b81 +# ╟─15a97461-7096-4ea0-acbc-edbc5db79cde +# ╟─d49cf674-088f-47a1-9795-7641b3f01cd1 +# ╠═11b589ff-3a09-4395-921a-872feb190022 +# ╟─86f03d01-4f97-4487-9683-38f8dc9d826a +# ╟─70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 +# ╟─e10c7ddf-aef0-470a-be22-ac250d84fb7e # ╟─c51f2b76-fe4c-4c29-87dc-c7784e5200c2 # ╟─09d6393c-9b14-4401-babe-708a88ef0a16 # ╟─87b72838-260f-4ffb-ac79-03860165afa1 diff --git a/notebook/index.jl b/notebook/index.jl new file mode 100644 index 00000000..03f1898c --- /dev/null +++ b/notebook/index.jl @@ -0,0 +1,1022 @@ +### A Pluto.jl notebook ### +# v0.17.1 + +using Markdown +using InteractiveUtils + +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═╡ ae625e40-7f56-11ec-3cd5-d1244e23a3ba +begin +using PlutoUI, HTTP, Gumbo, Cascadia, CSV, JLD2 + +md"""# Fridge.jl +by *Ward Van Belle* +""" + +end + +# ╔═╡ 06db3cc2-1680-49b9-a054-281a6b35205a +md"""$(LocalResource("../FridgeLogo.png", :width => 150, :align => "right")) + +A package that optimizes your fridge use while reducing your waste pile!! + +This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store.""" + +# ╔═╡ 3ad1af72-7096-4106-a3c7-47326695e2cb +md""" +## Checking The Ingredients +If you want to optimize fridge usage. It's best to know which ingredients are in the fridge. By checking all the ingredients and offering possible alternatives, it is easier for the algorithm to give better results. For instance, cheese may be replaced by swiss cheese.\ +\ +It takes two inputs: +- The fridge list: A list containing the different foods in your fridge as a string. +- The ingredient list: A list containing all the different ingredients that are used in the recipe database. + +After searching for the different ingredients, it outputs an adapted fridge list. +""" + +# ╔═╡ 8e58f807-1db9-495e-8679-430f953292ea +function checkIngredients(fridgeList,ingredientList) + print("Checking if the food in your fridge is found in our database.\n\n") + + # check if the ingredients in the fridge are found in the database + for food in fridgeList + if food in ingredientList + print("Found $food in the ingredient database.\n") + else + print("Did not find $food in the ingredient database.\n\n") + if any(occursin.(food,ingredientList)) + print("Possible alternatives in database:\n") + alternatives = ingredientList[occursin.(food,ingredientList)] + for (indexNum, alternative) in enumerate(alternatives) + print("[$indexNum] $alternative\n") + end + print("If you want to take an alternative type its number, else type no.\n") + answer = readline() + if answer != "no" + correctInput = false + while !correctInput + try + answer = parse(Int64,answer) + correctInput = true + catch + print("Please only type the number of the alternative, eg. 1\n") + answer = readline() + end + end + fridgeList[fridgeList .== food] .= alternatives[answer] + print("Replaced $food with $(alternatives[answer])\n") + end + else + print("Did not find any alternative in the ingredient database.\n") + end + end + end + print("Done checking ingredients.\n\n") + + return fridgeList +end + +# ╔═╡ 264b1eb5-c421-4a69-a55c-8fbbbb7715d1 +md""" +## Objective Functions +Of course, we want to be able to score how good our objective function will be. This objective function is based on the following formula where ``u`` is the number of ingredients used from the fridge, ``r`` is the number of ingredients remaining in the fridge and ``e`` are the extra ingredients needed. ``w_1``, ``w_2`` and ``w_3`` are a set of weights. + +``score = w_1 * u + w_2 * r + w_3*e`` +""" + +# ╔═╡ 1752889a-513a-4620-add4-a9ca7fa92c8e +md""" +## The Search Algorithm +Let's now take a look at the different search algorithms that you can use in the Fridge.jl module. +""" + +# ╔═╡ a65c0925-7a67-4da3-9a6d-2ade8d3529e9 +md"""### Greedy Algorithm +This algorithm works like the one seen in class. +It ranks all recipes based on the previously discussed objective function. Picks the best scoring recipe. Adapts the recipe options and picks the new best recipe. +It keeps repeating this until the amount of chosen recipes is equal to `numRecipes` or if there are no recipes left to pick.\ +\ +As an input, it takes the earlier mentioned `fridgeList`, a dictionary containing all the recipes and their ingredients (`recipeDict`) and, the max number of recipes that a combination should have (`numRecipes`). \ +\ +After searching, it outputs the best-found combination. +""" + +# ╔═╡ 954fe2b3-171b-43ad-a1df-cbb3414988de +md""" +### Simulated Annealing +To improve our earlier result, we can use simulated annealing. The algorithm below is based on the one seen in class. The biggest difference is the fact that we also use a Tabu list to block recipes for a certain number of cycles. + +To start searching, it needs the earlier mentioned `fridgeList`, `recipeDict` and `numRecipes` but also the following things: +- `initSolution`: The initial solution from which it should start looking. +- `tabuList`: A list of recipes that should not be used in the found neighbour. +- `randRecipe`: A Boolean `true` or `false` value. When `true`, random recipes are used to create the neighbour. + +After searching it also outputs the best-found combination of recipes. +""" + +# ╔═╡ eee53924-fd20-44d8-a3eb-a2af9f9112b9 +md""" +To optimize this searching method, there are a lot of parameters that can be tweaked. +The following options are available: +- `kT`: repetitions per temperature +- `r`: cooling rate +- `Tmax`: maximal temperature to start +- `Tmin`: minimal temperature to end +- `tabuLength`: Number of cycles that recipe needs to be blocked + +You can experiment with them further on below! +""" + +# ╔═╡ 7315f676-0d0e-43ae-8231-b6274dc5c8de +md""" +### Neighbours +There are two types of neighbours to use in the module. One uses a random combination of recipes, the other is based on the Greedy Search algorithm. Both are implemented in the `Neighbour()` function. +""" + +# ╔═╡ 134a2dd7-69d2-449e-82ab-5bfff90ede1b +md"""A neighbour is created by first removing a recipe from the current combination `curSolution`. Next, the Neighbour function looks for other recipes that are compatible with the other recipes that are in the current combination.""" + +# ╔═╡ b6205bd3-41da-45e0-81f1-a480a3f0e737 +md""" +## Overview Function +Finally, we want to bring all the functions together in one clean overview function. +The only things that need to be provided are: +- A list containing the different foods in your fridge as a string. `fridgeList` +- A relative or absolute path to a .csv or .jld2 file containing the recipe database. `dataPath` + +Optionally you can also adapt the max amount of recipes in a combination (`numRecipes`) and wether or not random recipes should be used to create a neighbour (`randRecipe`). + +""" + +# ╔═╡ 6af2a6dd-ba7e-470e-8915-12ae6eff8357 +md"""## Example Time +To start of we'll need to get our hands on a recipe database. Don't fear if you don't have one laying around. By using the `scrapeRecipe()` function provided in this module, you can create a .csv file containing recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/). + +You just need to provide the following things: +- a starting recipe number +- a stopping recipe number +- the path to where the .csv file should be saved (you can copy this from your file explorer) + +Next al that is left to do is to check the `Download database now` box. Since this will take a few minutes we provide you with a 🍪 and some ☕, enjoy! +""" + +# ╔═╡ 656f211d-d1e8-4325-a12b-b89eca0351da +md""" +#### recipe database selection menu +The standard inputs are 106 541 to 106 866 since this downloads all the Belgian recipes. If you would like to download recipes from another country, please take a look at the explanation provided in the readme on the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). + +Starting recipe number: $(@bind startNumber TextField(default="106541"))\ +Stopping recipe number: $(@bind endNumber TextField(default="106866"))\ +Filepath: $(@bind filePath TextField(default="../data/BelgianRecipeDB.csv"))\ +Download database now: $(@bind downloadDB CheckBox()) + +It is recommended to only use this once. Otherwise, you will have copies of some recipes in your database. So you better uncheck the box above! +""" + +# ╔═╡ bf2725c1-55e6-4c6a-9b83-53f5984cae75 +md"Next it is time to look at the things we have left in our kitchen:" + +# ╔═╡ fd02d76a-0ae6-4869-96bb-516c536fb91d +fridgeList = ["chocolate", "potato", "salt", "cheese"] + +# ╔═╡ 34544e10-e4a1-4cfe-b0bc-43f8927bb19c +md""" +Now that we have a small database and the content of our fridge, we can start looking for a recipe combination. Keep an eye on your terminal since it is possible that you need to give some input! If you are ready, check the box below! +""" + +# ╔═╡ 312fabf7-7d11-4bac-b52b-14de82d13e73 +md"Ready to start searching? $(@bind readyToSearch CheckBox())" + +# ╔═╡ 15a97461-7096-4ea0-acbc-edbc5db79cde +md""" +Congratulations! You made it through the notebook! +You can now continue to the **experimental section** below to play with the different parameters used in the algorithms. Enjoy the food! 🍔 +""" + +# ╔═╡ d49cf674-088f-47a1-9795-7641b3f01cd1 +md"""## Experimental Section +We will now load the .csv file and save it in a dictionary so that it doesn't need to load every time you run the simulated annealing algorithm. +""" + +# ╔═╡ 86f03d01-4f97-4487-9683-38f8dc9d826a +md""" +### Parameter Options: +**General**\ +`numRecipes` : $(@bind numRecipesExp Slider(1:10, default=3, show_value=true))\ +`tabuLength` : $(@bind tabuLengthExp Slider(1:15, default=5, show_value=true))\ +`randRecipe` : $(@bind randRecipeExp CheckBox())\ +\ +**Simulated Annealing specific**\ +`kT` : $(@bind kTExp Slider(20:10:150, default=100, show_value=true))\ +`r` : $(@bind rExp Slider(0.1:0.05:0.95, default=0.75, show_value=true))\ +`Tmax` : $(@bind TmaxExp Slider(2:10, default=4, show_value=true))\ +`Tmin` : $(@bind TminExp Slider(1:9, default=1, show_value=true))\ +\ +**Objective specific**\ +``w_1``: $(@bind w_1 Slider(0:10, default=1, show_value=true))\ +``w_2``: $(@bind w_2 Slider(0:10, default=6, show_value=true))\ +``w_3``: $(@bind w_3 Slider(0:10, default=2, show_value=true))\ +""" + +# ╔═╡ 70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 +md"Start experimenting: $(@bind startExperimenting CheckBox())" + +# ╔═╡ c51f2b76-fe4c-4c29-87dc-c7784e5200c2 +md""" +## Supporting Functions +Below you can find all the supporting functions used in this notebook. These can also be found in the src folder in the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). Please do not adapt them. +""" + +# ╔═╡ 09d6393c-9b14-4401-babe-708a88ef0a16 +function scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) +""" + scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) + +Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. +The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. +To get a recipenumber one should look at the last number of the url of a certain recipe. +For example, the recipe for 'Speculoosbavarois' is number 106585. +The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column +is the list of ingredients. + +## Input: +- scrapeBegin: The recipe number where the iteration should begin. +- scrapeEnd: The recipe number after which the iteration should and. +- csvPath: The path where the csv file is stored. + +## Examples: + +The example below downloads the recipes 2700 to 2702 and +stores them in the csv file 'recipedb.csv' in the current folder. + +```julia-repl +julia> scrapeRecipe(2700,2702,"./recipedb.csv") +``` +""" + for i = scrapeBegin:scrapeEnd + # get the webpage + htmlText = HTTP.request("GET","https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/$i") + htmlBody = parsehtml(String(htmlText.body)) + + # get the needed elements out of the webpage + recipeTitle = eachmatch(Selector("h3"),htmlBody.root)[1].children[1].text + print("recipe number $i : $recipeTitle\n") + ingredientTab = eachmatch(Selector("#ingredient_nutri"),htmlBody.root) + ingredientTabel = eachmatch(Selector("#myTable"),ingredientTab[1]) + ingredientLinks = eachmatch(Selector("td a"),ingredientTabel[1]) + ingredientList = [] + for ingredientLink in ingredientLinks + try + append!(ingredientList, [ingredientLink.children[1].text]) + catch y + end + end + + # write the data to the DB + if isfile(csvPath) + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) + else + CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = false) + end + + end + print("done") +end + +# ╔═╡ cd5458a5-2136-4559-b4e5-2d91abea870c +if downloadDB + scrapeRecipe(parse(Int64,startNumber), parse(Int64,endNumber), filePath) +end + +# ╔═╡ 87b72838-260f-4ffb-ac79-03860165afa1 +function loadRecipeDBCSV(csvPath) + # read the dictionary from the csv file + print("Loading the recipe database.\n") + tempDict = CSV.File(csvPath) |> Dict + recipeDict = Dict() + + # parse the ingredient list to the right format + print("Parsing ingredients to right format.\n\n") + for recipe in keys(tempDict) + ingredientList = tempDict[recipe] + recipeDict[recipe] = eval(Meta.parse(ingredientList)) + end + return recipeDict +end + +# ╔═╡ 11b589ff-3a09-4395-921a-872feb190022 +if isfile(filePath) + recipeDictExp = loadRecipeDBCSV(filePath) +end + +# ╔═╡ adde7105-4a4a-453b-a7a8-9c9471dc29d3 +function createIngredientDatabase(recipeDict) + # create an unique vector of all ingredients used in the recipe database + ingredientList = [] + for ingredients in values(recipeDict) + append!(ingredientList,ingredients) + end + ingredientList = unique(ingredientList) + + return ingredientList +end + +# ╔═╡ 89e58385-4db9-4ae3-9495-d8a2e63f2d72 +function recipeToNumVector(fridgeList,ingredientList) +""" + recipeToNumVector(fridgeList,ingredientList) + +This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal +to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. +If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the ingredients used in a specific recipe. + +## Output: +- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, +that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +""" + numVector = zeros(Int64,length(fridgeList)+1) + for i in 1:length(fridgeList) + numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 + end + numVector[end] = length(ingredientList) - sum(numVector) + return numVector +end + +# ╔═╡ 3ed830c9-e3f7-4632-9ff3-cdd48c00f315 +function randomCombo(fridgeList, recipeDict, numRecipes) + + randCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + randIndex = rand(1:length(namesArray)) + tempRecipeName = namesArray[randIndex] + randCombo[tempRecipeName] = ingredientsArray[randIndex] + + if all(isone.(sum(values(randCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return randCombo +end + +# ╔═╡ a6e77624-606a-49ea-941d-8180cbd94a27 +compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient + +# ╔═╡ 644c2809-5b2b-4426-8deb-f952372a8438 +begin + +# objective function used to score a single recipe +fridgeObjective(x::Array{Int64}) = w_1 * sum(x[1:end-1]) + w_2 *sum(x[1:end-1] .== 0) + w_3 *x[end] + +# objective function used to score a combination of recipes +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 1)*w_1 + sum(sum(x) .== 0)*w_2 + sum(x)[end]*w_3 : Inf + +end + +# ╔═╡ ace6ecfa-319b-48f3-a675-51b4bc26abd0 +function greedyFindCombo(fridgeList, recipeDict, numRecipes) + + bestCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + bestOrder = sortperm(ingredientsArray, by=fridgeObjective) + ingredientsArray = ingredientsArray[bestOrder] + namesArray = namesArray[bestOrder] + + tempRecipeName = namesArray[1] + bestCombo[tempRecipeName] = ingredientsArray[1] + + if all(isone.(sum(values(bestCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return bestCombo +end + +# ╔═╡ 7365d57b-fd33-46af-9dcd-2c07908f64a3 +function Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + + toRemove = rand(curSolution)[1] + # adapt the fridgeList so that only ingredients from the removed ingredient are available + tempFridgeList = copy(fridgeList) + for recipe in keys(curSolution) + if recipe != toRemove + tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + end + end + + # adapt the recipeDict and use greedy search to find a new solution + tempRecipeDict = copy(recipeDict) + for recipe in keys(curSolution) + delete!(tempRecipeDict,recipe) + end + + for recipe in tabuList + try delete!(tempRecipeDict,recipe) + catch e + end + end + + if randRecipe + neighbour = randomCombo(tempFridgeList, tempRecipeDict, numRecipes) + else + neighbour = greedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + end + + # correct recipe vectors + for recipe in keys(neighbour) + neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) + end + + # here combine the two dictionaries + tempCurSolution = copy(curSolution) + delete!(tempCurSolution,toRemove) + neighbour = merge(neighbour,tempCurSolution) + + return neighbour +end + +# ╔═╡ 6f1d6e44-30a1-42ee-b888-4cbb105b5348 +function SAFindCombo(initSolution, fridgeList, recipeDict, numRecipes, randRecipe; + kT=100, # repetitions per temperature + r=0.75, # cooling rate + Tmax=4, # maximal temperature to start + Tmin=1, # minimal temperature to end + tabuLength=3) # number of cycli that recipe needs to be blocked + + @assert 0 < Tmin < Tmax "Temperatures should be positive" + @assert 0 < r < 1 "cooling rate is between 0 and 1" + solution = initSolution + obj = fridgeObjective([i for i in values(solution)]) + tabuList = String[i for i in keys(initSolution)] + + # current temperature + T = Tmax + while T > Tmin + # repeat kT times + for i in 1:kT + sn = Neighbour(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor + obj_sn = fridgeObjective([i for i in values(sn)]) + # if the neighbor improves the solution, keep it + # otherwise accept with a probability determined by the + # Metropolis heuristic + if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) + solution = sn + obj = obj_sn + end + + for recipe in keys(sn) + if !in(recipe, tabuList) + if length(tabuList) < tabuLength + pushfirst!(tabuList,recipe) + else + pop!(tabuList) + pushfirst!(tabuList,recipe) + end + end + end + end + + # decay temperature + T *= r + end + + return solution +end + +# ╔═╡ 9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) + + # load the recipe dictionary from the db file + recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) + + # create a list of all ingredients in your database + ingredientList = createIngredientDatabase(recipeDict) + + # check for every food in your fridge if it's in the database. If not check if there are alternatives. + fridgeList = checkIngredients(fridgeList, ingredientList) + + # find the best greedy recipe + greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) + + # find the best recipe with SA + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) + + # print the solution + print("The best recipes to make are:\n\n") + for recipeName in keys(SASolution) + print("$(recipeName) : $(recipeDict[recipeName])\n") + end + + return SASolution +end + +# ╔═╡ 3569550e-0157-4d7a-8cda-4df327c92b81 +if readyToSearch + findBestRecipe(fridgeList, filePath) +end + +# ╔═╡ e10c7ddf-aef0-470a-be22-ac250d84fb7e +begin +if startExperimenting + greedySolutionExp = greedyFindCombo(fridgeList, recipeDictExp, numRecipesExp) + SASolutionExp = SAFindCombo(greedySolutionExp, fridgeList, recipeDictExp, numRecipesExp, randRecipeExp, kT=kTExp, r=rExp, Tmax=TmaxExp, Tmin=TminExp, tabuLength=tabuLengthExp) + + md""" + greedy output: $([recipe * ", " for recipe in keys(greedySolutionExp)])\ + SA output: $([recipe * ", " for recipe in keys(SASolutionExp)]) + """ +else + md"Check the `Start experimenting` checkbox to see the output of your parameter combination." +end +end + +# ╔═╡ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" +Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" + +[compat] +CSV = "~0.10.2" +Cascadia = "~1.0.1" +Gumbo = "~0.8.0" +HTTP = "~0.9.17" +JLD2 = "~0.4.18" +PlutoUI = "~0.7.32" +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[AbstractTrees]] +git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.3.4" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] +git-tree-sha1 = "9519274b50500b8029973d241d32cfbf0b127d97" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.2" + +[[Cascadia]] +deps = ["AbstractTrees", "Gumbo"] +git-tree-sha1 = "95629728197821d21a41778d0e0a49bc2d58ab9b" +uuid = "54eefc05-d75b-58de-a785-1a3403f0919f" +version = "1.0.1" + +[[CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.0" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "67551df041955cc6ee2ed098718c8fcd7fc7aebe" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.12.0" + +[[FilePathsBase]] +deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] +git-tree-sha1 = "04d13bfa8ef11720c24e4d840c0033d145537df7" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.17" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[Gumbo]] +deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] +git-tree-sha1 = "e711d08d896018037d6ff0ad4ebe675ca67119d4" +uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" +version = "0.8.0" + +[[Gumbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" +uuid = "528830af-5a63-567c-a44a-034ed33b8444" +version = "0.10.2+0" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[HypertextLiteral]] +git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.3" + +[[IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InlineStrings]] +deps = ["Parsers"] +git-tree-sha1 = "8d70835a3759cdd75881426fced1508bb7b7e1b6" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.1.1" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[JLD2]] +deps = ["DataStructures", "FileIO", "MacroTools", "Mmap", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "39f22411266cdd1621092c762a3f0648dbdc8433" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.18" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "22df5b96feef82434b07327e2d3c770a9b21e023" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.2.0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "ae6145ca68947569058866e443df69587acc1806" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.32" + +[[PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "db3a23166af8aebf4db5ef87ac5b00d36eb771e2" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.0" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.3" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "15dfe6b103c2a993be24404124b8791a09460983" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.11" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.6.1" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[TranscodingStreams]] +deps = ["Random", "Test"] +git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.9.6" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.1" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +""" + +# ╔═╡ Cell order: +# ╟─ae625e40-7f56-11ec-3cd5-d1244e23a3ba +# ╟─06db3cc2-1680-49b9-a054-281a6b35205a +# ╟─3ad1af72-7096-4106-a3c7-47326695e2cb +# ╠═8e58f807-1db9-495e-8679-430f953292ea +# ╟─264b1eb5-c421-4a69-a55c-8fbbbb7715d1 +# ╠═644c2809-5b2b-4426-8deb-f952372a8438 +# ╟─1752889a-513a-4620-add4-a9ca7fa92c8e +# ╟─a65c0925-7a67-4da3-9a6d-2ade8d3529e9 +# ╠═ace6ecfa-319b-48f3-a675-51b4bc26abd0 +# ╟─954fe2b3-171b-43ad-a1df-cbb3414988de +# ╠═6f1d6e44-30a1-42ee-b888-4cbb105b5348 +# ╟─eee53924-fd20-44d8-a3eb-a2af9f9112b9 +# ╟─7315f676-0d0e-43ae-8231-b6274dc5c8de +# ╠═3ed830c9-e3f7-4632-9ff3-cdd48c00f315 +# ╟─134a2dd7-69d2-449e-82ab-5bfff90ede1b +# ╠═7365d57b-fd33-46af-9dcd-2c07908f64a3 +# ╟─b6205bd3-41da-45e0-81f1-a480a3f0e737 +# ╠═9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc +# ╟─6af2a6dd-ba7e-470e-8915-12ae6eff8357 +# ╟─656f211d-d1e8-4325-a12b-b89eca0351da +# ╠═cd5458a5-2136-4559-b4e5-2d91abea870c +# ╟─bf2725c1-55e6-4c6a-9b83-53f5984cae75 +# ╠═fd02d76a-0ae6-4869-96bb-516c536fb91d +# ╟─34544e10-e4a1-4cfe-b0bc-43f8927bb19c +# ╟─312fabf7-7d11-4bac-b52b-14de82d13e73 +# ╠═3569550e-0157-4d7a-8cda-4df327c92b81 +# ╟─15a97461-7096-4ea0-acbc-edbc5db79cde +# ╟─d49cf674-088f-47a1-9795-7641b3f01cd1 +# ╠═11b589ff-3a09-4395-921a-872feb190022 +# ╟─86f03d01-4f97-4487-9683-38f8dc9d826a +# ╟─70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 +# ╟─e10c7ddf-aef0-470a-be22-ac250d84fb7e +# ╟─c51f2b76-fe4c-4c29-87dc-c7784e5200c2 +# ╟─09d6393c-9b14-4401-babe-708a88ef0a16 +# ╟─87b72838-260f-4ffb-ac79-03860165afa1 +# ╟─adde7105-4a4a-453b-a7a8-9c9471dc29d3 +# ╟─89e58385-4db9-4ae3-9495-d8a2e63f2d72 +# ╟─a6e77624-606a-49ea-941d-8180cbd94a27 +# ╟─00000000-0000-0000-0000-000000000001 +# ╟─00000000-0000-0000-0000-000000000002 diff --git a/src/example.jl b/src/example.jl deleted file mode 100644 index 7fc131da..00000000 --- a/src/example.jl +++ /dev/null @@ -1,61 +0,0 @@ -# Michiel Stock -# Example of a source code file implementing a module. - - -# all your code is part of the module you are implementing -module Example - -# you have to import everything you need for your module to work -# if you use a new package, don't forget to add it in the package manager -using LinearAlgebra - -# export all functions that are relevant for the user -export solve_quadratic_system, quadratic_function - -""" - solve_quadratic_system(P, q, r=0; testPD=false) - -Find the minimizer of a canonical quadratic system: - -``f(x) = 0.5xᵀ P x + x ⋅ q + r`` - -with `P` a positive scalar or a positive-definite n x n matrix and `q` a scalar or -a n x n vector. The intercept `r` can optionally be given but does not influence -the minimizer. One can use the keyword argument `testPD` to test if `P` is positive definite, -though this comes at a computational cost. - -## Examples - -Scalar case: - -```julia-repl -julia> solve_quadratic_system(8, -4, 3) -0.5 -``` - -Vector case: - -```julia-repl -julia> P = [3 1; 1 2]; - -julia> q = [0.5, -2]; - -julia> solve_quadratic_system(P, q) -2-element Array{Float64,1}: - -0.6 - 1.2999999999999998 -``` -""" -function solve_quadratic_system(P, q, r=0; testPD=false) - testPD && @assert isposdef(P) "Provided P is not positive definite" - return - P \ q -end - -""" - quadratic_function(P, q, r) - -Give the paramters of a canonical quatratic function and returns a function. -""" -quadratic_function(P, q, r) = x -> 0.5x' * P * x + q ⋅ x + r - -end \ No newline at end of file From 1c82da2f5cba2a248460537a421aca8735b43ed4 Mon Sep 17 00:00:00 2001 From: warvbell Date: Thu, 27 Jan 2022 23:17:52 +0100 Subject: [PATCH 21/57] fixed bugs with documenter --- Project.toml | 10 ++++++++-- docs/make.jl | 8 +++++--- docs/src/assets/logo.png | Bin 0 -> 366179 bytes src/fridge.jl | 34 ++++++++++++++++++---------------- src/recipeWebscraper.jl | 3 ++- 5 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 docs/src/assets/logo.png diff --git a/Project.toml b/Project.toml index b882aad7..6a1e664d 100644 --- a/Project.toml +++ b/Project.toml @@ -1,8 +1,14 @@ +name = "STMOZOO" +uuid = "8e7dc78f-7190-4116-bf88-3d148ae9f088" +authors = ["michielstock "] +version = "0.1.0" + [deps] +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" -JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -STMOZOO = "8e7dc78f-7190-4116-bf88-3d148ae9f088" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" \ No newline at end of file diff --git a/docs/make.jl b/docs/make.jl index 8902ab62..d75783e9 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,13 +1,15 @@ -using Documenter, STMOZOO +using Documenter + +using STMOZOO using STMOZOO.Fridge makedocs(sitename="Fridge.jl", format = Documenter.HTML(), modules=[Fridge], # add your module - pages=Any[ + pages=[ "index.md", "main function" => "man/mainFunction.md", - "search algorithms" => "man/searchAlgorithms", + "search algorithms" => "man/searchAlgorithms.md", "recipe webscraper"=> "man/recipeWebscraper.md", ]) diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..aa50b00a54d87580771903eeb655afca7fdb1f55 GIT binary patch literal 366179 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 z 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$MkBZiRw*eTA+Wof#l& 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

pO?)Aovb|X5r3Wz(Hy(j^9yiKL7g`#dIyO>(M~* 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 LOixGPsCE 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 scrapeRecipe(2700,2702,"./recipedb.csv") ``` """ +function scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) + for i = scrapeBegin:scrapeEnd # get the webpage htmlText = HTTP.request("GET","https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/$i") From 395e438184dc5146fbb9d537a5eacc5a202d5f9e Mon Sep 17 00:00:00 2001 From: warvbell Date: Fri, 28 Jan 2022 09:50:59 +0100 Subject: [PATCH 22/57] changed localResource to Resource in fridge notebook --- notebook/fridgeNotebook.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index 03f1898c..8720f2b6 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -25,7 +25,7 @@ by *Ward Van Belle* end # ╔═╡ 06db3cc2-1680-49b9-a054-281a6b35205a -md"""$(LocalResource("../FridgeLogo.png", :width => 150, :align => "right")) +md"""$(Resource("https://github.com/wardvanbelle/Fridge.jl/raw/master/FridgeLogo.png", :width => 150, :align => "right")) A package that optimizes your fridge use while reducing your waste pile!! From 1bc0c78d1c2c573edcdd5340c190532b85fc912b Mon Sep 17 00:00:00 2001 From: warvbell Date: Sat, 29 Jan 2022 13:00:41 +0100 Subject: [PATCH 23/57] created docs page --- docs/make.jl | 10 ++++------ docs/src/{man => }/mainFunction.md | 0 docs/src/{man => }/recipeWebscraper.md | 0 docs/src/{man => }/searchAlgorithms.md | 0 4 files changed, 4 insertions(+), 6 deletions(-) rename docs/src/{man => }/mainFunction.md (100%) rename docs/src/{man => }/recipeWebscraper.md (100%) rename docs/src/{man => }/searchAlgorithms.md (100%) diff --git a/docs/make.jl b/docs/make.jl index d75783e9..627211fc 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -8,13 +8,11 @@ makedocs(sitename="Fridge.jl", modules=[Fridge], # add your module pages=[ "index.md", - "main function" => "man/mainFunction.md", - "search algorithms" => "man/searchAlgorithms.md", - "recipe webscraper"=> "man/recipeWebscraper.md", + "main function" => "mainFunction.md", + "search algorithms" => "searchAlgorithms.md", + "recipe webscraper"=> "recipeWebscraper.md", ]) -#= deploydocs( repo = "github.com/wardvanbelle/Fridge.jl", - ) -=# \ No newline at end of file + ) \ No newline at end of file diff --git a/docs/src/man/mainFunction.md b/docs/src/mainFunction.md similarity index 100% rename from docs/src/man/mainFunction.md rename to docs/src/mainFunction.md diff --git a/docs/src/man/recipeWebscraper.md b/docs/src/recipeWebscraper.md similarity index 100% rename from docs/src/man/recipeWebscraper.md rename to docs/src/recipeWebscraper.md diff --git a/docs/src/man/searchAlgorithms.md b/docs/src/searchAlgorithms.md similarity index 100% rename from docs/src/man/searchAlgorithms.md rename to docs/src/searchAlgorithms.md From bec2b9b47816bce503a92eeb0f0bde1cd7024f69 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sat, 29 Jan 2022 17:17:10 +0100 Subject: [PATCH 24/57] add link to documentation to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 737d6223..03294dd6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Fridge.jl +[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/) \ +\ by Ward Van Belle From cf7fd6efc87573ec1dbf691661ef6f0b8f8c5b1d Mon Sep 17 00:00:00 2001 From: warvbell Date: Sat, 29 Jan 2022 20:57:32 +0100 Subject: [PATCH 25/57] trying Travis CI --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03294dd6..adbb315d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fridge.jl -[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/) \ +[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/) [![Coverage Status](https://coveralls.io/repos/github/wardvanbelle/Fridge.jl/badge.svg?branch=master)](https://coveralls.io/github/wardvanbelle/Fridge.jl?branch=master)\ \ by Ward Van Belle From 44ea75da7d269bc099fc90304e4fd17685a2bf73 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 10:08:44 +0100 Subject: [PATCH 26/57] added CI --- .github/workflows/ExportPluto.yaml | 56 ------------------------ .github/workflows/ci.yml | 68 ++++++++++++++++++++++++++++++ .travis.yml | 24 ----------- Project.toml | 8 ++-- test/fridgeTest.jl | 17 ++++++-- test/runtests.jl | 2 +- 6 files changed, 88 insertions(+), 87 deletions(-) delete mode 100644 .github/workflows/ExportPluto.yaml create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/ExportPluto.yaml b/.github/workflows/ExportPluto.yaml deleted file mode 100644 index 4c6aa2c9..00000000 --- a/.github/workflows/ExportPluto.yaml +++ /dev/null @@ -1,56 +0,0 @@ -name: Export Pluto notebooks -on: - push: - branches: - - main - - master - workflow_dispatch: - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - - - name: Install Julia - uses: julia-actions/setup-julia@v1 - with: - version: 1.7 - - - # We set up a folder that Pluto can use to cache exported notebooks. If the notebook file did not change, then Pluto can take the exported file from cache instead of running the notebook. - - name: Set up notebook state cache - uses: actions/cache@v2 - with: - path: pluto_state_cache - key: ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }}-${{ hashFiles('**/*jl') }} - restore-keys: | - ${{ runner.os }}-pluto_state_cache-v2-${{ hashFiles('**/Project.toml', '**/Manifest.toml', '.github/workflows/*' ) }} - - - - name: Run & export Pluto notebooks - run: | - julia -e 'using Pkg - Pkg.activate(mktempdir()) - Pkg.add([ - Pkg.PackageSpec(name="PlutoSliderServer", version="0.3.2-0.3"), - ]) - - import PlutoSliderServer - - PlutoSliderServer.github_action("."; - Export_cache_dir="pluto_state_cache", - Export_baked_notebookfile=false, - Export_baked_state=false, - # more parameters can go here - )' - - - - name: Deploy to gh-pages - uses: JamesIves/github-pages-deploy-action@releases/v3 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: ./notebook \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..d653d467 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,68 @@ +name: CI +on: + pull_request: + branches: + - master + push: + branches: + - master + tags: '*' +jobs: + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.6' # Replace this with the minimum Julia version that your package supports. E.g. if your package requires Julia 1.5 or higher, change this to '1.5'. + - '1' # Leave this line unchanged. '1' will automatically expand to the latest stable 1.x release of Julia. + - 'nightly' + os: + - ubuntu-latest + arch: + - x64 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v1 + with: + file: lcov.info + docs: + name: Documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: '1' + - run: | + julia --project=docs -e ' + using Pkg + Pkg.develop(PackageSpec(path=pwd())) + Pkg.instantiate()' + - run: | + julia --project=docs -e ' + using Documenter: doctest + using STMOZOO + doctest(STMOZOO)' # change MYPACKAGE to the name of your package + - run: julia --project=docs docs/make.jl + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4f71fa6b..00000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -codecov: true -coveralls: true - -language: julia -os: - - linux - - osx - - windows -julia: - - 1.5 -notifications: - email: false -git: - depth: 99999999 -jobs: - include: - - stage: "Documentation" - julia: 1.5 - os: linux - script: - - julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); - Pkg.instantiate()' - - julia --project=docs/ docs/make.jl - after_success: skip \ No newline at end of file diff --git a/Project.toml b/Project.toml index 6a1e664d..4d05ace2 100644 --- a/Project.toml +++ b/Project.toml @@ -4,11 +4,13 @@ authors = ["michielstock "] version = "0.1.0" [deps] -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" +Coverage = "a2441757-f6aa-5fb2-8edb-039e3f45d037" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8" Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" -JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" \ No newline at end of file +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 68f4cc4a..8a9b8102 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -1,4 +1,15 @@ -testList = ["cheese","potato","tomato","cabbage","beetroot","cauliflower"] -testList2 = ["cheese","potato","tomato","cabbage"] +# testset for the Fridge.jl package +@testset "Fridge" begin + using STMOZOO.Fridge -test = findBestRecipe(testList, "./data/recipeDB.jld2", numRecipes=10, randRecipe=true) + testList = ["cheese","potato","tomato","cabbage"] + + @testset "checkIngredients" begin + # check if all ingredients are passed if no replacement is needed + @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) == testList + + # test for type + @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) isa Vector{String} + end + +end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index ff9b0f7e..b7676937 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,4 @@ using Test -include("example.jl") +include("fridgeTest.jl") # add here the file with your unit tests \ No newline at end of file From 5aa4902bc453019c2c9a96ebe17a561126b46f94 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 18:34:29 +0100 Subject: [PATCH 27/57] further fixing the ci --- .github/workflows/ci.yml | 68 +++++++--------------------------------- 1 file changed, 12 insertions(+), 56 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d653d467..dc20f71e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,68 +1,24 @@ name: CI + on: - pull_request: - branches: - - master push: branches: - master tags: '*' + pull_request: + jobs: - test: - name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - version: - - '1.6' # Replace this with the minimum Julia version that your package supports. E.g. if your package requires Julia 1.5 or higher, change this to '1.5'. - - '1' # Leave this line unchanged. '1' will automatically expand to the latest stable 1.x release of Julia. - - 'nightly' - os: - - ubuntu-latest - arch: - - x64 - steps: - - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@v1 - with: - version: ${{ matrix.version }} - arch: ${{ matrix.arch }} - - uses: actions/cache@v1 - env: - cache-name: cache-artifacts - with: - path: ~/.julia/artifacts - key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} - restore-keys: | - ${{ runner.os }}-test-${{ env.cache-name }}- - ${{ runner.os }}-test- - ${{ runner.os }}- - - uses: julia-actions/julia-buildpkg@v1 - - uses: julia-actions/julia-runtest@v1 - - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v1 - with: - file: lcov.info - docs: - name: Documentation + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: julia-actions/setup-julia@v1 + - uses: julia-actions/setup-julia@latest with: - version: '1' - - run: | - julia --project=docs -e ' - using Pkg - Pkg.develop(PackageSpec(path=pwd())) - Pkg.instantiate()' - - run: | - julia --project=docs -e ' - using Documenter: doctest - using STMOZOO - doctest(STMOZOO)' # change MYPACKAGE to the name of your package - - run: julia --project=docs docs/make.jl + version: '1.6' + - name: Install dependencies + run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + - name: Build and deploy env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} \ No newline at end of file + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key + run: julia --project=docs/ docs/make.jl \ No newline at end of file From a68e0b3bb9df098fe072f1128ffe749d73a95d35 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 18:48:36 +0100 Subject: [PATCH 28/57] CI fix part 1 --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc20f71e..ed39c3d2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: test1 + run: julia -e 'pwd()' - uses: julia-actions/setup-julia@latest with: version: '1.6' From facece77f2f21437edd97051611a3509c4cb5748 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 18:52:59 +0100 Subject: [PATCH 29/57] CI fix part 2 --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed39c3d2..1dbff7d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,11 +13,12 @@ jobs: steps: - uses: actions/checkout@v2 - name: test1 - run: julia -e 'pwd()' + run: ls - uses: julia-actions/setup-julia@latest with: version: '1.6' - name: Install dependencies + run: julia -e 'using Pkg; Pkg.activate("."); import STMOZOO' run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - name: Build and deploy env: From c04972b044677eb50cc1aea8fda586692a46fce4 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 18:54:07 +0100 Subject: [PATCH 30/57] CI fix part 3 --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1dbff7d0..f39cfa50 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,8 +18,7 @@ jobs: with: version: '1.6' - name: Install dependencies - run: julia -e 'using Pkg; Pkg.activate("."); import STMOZOO' - run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + run: julia --project=docs/ -e 'using Pkg; Pkg.activate("."); import STMOZOO; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - name: Build and deploy env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token From bcfee5a0292fbb0eb56b1c578f2952cc3c194db9 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:04:57 +0100 Subject: [PATCH 31/57] removed STMOZOO package and created an independent Fridge Package --- Project.toml | 6 +- README.md | 2 +- docs/make.jl | 3 +- notebook/index.jl | 1022 -------------------------------------------- src/STMOZOO.jl | 9 - test/fridgeTest.jl | 2 +- 6 files changed, 6 insertions(+), 1038 deletions(-) delete mode 100644 notebook/index.jl delete mode 100644 src/STMOZOO.jl diff --git a/Project.toml b/Project.toml index 4d05ace2..7ba49446 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ -name = "STMOZOO" -uuid = "8e7dc78f-7190-4116-bf88-3d148ae9f088" -authors = ["michielstock "] +name = "Fridge" +uuid = "673b17d6-c7db-4caa-9a54-38a02eba0033" +authors = ["warvbell "] version = "0.1.0" [deps] diff --git a/README.md b/README.md index adbb315d..41930aff 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fridge.jl -[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/) [![Coverage Status](https://coveralls.io/repos/github/wardvanbelle/Fridge.jl/badge.svg?branch=master)](https://coveralls.io/github/wardvanbelle/Fridge.jl?branch=master)\ +[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/)\ \ by Ward Van Belle diff --git a/docs/make.jl b/docs/make.jl index 627211fc..c001f53a 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,7 +1,6 @@ using Documenter -using STMOZOO -using STMOZOO.Fridge +using Fridge makedocs(sitename="Fridge.jl", format = Documenter.HTML(), diff --git a/notebook/index.jl b/notebook/index.jl deleted file mode 100644 index 03f1898c..00000000 --- a/notebook/index.jl +++ /dev/null @@ -1,1022 +0,0 @@ -### A Pluto.jl notebook ### -# v0.17.1 - -using Markdown -using InteractiveUtils - -# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). -macro bind(def, element) - quote - local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end - local el = $(esc(element)) - global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) - el - end -end - -# ╔═╡ ae625e40-7f56-11ec-3cd5-d1244e23a3ba -begin -using PlutoUI, HTTP, Gumbo, Cascadia, CSV, JLD2 - -md"""# Fridge.jl -by *Ward Van Belle* -""" - -end - -# ╔═╡ 06db3cc2-1680-49b9-a054-281a6b35205a -md"""$(LocalResource("../FridgeLogo.png", :width => 150, :align => "right")) - -A package that optimizes your fridge use while reducing your waste pile!! - -This package tries to find the best recipes for you based on a recipe database. In our eyes (and the eyes of the objective function), the best recipes are the ones that use as much ingredients from your fridge as possible and that don't need extra ingredients from the grocery store.""" - -# ╔═╡ 3ad1af72-7096-4106-a3c7-47326695e2cb -md""" -## Checking The Ingredients -If you want to optimize fridge usage. It's best to know which ingredients are in the fridge. By checking all the ingredients and offering possible alternatives, it is easier for the algorithm to give better results. For instance, cheese may be replaced by swiss cheese.\ -\ -It takes two inputs: -- The fridge list: A list containing the different foods in your fridge as a string. -- The ingredient list: A list containing all the different ingredients that are used in the recipe database. - -After searching for the different ingredients, it outputs an adapted fridge list. -""" - -# ╔═╡ 8e58f807-1db9-495e-8679-430f953292ea -function checkIngredients(fridgeList,ingredientList) - print("Checking if the food in your fridge is found in our database.\n\n") - - # check if the ingredients in the fridge are found in the database - for food in fridgeList - if food in ingredientList - print("Found $food in the ingredient database.\n") - else - print("Did not find $food in the ingredient database.\n\n") - if any(occursin.(food,ingredientList)) - print("Possible alternatives in database:\n") - alternatives = ingredientList[occursin.(food,ingredientList)] - for (indexNum, alternative) in enumerate(alternatives) - print("[$indexNum] $alternative\n") - end - print("If you want to take an alternative type its number, else type no.\n") - answer = readline() - if answer != "no" - correctInput = false - while !correctInput - try - answer = parse(Int64,answer) - correctInput = true - catch - print("Please only type the number of the alternative, eg. 1\n") - answer = readline() - end - end - fridgeList[fridgeList .== food] .= alternatives[answer] - print("Replaced $food with $(alternatives[answer])\n") - end - else - print("Did not find any alternative in the ingredient database.\n") - end - end - end - print("Done checking ingredients.\n\n") - - return fridgeList -end - -# ╔═╡ 264b1eb5-c421-4a69-a55c-8fbbbb7715d1 -md""" -## Objective Functions -Of course, we want to be able to score how good our objective function will be. This objective function is based on the following formula where ``u`` is the number of ingredients used from the fridge, ``r`` is the number of ingredients remaining in the fridge and ``e`` are the extra ingredients needed. ``w_1``, ``w_2`` and ``w_3`` are a set of weights. - -``score = w_1 * u + w_2 * r + w_3*e`` -""" - -# ╔═╡ 1752889a-513a-4620-add4-a9ca7fa92c8e -md""" -## The Search Algorithm -Let's now take a look at the different search algorithms that you can use in the Fridge.jl module. -""" - -# ╔═╡ a65c0925-7a67-4da3-9a6d-2ade8d3529e9 -md"""### Greedy Algorithm -This algorithm works like the one seen in class. -It ranks all recipes based on the previously discussed objective function. Picks the best scoring recipe. Adapts the recipe options and picks the new best recipe. -It keeps repeating this until the amount of chosen recipes is equal to `numRecipes` or if there are no recipes left to pick.\ -\ -As an input, it takes the earlier mentioned `fridgeList`, a dictionary containing all the recipes and their ingredients (`recipeDict`) and, the max number of recipes that a combination should have (`numRecipes`). \ -\ -After searching, it outputs the best-found combination. -""" - -# ╔═╡ 954fe2b3-171b-43ad-a1df-cbb3414988de -md""" -### Simulated Annealing -To improve our earlier result, we can use simulated annealing. The algorithm below is based on the one seen in class. The biggest difference is the fact that we also use a Tabu list to block recipes for a certain number of cycles. - -To start searching, it needs the earlier mentioned `fridgeList`, `recipeDict` and `numRecipes` but also the following things: -- `initSolution`: The initial solution from which it should start looking. -- `tabuList`: A list of recipes that should not be used in the found neighbour. -- `randRecipe`: A Boolean `true` or `false` value. When `true`, random recipes are used to create the neighbour. - -After searching it also outputs the best-found combination of recipes. -""" - -# ╔═╡ eee53924-fd20-44d8-a3eb-a2af9f9112b9 -md""" -To optimize this searching method, there are a lot of parameters that can be tweaked. -The following options are available: -- `kT`: repetitions per temperature -- `r`: cooling rate -- `Tmax`: maximal temperature to start -- `Tmin`: minimal temperature to end -- `tabuLength`: Number of cycles that recipe needs to be blocked - -You can experiment with them further on below! -""" - -# ╔═╡ 7315f676-0d0e-43ae-8231-b6274dc5c8de -md""" -### Neighbours -There are two types of neighbours to use in the module. One uses a random combination of recipes, the other is based on the Greedy Search algorithm. Both are implemented in the `Neighbour()` function. -""" - -# ╔═╡ 134a2dd7-69d2-449e-82ab-5bfff90ede1b -md"""A neighbour is created by first removing a recipe from the current combination `curSolution`. Next, the Neighbour function looks for other recipes that are compatible with the other recipes that are in the current combination.""" - -# ╔═╡ b6205bd3-41da-45e0-81f1-a480a3f0e737 -md""" -## Overview Function -Finally, we want to bring all the functions together in one clean overview function. -The only things that need to be provided are: -- A list containing the different foods in your fridge as a string. `fridgeList` -- A relative or absolute path to a .csv or .jld2 file containing the recipe database. `dataPath` - -Optionally you can also adapt the max amount of recipes in a combination (`numRecipes`) and wether or not random recipes should be used to create a neighbour (`randRecipe`). - -""" - -# ╔═╡ 6af2a6dd-ba7e-470e-8915-12ae6eff8357 -md"""## Example Time -To start of we'll need to get our hands on a recipe database. Don't fear if you don't have one laying around. By using the `scrapeRecipe()` function provided in this module, you can create a .csv file containing recipes from [the cosylab recipe database](https://cosylab.iiitd.edu.in/recipedb/). - -You just need to provide the following things: -- a starting recipe number -- a stopping recipe number -- the path to where the .csv file should be saved (you can copy this from your file explorer) - -Next al that is left to do is to check the `Download database now` box. Since this will take a few minutes we provide you with a 🍪 and some ☕, enjoy! -""" - -# ╔═╡ 656f211d-d1e8-4325-a12b-b89eca0351da -md""" -#### recipe database selection menu -The standard inputs are 106 541 to 106 866 since this downloads all the Belgian recipes. If you would like to download recipes from another country, please take a look at the explanation provided in the readme on the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). - -Starting recipe number: $(@bind startNumber TextField(default="106541"))\ -Stopping recipe number: $(@bind endNumber TextField(default="106866"))\ -Filepath: $(@bind filePath TextField(default="../data/BelgianRecipeDB.csv"))\ -Download database now: $(@bind downloadDB CheckBox()) - -It is recommended to only use this once. Otherwise, you will have copies of some recipes in your database. So you better uncheck the box above! -""" - -# ╔═╡ bf2725c1-55e6-4c6a-9b83-53f5984cae75 -md"Next it is time to look at the things we have left in our kitchen:" - -# ╔═╡ fd02d76a-0ae6-4869-96bb-516c536fb91d -fridgeList = ["chocolate", "potato", "salt", "cheese"] - -# ╔═╡ 34544e10-e4a1-4cfe-b0bc-43f8927bb19c -md""" -Now that we have a small database and the content of our fridge, we can start looking for a recipe combination. Keep an eye on your terminal since it is possible that you need to give some input! If you are ready, check the box below! -""" - -# ╔═╡ 312fabf7-7d11-4bac-b52b-14de82d13e73 -md"Ready to start searching? $(@bind readyToSearch CheckBox())" - -# ╔═╡ 15a97461-7096-4ea0-acbc-edbc5db79cde -md""" -Congratulations! You made it through the notebook! -You can now continue to the **experimental section** below to play with the different parameters used in the algorithms. Enjoy the food! 🍔 -""" - -# ╔═╡ d49cf674-088f-47a1-9795-7641b3f01cd1 -md"""## Experimental Section -We will now load the .csv file and save it in a dictionary so that it doesn't need to load every time you run the simulated annealing algorithm. -""" - -# ╔═╡ 86f03d01-4f97-4487-9683-38f8dc9d826a -md""" -### Parameter Options: -**General**\ -`numRecipes` : $(@bind numRecipesExp Slider(1:10, default=3, show_value=true))\ -`tabuLength` : $(@bind tabuLengthExp Slider(1:15, default=5, show_value=true))\ -`randRecipe` : $(@bind randRecipeExp CheckBox())\ -\ -**Simulated Annealing specific**\ -`kT` : $(@bind kTExp Slider(20:10:150, default=100, show_value=true))\ -`r` : $(@bind rExp Slider(0.1:0.05:0.95, default=0.75, show_value=true))\ -`Tmax` : $(@bind TmaxExp Slider(2:10, default=4, show_value=true))\ -`Tmin` : $(@bind TminExp Slider(1:9, default=1, show_value=true))\ -\ -**Objective specific**\ -``w_1``: $(@bind w_1 Slider(0:10, default=1, show_value=true))\ -``w_2``: $(@bind w_2 Slider(0:10, default=6, show_value=true))\ -``w_3``: $(@bind w_3 Slider(0:10, default=2, show_value=true))\ -""" - -# ╔═╡ 70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 -md"Start experimenting: $(@bind startExperimenting CheckBox())" - -# ╔═╡ c51f2b76-fe4c-4c29-87dc-c7784e5200c2 -md""" -## Supporting Functions -Below you can find all the supporting functions used in this notebook. These can also be found in the src folder in the [GitHub repository](https://github.com/wardvanbelle/Fridge.jl). Please do not adapt them. -""" - -# ╔═╡ 09d6393c-9b14-4401-babe-708a88ef0a16 -function scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) -""" - scrapeRecipe(scrapeBegin,scrapeEnd,csvPath) - -Download recipetitles and their corresponding ingredients from the recipe database of cosylab as a dictionary. -The recipes are downloaded based on their recipe number. This number can range from 2610 to 149191. -To get a recipenumber one should look at the last number of the url of a certain recipe. -For example, the recipe for 'Speculoosbavarois' is number 106585. -The recipes get automatically saved in a csv file where the first column is the recipetitle and the second column -is the list of ingredients. - -## Input: -- scrapeBegin: The recipe number where the iteration should begin. -- scrapeEnd: The recipe number after which the iteration should and. -- csvPath: The path where the csv file is stored. - -## Examples: - -The example below downloads the recipes 2700 to 2702 and -stores them in the csv file 'recipedb.csv' in the current folder. - -```julia-repl -julia> scrapeRecipe(2700,2702,"./recipedb.csv") -``` -""" - for i = scrapeBegin:scrapeEnd - # get the webpage - htmlText = HTTP.request("GET","https://cosylab.iiitd.edu.in/recipedb/search_recipeInfo/$i") - htmlBody = parsehtml(String(htmlText.body)) - - # get the needed elements out of the webpage - recipeTitle = eachmatch(Selector("h3"),htmlBody.root)[1].children[1].text - print("recipe number $i : $recipeTitle\n") - ingredientTab = eachmatch(Selector("#ingredient_nutri"),htmlBody.root) - ingredientTabel = eachmatch(Selector("#myTable"),ingredientTab[1]) - ingredientLinks = eachmatch(Selector("td a"),ingredientTabel[1]) - ingredientList = [] - for ingredientLink in ingredientLinks - try - append!(ingredientList, [ingredientLink.children[1].text]) - catch y - end - end - - # write the data to the DB - if isfile(csvPath) - CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = true) - else - CSV.write(csvPath, Dict(recipeTitle => ingredientList), append = false) - end - - end - print("done") -end - -# ╔═╡ cd5458a5-2136-4559-b4e5-2d91abea870c -if downloadDB - scrapeRecipe(parse(Int64,startNumber), parse(Int64,endNumber), filePath) -end - -# ╔═╡ 87b72838-260f-4ffb-ac79-03860165afa1 -function loadRecipeDBCSV(csvPath) - # read the dictionary from the csv file - print("Loading the recipe database.\n") - tempDict = CSV.File(csvPath) |> Dict - recipeDict = Dict() - - # parse the ingredient list to the right format - print("Parsing ingredients to right format.\n\n") - for recipe in keys(tempDict) - ingredientList = tempDict[recipe] - recipeDict[recipe] = eval(Meta.parse(ingredientList)) - end - return recipeDict -end - -# ╔═╡ 11b589ff-3a09-4395-921a-872feb190022 -if isfile(filePath) - recipeDictExp = loadRecipeDBCSV(filePath) -end - -# ╔═╡ adde7105-4a4a-453b-a7a8-9c9471dc29d3 -function createIngredientDatabase(recipeDict) - # create an unique vector of all ingredients used in the recipe database - ingredientList = [] - for ingredients in values(recipeDict) - append!(ingredientList,ingredients) - end - ingredientList = unique(ingredientList) - - return ingredientList -end - -# ╔═╡ 89e58385-4db9-4ae3-9495-d8a2e63f2d72 -function recipeToNumVector(fridgeList,ingredientList) -""" - recipeToNumVector(fridgeList,ingredientList) - -This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal -to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. -If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- ingredientList: A list containing all the ingredients used in a specific recipe. - -## Output: -- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, -that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. - -""" - numVector = zeros(Int64,length(fridgeList)+1) - for i in 1:length(fridgeList) - numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 - end - numVector[end] = length(ingredientList) - sum(numVector) - return numVector -end - -# ╔═╡ 3ed830c9-e3f7-4632-9ff3-cdd48c00f315 -function randomCombo(fridgeList, recipeDict, numRecipes) - - randCombo = Dict() - ingredientsArray = [] - namesArray = [] - - for (name,ingredients) in recipeDict - push!(namesArray,name) - push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) - end - - for i = 1:numRecipes - - randIndex = rand(1:length(namesArray)) - tempRecipeName = namesArray[randIndex] - randCombo[tempRecipeName] = ingredientsArray[randIndex] - - if all(isone.(sum(values(randCombo)))) - break - end - - namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] - ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] - - if isempty(namesArray) - break - end - - end - - return randCombo -end - -# ╔═╡ a6e77624-606a-49ea-941d-8180cbd94a27 -compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient - -# ╔═╡ 644c2809-5b2b-4426-8deb-f952372a8438 -begin - -# objective function used to score a single recipe -fridgeObjective(x::Array{Int64}) = w_1 * sum(x[1:end-1]) + w_2 *sum(x[1:end-1] .== 0) + w_3 *x[end] - -# objective function used to score a combination of recipes -fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 1)*w_1 + sum(sum(x) .== 0)*w_2 + sum(x)[end]*w_3 : Inf - -end - -# ╔═╡ ace6ecfa-319b-48f3-a675-51b4bc26abd0 -function greedyFindCombo(fridgeList, recipeDict, numRecipes) - - bestCombo = Dict() - ingredientsArray = [] - namesArray = [] - - for (name,ingredients) in recipeDict - push!(namesArray,name) - push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) - end - - for i = 1:numRecipes - - bestOrder = sortperm(ingredientsArray, by=fridgeObjective) - ingredientsArray = ingredientsArray[bestOrder] - namesArray = namesArray[bestOrder] - - tempRecipeName = namesArray[1] - bestCombo[tempRecipeName] = ingredientsArray[1] - - if all(isone.(sum(values(bestCombo)))) - break - end - - namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] - ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] - - if isempty(namesArray) - break - end - - end - - return bestCombo -end - -# ╔═╡ 7365d57b-fd33-46af-9dcd-2c07908f64a3 -function Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) - - toRemove = rand(curSolution)[1] - # adapt the fridgeList so that only ingredients from the removed ingredient are available - tempFridgeList = copy(fridgeList) - for recipe in keys(curSolution) - if recipe != toRemove - tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] - end - end - - # adapt the recipeDict and use greedy search to find a new solution - tempRecipeDict = copy(recipeDict) - for recipe in keys(curSolution) - delete!(tempRecipeDict,recipe) - end - - for recipe in tabuList - try delete!(tempRecipeDict,recipe) - catch e - end - end - - if randRecipe - neighbour = randomCombo(tempFridgeList, tempRecipeDict, numRecipes) - else - neighbour = greedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) - end - - # correct recipe vectors - for recipe in keys(neighbour) - neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) - end - - # here combine the two dictionaries - tempCurSolution = copy(curSolution) - delete!(tempCurSolution,toRemove) - neighbour = merge(neighbour,tempCurSolution) - - return neighbour -end - -# ╔═╡ 6f1d6e44-30a1-42ee-b888-4cbb105b5348 -function SAFindCombo(initSolution, fridgeList, recipeDict, numRecipes, randRecipe; - kT=100, # repetitions per temperature - r=0.75, # cooling rate - Tmax=4, # maximal temperature to start - Tmin=1, # minimal temperature to end - tabuLength=3) # number of cycli that recipe needs to be blocked - - @assert 0 < Tmin < Tmax "Temperatures should be positive" - @assert 0 < r < 1 "cooling rate is between 0 and 1" - solution = initSolution - obj = fridgeObjective([i for i in values(solution)]) - tabuList = String[i for i in keys(initSolution)] - - # current temperature - T = Tmax - while T > Tmin - # repeat kT times - for i in 1:kT - sn = Neighbour(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor - obj_sn = fridgeObjective([i for i in values(sn)]) - # if the neighbor improves the solution, keep it - # otherwise accept with a probability determined by the - # Metropolis heuristic - if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) - solution = sn - obj = obj_sn - end - - for recipe in keys(sn) - if !in(recipe, tabuList) - if length(tabuList) < tabuLength - pushfirst!(tabuList,recipe) - else - pop!(tabuList) - pushfirst!(tabuList,recipe) - end - end - end - end - - # decay temperature - T *= r - end - - return solution -end - -# ╔═╡ 9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc -function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) - - # load the recipe dictionary from the db file - recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) - - # create a list of all ingredients in your database - ingredientList = createIngredientDatabase(recipeDict) - - # check for every food in your fridge if it's in the database. If not check if there are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList) - - # find the best greedy recipe - greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) - - # find the best recipe with SA - SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) - - # print the solution - print("The best recipes to make are:\n\n") - for recipeName in keys(SASolution) - print("$(recipeName) : $(recipeDict[recipeName])\n") - end - - return SASolution -end - -# ╔═╡ 3569550e-0157-4d7a-8cda-4df327c92b81 -if readyToSearch - findBestRecipe(fridgeList, filePath) -end - -# ╔═╡ e10c7ddf-aef0-470a-be22-ac250d84fb7e -begin -if startExperimenting - greedySolutionExp = greedyFindCombo(fridgeList, recipeDictExp, numRecipesExp) - SASolutionExp = SAFindCombo(greedySolutionExp, fridgeList, recipeDictExp, numRecipesExp, randRecipeExp, kT=kTExp, r=rExp, Tmax=TmaxExp, Tmin=TminExp, tabuLength=tabuLengthExp) - - md""" - greedy output: $([recipe * ", " for recipe in keys(greedySolutionExp)])\ - SA output: $([recipe * ", " for recipe in keys(SASolutionExp)]) - """ -else - md"Check the `Start experimenting` checkbox to see the output of your parameter combination." -end -end - -# ╔═╡ 00000000-0000-0000-0000-000000000001 -PLUTO_PROJECT_TOML_CONTENTS = """ -[deps] -CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -Cascadia = "54eefc05-d75b-58de-a785-1a3403f0919f" -Gumbo = "708ec375-b3d6-5a57-a7ce-8257bf98657a" -HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" -JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" - -[compat] -CSV = "~0.10.2" -Cascadia = "~1.0.1" -Gumbo = "~0.8.0" -HTTP = "~0.9.17" -JLD2 = "~0.4.18" -PlutoUI = "~0.7.32" -""" - -# ╔═╡ 00000000-0000-0000-0000-000000000002 -PLUTO_MANIFEST_TOML_CONTENTS = """ -# This file is machine-generated - editing it directly is not advised - -[[AbstractPlutoDingetjes]] -deps = ["Pkg"] -git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" -uuid = "6e696c72-6542-2067-7265-42206c756150" -version = "1.1.4" - -[[AbstractTrees]] -git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.3.4" - -[[ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[CSV]] -deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings"] -git-tree-sha1 = "9519274b50500b8029973d241d32cfbf0b127d97" -uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" -version = "0.10.2" - -[[Cascadia]] -deps = ["AbstractTrees", "Gumbo"] -git-tree-sha1 = "95629728197821d21a41778d0e0a49bc2d58ab9b" -uuid = "54eefc05-d75b-58de-a785-1a3403f0919f" -version = "1.0.1" - -[[CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.0" - -[[ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.0" - -[[Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.41.0" - -[[DataAPI]] -git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.9.0" - -[[DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.11" - -[[DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "67551df041955cc6ee2ed098718c8fcd7fc7aebe" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.12.0" - -[[FilePathsBase]] -deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] -git-tree-sha1 = "04d13bfa8ef11720c24e4d840c0033d145537df7" -uuid = "48062228-2e41-5def-b9a4-89aafe57970f" -version = "0.9.17" - -[[FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[Gumbo]] -deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] -git-tree-sha1 = "e711d08d896018037d6ff0ad4ebe675ca67119d4" -uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" -version = "0.8.0" - -[[Gumbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" -uuid = "528830af-5a63-567c-a44a-034ed33b8444" -version = "0.10.2+0" - -[[HTTP]] -deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.17" - -[[Hyperscript]] -deps = ["Test"] -git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" -uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" -version = "0.0.4" - -[[HypertextLiteral]] -git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" -uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" -version = "0.9.3" - -[[IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.2" - -[[IniFile]] -deps = ["Test"] -git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.0" - -[[InlineStrings]] -deps = ["Parsers"] -git-tree-sha1 = "8d70835a3759cdd75881426fced1508bb7b7e1b6" -uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.1.1" - -[[InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[JLD2]] -deps = ["DataStructures", "FileIO", "MacroTools", "Mmap", "Pkg", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "39f22411266cdd1621092c762a3f0648dbdc8433" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.18" - -[[JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "22df5b96feef82434b07327e2d3c770a9b21e023" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.4.0" - -[[JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.2" - -[[LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" - -[[Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[LinearAlgebra]] -deps = ["Libdl"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.9" - -[[Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[Parsers]] -deps = ["Dates"] -git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.2.0" - -[[Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[PlutoUI]] -deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] -git-tree-sha1 = "ae6145ca68947569058866e443df69587acc1806" -uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -version = "0.7.32" - -[[PooledArrays]] -deps = ["DataAPI", "Future"] -git-tree-sha1 = "db3a23166af8aebf4db5ef87ac5b00d36eb771e2" -uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" -version = "1.4.0" - -[[Preferences]] -deps = ["TOML"] -git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.2.3" - -[[Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[Random]] -deps = ["Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" - -[[SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[SentinelArrays]] -deps = ["Dates", "Random"] -git-tree-sha1 = "15dfe6b103c2a993be24404124b8791a09460983" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.3.11" - -[[Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] -git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.6.1" - -[[Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.6" - -[[URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.0" - -[[UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[WeakRefStrings]] -deps = ["DataAPI", "InlineStrings", "Parsers"] -git-tree-sha1 = "c69f9da3ff2f4f02e811c3323c22e5dfcb584cfa" -uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" -version = "1.4.1" - -[[Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -""" - -# ╔═╡ Cell order: -# ╟─ae625e40-7f56-11ec-3cd5-d1244e23a3ba -# ╟─06db3cc2-1680-49b9-a054-281a6b35205a -# ╟─3ad1af72-7096-4106-a3c7-47326695e2cb -# ╠═8e58f807-1db9-495e-8679-430f953292ea -# ╟─264b1eb5-c421-4a69-a55c-8fbbbb7715d1 -# ╠═644c2809-5b2b-4426-8deb-f952372a8438 -# ╟─1752889a-513a-4620-add4-a9ca7fa92c8e -# ╟─a65c0925-7a67-4da3-9a6d-2ade8d3529e9 -# ╠═ace6ecfa-319b-48f3-a675-51b4bc26abd0 -# ╟─954fe2b3-171b-43ad-a1df-cbb3414988de -# ╠═6f1d6e44-30a1-42ee-b888-4cbb105b5348 -# ╟─eee53924-fd20-44d8-a3eb-a2af9f9112b9 -# ╟─7315f676-0d0e-43ae-8231-b6274dc5c8de -# ╠═3ed830c9-e3f7-4632-9ff3-cdd48c00f315 -# ╟─134a2dd7-69d2-449e-82ab-5bfff90ede1b -# ╠═7365d57b-fd33-46af-9dcd-2c07908f64a3 -# ╟─b6205bd3-41da-45e0-81f1-a480a3f0e737 -# ╠═9bfc9f3d-bc05-4c15-8b4c-2cfce3507afc -# ╟─6af2a6dd-ba7e-470e-8915-12ae6eff8357 -# ╟─656f211d-d1e8-4325-a12b-b89eca0351da -# ╠═cd5458a5-2136-4559-b4e5-2d91abea870c -# ╟─bf2725c1-55e6-4c6a-9b83-53f5984cae75 -# ╠═fd02d76a-0ae6-4869-96bb-516c536fb91d -# ╟─34544e10-e4a1-4cfe-b0bc-43f8927bb19c -# ╟─312fabf7-7d11-4bac-b52b-14de82d13e73 -# ╠═3569550e-0157-4d7a-8cda-4df327c92b81 -# ╟─15a97461-7096-4ea0-acbc-edbc5db79cde -# ╟─d49cf674-088f-47a1-9795-7641b3f01cd1 -# ╠═11b589ff-3a09-4395-921a-872feb190022 -# ╟─86f03d01-4f97-4487-9683-38f8dc9d826a -# ╟─70ffadd9-80d4-4eb9-92d9-e3d5ffa50074 -# ╟─e10c7ddf-aef0-470a-be22-ac250d84fb7e -# ╟─c51f2b76-fe4c-4c29-87dc-c7784e5200c2 -# ╟─09d6393c-9b14-4401-babe-708a88ef0a16 -# ╟─87b72838-260f-4ffb-ac79-03860165afa1 -# ╟─adde7105-4a4a-453b-a7a8-9c9471dc29d3 -# ╟─89e58385-4db9-4ae3-9495-d8a2e63f2d72 -# ╟─a6e77624-606a-49ea-941d-8180cbd94a27 -# ╟─00000000-0000-0000-0000-000000000001 -# ╟─00000000-0000-0000-0000-000000000002 diff --git a/src/STMOZOO.jl b/src/STMOZOO.jl deleted file mode 100644 index 2f6e52e0..00000000 --- a/src/STMOZOO.jl +++ /dev/null @@ -1,9 +0,0 @@ -module STMOZOO - - -# execute your source file and export the module you made -include("fridge.jl") - -export Fridge - -end # module diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 8a9b8102..3a853ded 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -1,6 +1,6 @@ # testset for the Fridge.jl package @testset "Fridge" begin - using STMOZOO.Fridge + using Fridge testList = ["cheese","potato","tomato","cabbage"] From 6472717e54c2c3a96b6709d353c3515ff1a06eb2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:06:12 +0100 Subject: [PATCH 32/57] further fixing CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f39cfa50..41671721 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: with: version: '1.6' - name: Install dependencies - run: julia --project=docs/ -e 'using Pkg; Pkg.activate("."); import STMOZOO; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' + run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - name: Build and deploy env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token From 5a39f8aa962455606f0b9bf5692b0141bcdcfdbb Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:08:33 +0100 Subject: [PATCH 33/57] further fixing CI part 20 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41671721..5082ae8f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: test1 - run: ls + run: ls /home/runner/work/Fridge.jl/Fridge.jl - uses: julia-actions/setup-julia@latest with: version: '1.6' From 15b8a5306ed059c9d345fccf60f7c02c0045f481 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:12:14 +0100 Subject: [PATCH 34/57] further fixing CI part 21 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5082ae8f..91835553 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: test1 - run: ls /home/runner/work/Fridge.jl/Fridge.jl + run: ls /home/runner/work/Fridge.jl/Fridge.jl/src/ - uses: julia-actions/setup-julia@latest with: version: '1.6' From de18a0a57e74db94e625cb31c0cd60adc1c85666 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:16:26 +0100 Subject: [PATCH 35/57] fixing CI maybe --- src/fridge.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fridge.jl b/src/fridge.jl index ed690765..815a0651 100644 --- a/src/fridge.jl +++ b/src/fridge.jl @@ -34,6 +34,7 @@ For instance cheese may be replaced by swiss cheese. ## Output: - fridgeList: The (adapted) given fridgeList + """ function checkIngredients(fridgeList,ingredientList) From af1f9883733643ad41d9538f8ebae91196bc986d Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:19:45 +0100 Subject: [PATCH 36/57] remove fridge.jl --- src/fridge.jl | 419 -------------------------------------------------- 1 file changed, 419 deletions(-) delete mode 100644 src/fridge.jl diff --git a/src/fridge.jl b/src/fridge.jl deleted file mode 100644 index 815a0651..00000000 --- a/src/fridge.jl +++ /dev/null @@ -1,419 +0,0 @@ -module Fridge - -include("recipewebscraper.jl") - -using .recipeWebscraper, JLD2 - -export checkIngredients, greedyFindCombo, findBestRecipe, RandomCombo, removeRecipe, SAFindCombo, scrapeRecipe, loadRecipeDBCSV - -#================================================== - CHECK INGREDIENTS FUNCTIONS -==================================================# - -function createIngredientDatabase(recipeDict) - # create an unique vector of all ingredients used in the recipe database - ingredientList = [] - for ingredients in values(recipeDict) - append!(ingredientList,ingredients) - end - ingredientList = unique(ingredientList) - - return ingredientList -end - -""" - checkIngredients(fridgeList, ingredientList) - -This function checks if the foods in your fridge are also found in the ingredient overview -of the recipe database. If they are not found in the database, regex is used to find possible alternatives. -For instance cheese may be replaced by swiss cheese. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- ingredientList: A list containing all the different ingredients that are used in the recipe database. - -## Output: -- fridgeList: The (adapted) given fridgeList - -""" -function checkIngredients(fridgeList,ingredientList) - - - print("Checking if the food in your fridge is found in our database.\n\n") - - # check if the ingredients in the fridge are found in the database - for food in fridgeList - if food in ingredientList - print("Found $food in the ingredient database.\n") - else - print("Did not find $food in the ingredient database.\n\n") - if any(occursin.(food,ingredientList)) - print("Possible alternatives in database:\n") - alternatives = ingredientList[occursin.(food,ingredientList)] - for (indexNum, alternative) in enumerate(alternatives) - print("[$indexNum] $alternative\n") - end - print("If you want to take an alternative type its number, else type no.\n") - answer = readline() - if answer != "no" - correctInput = false - while !correctInput - try - answer = parse(Int64,answer) - correctInput = true - catch - print("Please only type the number of the alternative, eg. 1\n") - answer = readline() - end - end - fridgeList[fridgeList .== food] .= alternatives[answer] - print("Replaced $food with $(alternatives[answer])\n") - end - else - print("Did not find any alternative in the ingredient database.\n") - end - end - end - print("Done checking ingredients.\n\n") - - return fridgeList -end - -#================================================== - OBJECTIVE FUNCTIONS -==================================================# - -# objective function used to score a single recipe -fridgeObjective(x::Array{Int64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] - -# objective function used to score a combination of recipes -fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf - -#================================================== - GREEDY ALGORITHM -==================================================# - -""" - greedyFindCombo(fridgeList, recipeDict, numRecipes) - -This function uses greedy search to find a good combination of recipes that match your fridge content. -It ranks all recipes based on the following formula - -``score = (ingredients from fridge used) + 6*(ingredients in fridge remaining) + 2*(extra ingredients needed)`` - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. - -## Output: -- bestCombo: A dictionary containing the best found combination of recipes. - -""" -function greedyFindCombo(fridgeList, recipeDict, numRecipes) - - bestCombo = Dict() - ingredientsArray = [] - namesArray = [] - - for (name,ingredients) in recipeDict - push!(namesArray,name) - push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) - end - - for i = 1:numRecipes - - bestOrder = sortperm(ingredientsArray, by=fridgeObjective) - ingredientsArray = ingredientsArray[bestOrder] - namesArray = namesArray[bestOrder] - - tempRecipeName = namesArray[1] - bestCombo[tempRecipeName] = ingredientsArray[1] - - if all(isone.(sum(values(bestCombo)))) - break - end - - namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] - ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] - - if isempty(namesArray) - break - end - - end - - return bestCombo -end - -#================================================== - NEIGBOURHOODS -==================================================# - -""" - randomCombo(fridgeList, recipeDict, numRecipes) - -This function gives a random combination of recipes from the provided recipe dictionary. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. - -## Output: -- randCombo: A dictionary containing a random combination of recipes. -""" -function RandomCombo(fridgeList, recipeDict, numRecipes) - - randCombo = Dict() - ingredientsArray = [] - namesArray = [] - - for (name,ingredients) in recipeDict - push!(namesArray,name) - push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) - end - - for i = 1:numRecipes - - randIndex = rand(1:length(namesArray)) - tempRecipeName = namesArray[randIndex] - randCombo[tempRecipeName] = ingredientsArray[randIndex] - - if all(isone.(sum(values(randCombo)))) - break - end - - namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] - ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] - - if isempty(namesArray) - break - end - - end - - return randCombo -end - -""" - removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) - -This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. -It also uses a tabulist to stimulate the use of new solutions. - -## Input: -- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. -- tabuList: A list of recipes that should not be used in the found neighbour. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. - -## Output: -- neighbour: A dictionary containing a combination of recipes. - -""" -function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) - - toRemove = rand(curSolution)[1] - # adapt the fridgeList so that only ingredients from the removed ingredient are available - tempFridgeList = copy(fridgeList) - for recipe in keys(curSolution) - if recipe != toRemove - tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] - end - end - - # adapt the recipeDict and use greedy search to find a new solution - tempRecipeDict = copy(recipeDict) - for recipe in keys(curSolution) - delete!(tempRecipeDict,recipe) - end - - for recipe in tabuList - try delete!(tempRecipeDict,recipe) - catch e - end - end - - if randRecipe - neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) - else - neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) - end - - # correct recipe vectors - for recipe in keys(neighbour) - neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) - end - - # here combine the two dictionaries - tempCurSolution = copy(curSolution) - delete!(tempCurSolution,toRemove) - neighbour = merge(neighbour,tempCurSolution) - - return neighbour -end - -#================================================== - SIMULATED ANNEALING ALGORITHM -==================================================# - -""" - SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, r=0.75, Tmax=4, Tmin=1, tabuLength=3) - -This function uses simulated annealing to find a better combination of recipes that match your fridge content. -It starts with the current solution and tries to improve this. - -## Input: -- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- fridgeList: A list containing the different foods in your fridge as a string. -- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. -- numRecipes: The max amount of recipes that a combo should contain. -- tabuList: A list of recipes that should not be used in the found neighbour. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. - -## Optional Inputs: -- kT: repetitions per temperature -- r: cooling rate -- Tmax: maximal temperature to start -- Tmin: minimal temperature to end -- tabuLength: Number of cycli that recipe needs to be blocked - -## Output: -- solution: A dictionary containing the best found combination of recipes. - -""" -function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; - kT=100, # repetitions per temperature - r=0.75, # cooling rate - Tmax=4, # maximal temperature to start - Tmin=1, # minimal temperature to end - tabuLength=3) # number of cycli that recipe needs to be blocked - - @assert 0 < Tmin < Tmax "Temperatures should be positive" - @assert 0 < r < 1 "cooling rate is between 0 and 1" - solution = curSolution - obj = fridgeObjective([i for i in values(solution)]) - tabuList = String[i for i in keys(curSolution)] - - # current temperature - T = Tmax - while T > Tmin - print("T = $T \n") - # repeat kT times - for i in 1:kT - sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor - obj_sn = fridgeObjective([i for i in values(sn)]) - # if the neighbor improves the solution, keep it - # otherwise accept with a probability determined by the - # Metropolis heuristic - if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) - solution = sn - obj = obj_sn - end - - for recipe in keys(sn) - if !in(recipe, tabuList) - if length(tabuList) < tabuLength - pushfirst!(tabuList,recipe) - else - pop!(tabuList) - pushfirst!(tabuList,recipe) - end - end - end - end - #track!(tracker, f, s) # not yet implemented, maybe later - - # decay temperature - T *= r - end - - return solution -end - -#================================================== - OVERVIEW FUNCTION -==================================================# - -""" - findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) - -This function combines all other functions. This function checks if your ingredients are in the database, -if not it offers possible alternatives. Next it uses simulated annealing to find a better recipe combination. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- dataPath: A relative or absolute path to a .csv or .jld2 file containing the recipe database. - -## Optional Inputs: -- numRecipes: The max amount of recipes that a combo should contain. -- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. - -## Output: -- SASolution: A dictionary containing the best found combination of recipes. - -""" -function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) - - - # load the recipe dictionary from the db file - recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) - - # create a list of all ingredients in your database - ingredientList = createIngredientDatabase(recipeDict) - - # check for every food in your fridge if it's in the database. If not check if their are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList) - - # find the best greedy recipe - greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) - print("greedySolution = $greedySolution\n") - - # find the best recipe with SA - SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) - - # print the solution - print("The best recipes to make are:\n\n") - for recipeName in keys(SASolution) - print("$(recipeName) : $(recipeDict[recipeName])\n") - end - - return SASolution -end - -#================================================== - SUPPORTING FUNCTIONS -==================================================# - -""" - recipeToNumVector(fridgeList,ingredientList) - -This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal -to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. -If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. - -## Input: -- fridgeList: A list containing the different foods in your fridge as a string. -- ingredientList: A list containing all the ingredients used in a specific recipe. - -## Output: -- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, -that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. - -""" -function recipeToNumVector(fridgeList,ingredientList) - - numVector = zeros(Int64,length(fridgeList)+1) - for i in 1:length(fridgeList) - numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 - end - numVector[end] = length(ingredientList) - sum(numVector) - return numVector -end - -compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient - -end # module \ No newline at end of file From becfe42e0660964983fde81d0155dcea6e553b6f Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:20:17 +0100 Subject: [PATCH 37/57] add Fridge.jl --- src/Fridge.jl | 419 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 419 insertions(+) create mode 100644 src/Fridge.jl diff --git a/src/Fridge.jl b/src/Fridge.jl new file mode 100644 index 00000000..815a0651 --- /dev/null +++ b/src/Fridge.jl @@ -0,0 +1,419 @@ +module Fridge + +include("recipewebscraper.jl") + +using .recipeWebscraper, JLD2 + +export checkIngredients, greedyFindCombo, findBestRecipe, RandomCombo, removeRecipe, SAFindCombo, scrapeRecipe, loadRecipeDBCSV + +#================================================== + CHECK INGREDIENTS FUNCTIONS +==================================================# + +function createIngredientDatabase(recipeDict) + # create an unique vector of all ingredients used in the recipe database + ingredientList = [] + for ingredients in values(recipeDict) + append!(ingredientList,ingredients) + end + ingredientList = unique(ingredientList) + + return ingredientList +end + +""" + checkIngredients(fridgeList, ingredientList) + +This function checks if the foods in your fridge are also found in the ingredient overview +of the recipe database. If they are not found in the database, regex is used to find possible alternatives. +For instance cheese may be replaced by swiss cheese. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the different ingredients that are used in the recipe database. + +## Output: +- fridgeList: The (adapted) given fridgeList + +""" +function checkIngredients(fridgeList,ingredientList) + + + print("Checking if the food in your fridge is found in our database.\n\n") + + # check if the ingredients in the fridge are found in the database + for food in fridgeList + if food in ingredientList + print("Found $food in the ingredient database.\n") + else + print("Did not find $food in the ingredient database.\n\n") + if any(occursin.(food,ingredientList)) + print("Possible alternatives in database:\n") + alternatives = ingredientList[occursin.(food,ingredientList)] + for (indexNum, alternative) in enumerate(alternatives) + print("[$indexNum] $alternative\n") + end + print("If you want to take an alternative type its number, else type no.\n") + answer = readline() + if answer != "no" + correctInput = false + while !correctInput + try + answer = parse(Int64,answer) + correctInput = true + catch + print("Please only type the number of the alternative, eg. 1\n") + answer = readline() + end + end + fridgeList[fridgeList .== food] .= alternatives[answer] + print("Replaced $food with $(alternatives[answer])\n") + end + else + print("Did not find any alternative in the ingredient database.\n") + end + end + end + print("Done checking ingredients.\n\n") + + return fridgeList +end + +#================================================== + OBJECTIVE FUNCTIONS +==================================================# + +# objective function used to score a single recipe +fridgeObjective(x::Array{Int64}) = sum(x[1:end-1]) + 6*sum(x[1:end-1] .== 0) + 2*x[end] + +# objective function used to score a combination of recipes +fridgeObjective(x) = compatible(x) ? sum(sum(x) .== 0)*6 + sum(x)[end]*2 : Inf + +#================================================== + GREEDY ALGORITHM +==================================================# + +""" + greedyFindCombo(fridgeList, recipeDict, numRecipes) + +This function uses greedy search to find a good combination of recipes that match your fridge content. +It ranks all recipes based on the following formula + +``score = (ingredients from fridge used) + 6*(ingredients in fridge remaining) + 2*(extra ingredients needed)`` + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- bestCombo: A dictionary containing the best found combination of recipes. + +""" +function greedyFindCombo(fridgeList, recipeDict, numRecipes) + + bestCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + bestOrder = sortperm(ingredientsArray, by=fridgeObjective) + ingredientsArray = ingredientsArray[bestOrder] + namesArray = namesArray[bestOrder] + + tempRecipeName = namesArray[1] + bestCombo[tempRecipeName] = ingredientsArray[1] + + if all(isone.(sum(values(bestCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return bestCombo +end + +#================================================== + NEIGBOURHOODS +==================================================# + +""" + randomCombo(fridgeList, recipeDict, numRecipes) + +This function gives a random combination of recipes from the provided recipe dictionary. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. + +## Output: +- randCombo: A dictionary containing a random combination of recipes. +""" +function RandomCombo(fridgeList, recipeDict, numRecipes) + + randCombo = Dict() + ingredientsArray = [] + namesArray = [] + + for (name,ingredients) in recipeDict + push!(namesArray,name) + push!(ingredientsArray, recipeToNumVector(fridgeList, ingredients)) + end + + for i = 1:numRecipes + + randIndex = rand(1:length(namesArray)) + tempRecipeName = namesArray[randIndex] + randCombo[tempRecipeName] = ingredientsArray[randIndex] + + if all(isone.(sum(values(randCombo)))) + break + end + + namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + + if isempty(namesArray) + break + end + + end + + return randCombo +end + +""" + removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + +This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. +It also uses a tabulist to stimulate the use of new solutions. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Output: +- neighbour: A dictionary containing a combination of recipes. + +""" +function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + + toRemove = rand(curSolution)[1] + # adapt the fridgeList so that only ingredients from the removed ingredient are available + tempFridgeList = copy(fridgeList) + for recipe in keys(curSolution) + if recipe != toRemove + tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + end + end + + # adapt the recipeDict and use greedy search to find a new solution + tempRecipeDict = copy(recipeDict) + for recipe in keys(curSolution) + delete!(tempRecipeDict,recipe) + end + + for recipe in tabuList + try delete!(tempRecipeDict,recipe) + catch e + end + end + + if randRecipe + neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) + else + neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + end + + # correct recipe vectors + for recipe in keys(neighbour) + neighbour[recipe] = recipeToNumVector(fridgeList,recipeDict[recipe]) + end + + # here combine the two dictionaries + tempCurSolution = copy(curSolution) + delete!(tempCurSolution,toRemove) + neighbour = merge(neighbour,tempCurSolution) + + return neighbour +end + +#================================================== + SIMULATED ANNEALING ALGORITHM +==================================================# + +""" + SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; kT=100, r=0.75, Tmax=4, Tmin=1, tabuLength=3) + +This function uses simulated annealing to find a better combination of recipes that match your fridge content. +It starts with the current solution and tries to improve this. + +## Input: +- curSolution: The current best combination of recipes, given as a dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- fridgeList: A list containing the different foods in your fridge as a string. +- recipeDict: A dictionary in which the keys are the recipe names and the responding values are a list of the needed ingredients. +- numRecipes: The max amount of recipes that a combo should contain. +- tabuList: A list of recipes that should not be used in the found neighbour. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used for the neighbour. + +## Optional Inputs: +- kT: repetitions per temperature +- r: cooling rate +- Tmax: maximal temperature to start +- Tmin: minimal temperature to end +- tabuLength: Number of cycli that recipe needs to be blocked + +## Output: +- solution: A dictionary containing the best found combination of recipes. + +""" +function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecipe; + kT=100, # repetitions per temperature + r=0.75, # cooling rate + Tmax=4, # maximal temperature to start + Tmin=1, # minimal temperature to end + tabuLength=3) # number of cycli that recipe needs to be blocked + + @assert 0 < Tmin < Tmax "Temperatures should be positive" + @assert 0 < r < 1 "cooling rate is between 0 and 1" + solution = curSolution + obj = fridgeObjective([i for i in values(solution)]) + tabuList = String[i for i in keys(curSolution)] + + # current temperature + T = Tmax + while T > Tmin + print("T = $T \n") + # repeat kT times + for i in 1:kT + sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor + obj_sn = fridgeObjective([i for i in values(sn)]) + # if the neighbor improves the solution, keep it + # otherwise accept with a probability determined by the + # Metropolis heuristic + if obj_sn < obj || rand() < exp(-(obj_sn-obj)/T) + solution = sn + obj = obj_sn + end + + for recipe in keys(sn) + if !in(recipe, tabuList) + if length(tabuList) < tabuLength + pushfirst!(tabuList,recipe) + else + pop!(tabuList) + pushfirst!(tabuList,recipe) + end + end + end + end + #track!(tracker, f, s) # not yet implemented, maybe later + + # decay temperature + T *= r + end + + return solution +end + +#================================================== + OVERVIEW FUNCTION +==================================================# + +""" + findBestRecipe(fridgeList, csvPath; numRecipes=3, randRecipe=false) + +This function combines all other functions. This function checks if your ingredients are in the database, +if not it offers possible alternatives. Next it uses simulated annealing to find a better recipe combination. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- dataPath: A relative or absolute path to a .csv or .jld2 file containing the recipe database. + +## Optional Inputs: +- numRecipes: The max amount of recipes that a combo should contain. +- randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. + +## Output: +- SASolution: A dictionary containing the best found combination of recipes. + +""" +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) + + + # load the recipe dictionary from the db file + recipeDict = dataPath[end-3:end] == ".csv" ? loadRecipeDBCSV(dataPath) : load(dataPath) + + # create a list of all ingredients in your database + ingredientList = createIngredientDatabase(recipeDict) + + # check for every food in your fridge if it's in the database. If not check if their are alternatives. + fridgeList = checkIngredients(fridgeList, ingredientList) + + # find the best greedy recipe + greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + print("greedySolution = $greedySolution\n") + + # find the best recipe with SA + SASolution = SAFindCombo(greedySolution, fridgeList, recipeDict, numRecipes, randRecipe) + + # print the solution + print("The best recipes to make are:\n\n") + for recipeName in keys(SASolution) + print("$(recipeName) : $(recipeDict[recipeName])\n") + end + + return SASolution +end + +#================================================== + SUPPORTING FUNCTIONS +==================================================# + +""" + recipeToNumVector(fridgeList,ingredientList) + +This function changes an ingredients list of a recipe to a numeric vector. This vector has a length equal +to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, that position in the vector is a 1. +If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +## Input: +- fridgeList: A list containing the different foods in your fridge as a string. +- ingredientList: A list containing all the ingredients used in a specific recipe. + +## Output: +- numVector: This vector has a length equal to the number of foods in your fridge plus one. If a certain food from the fridge is used in the recipe, +that position in the vector is a 1. If not it is a 0. The last index of the vector contains the amount of extra ingredients needed. + +""" +function recipeToNumVector(fridgeList,ingredientList) + + numVector = zeros(Int64,length(fridgeList)+1) + for i in 1:length(fridgeList) + numVector[i] = fridgeList[i] in ingredientList ? 1 : 0 + end + numVector[end] = length(ingredientList) - sum(numVector) + return numVector +end + +compatible(x) = !any(sum(x)[1:end-1] .>= 2) # checks if two recipes use a same ingredient + +end # module \ No newline at end of file From 826fb71ba06b0e356c7351f1e1f2e92b839d92f3 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:22:03 +0100 Subject: [PATCH 38/57] fix CI --- docs/Project.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/Project.toml b/docs/Project.toml index 16656868..dfa65cd1 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -1,3 +1,2 @@ [deps] Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -STMOZOO = "8e7dc78f-7190-4116-bf88-3d148ae9f088" From 381701497b0e858a4880dd3e5c0c7fd939a767b7 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:24:52 +0100 Subject: [PATCH 39/57] hopefully CI --- src/Fridge.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Fridge.jl b/src/Fridge.jl index 815a0651..4f632645 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -1,6 +1,6 @@ module Fridge -include("recipewebscraper.jl") +include("recipeWebscraper.jl") using .recipeWebscraper, JLD2 From df495fb8c361918551aabacd75dd57a3ee8034d5 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 19:33:17 +0100 Subject: [PATCH 40/57] add coverage to CI --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91835553..e0ee9f5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,4 +23,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key - run: julia --project=docs/ docs/make.jl \ No newline at end of file + run: julia --project=docs/ --code-coverage=user docs/make.jl + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v1 \ No newline at end of file From 7889d0788f30b8fad8d2beb65640d9b641394b8c Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 20:25:51 +0100 Subject: [PATCH 41/57] improve CI --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0ee9f5a..d997f665 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,4 +25,7 @@ jobs: DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key run: julia --project=docs/ --code-coverage=user docs/make.jl - uses: julia-actions/julia-processcoverage@v1 - - uses: codecov/codecov-action@v1 \ No newline at end of file + - uses: julia-actions/julia-uploadcoveralls@latest + - uses: codecov/codecov-action@v1 + with: + file: lcov.info \ No newline at end of file From 39bb7069f872003f906cc2f5904565e3ca5c82b2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 20:31:10 +0100 Subject: [PATCH 42/57] fix coveralls --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d997f665..e0f44836 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,9 @@ on: tags: '*' pull_request: +env: + COVERALLS_TOKEN: 1DFS0iyWu4HHFuDsykE0TI5843M7noVZd + jobs: build: runs-on: ubuntu-latest @@ -25,7 +28,7 @@ jobs: DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key run: julia --project=docs/ --code-coverage=user docs/make.jl - uses: julia-actions/julia-processcoverage@v1 - - uses: julia-actions/julia-uploadcoveralls@latest - uses: codecov/codecov-action@v1 with: - file: lcov.info \ No newline at end of file + file: lcov.info + - uses: julia-actions/julia-uploadcoveralls@latest \ No newline at end of file From dcbb4633fd35d6a51eb4d3c1acd150ab78a52081 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 20:38:50 +0100 Subject: [PATCH 43/57] trying new CI --- .github/workflows/ci.yml | 72 +++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0f44836..ebe0f793 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,34 +1,68 @@ name: CI - on: + pull_request: + branches: + - master push: branches: - master tags: '*' - pull_request: - -env: - COVERALLS_TOKEN: 1DFS0iyWu4HHFuDsykE0TI5843M7noVZd - jobs: - build: - runs-on: ubuntu-latest + test: + name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} - ${{ github.event_name }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.6' # Replace this with the minimum Julia version that your package supports. E.g. if your package requires Julia 1.5 or higher, change this to '1.5'. + - '1' # Leave this line unchanged. '1' will automatically expand to the latest stable 1.x release of Julia. + - 'nightly' + os: + - ubuntu-latest + arch: + - x64 steps: - uses: actions/checkout@v2 - - name: test1 - run: ls /home/runner/work/Fridge.jl/Fridge.jl/src/ - - uses: julia-actions/setup-julia@latest + - uses: julia-actions/setup-julia@v1 with: - version: '1.6' - - name: Install dependencies - run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - - name: Build and deploy + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # If authenticating with GitHub Actions token - DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} # If authenticating with SSH deploy key - run: julia --project=docs/ --code-coverage=user docs/make.jl + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 - uses: julia-actions/julia-processcoverage@v1 - uses: codecov/codecov-action@v1 with: file: lcov.info - - uses: julia-actions/julia-uploadcoveralls@latest \ No newline at end of file + docs: + name: Documentation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: '1' + - run: | + julia --project=docs -e ' + using Pkg + Pkg.develop(PackageSpec(path=pwd())) + Pkg.instantiate()' + - run: | + julia --project=docs -e ' + using Documenter: doctest + using Fridge + doctest(Fridge)' # change MYPACKAGE to the name of your package + - run: julia --project=docs docs/make.jl + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} \ No newline at end of file From 1f54611203f2e72ff61bfada3d43947624359cd2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 20:48:37 +0100 Subject: [PATCH 44/57] add github badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41930aff..b73e9abb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Fridge.jl -[![](https://img.shields.io/badge/docs-latest-blue)](https://wardvanbelle.github.io/Fridge.jl/)\ +[![](https://img.shields.io/badge/docs-dev-blue)](https://wardvanbelle.github.io/Fridge.jl/dev) [![codecov](https://codecov.io/gh/wardvanbelle/Fridge.jl/branch/master/graph/badge.svg?token=GJ8JXBG5M1)](https://codecov.io/gh/wardvanbelle/Fridge.jl)\ \ by Ward Van Belle From ae1871f2f546bdae3db1d36d384de78b76d3b470 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 21:13:29 +0100 Subject: [PATCH 45/57] add tests for objective function and greedy search --- test/fridgeTest.jl | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 3a853ded..ee7f2294 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -3,6 +3,13 @@ using Fridge testList = ["cheese","potato","tomato","cabbage"] + testDict = Dict("fries" => ["potato","salt"], + "macaroni" => ["cheese", "salt", "jambon"], + "salad" => ["cabbage","tomato","oil","horseradish"], + "chocolatemilk" => ["chocolate","milk"]) + + testDict2 = Dict("fries" => ["potato","salt"], + "macaroni" => ["cheese", "salt", "jambon"]) @testset "checkIngredients" begin # check if all ingredients are passed if no replacement is needed @@ -12,4 +19,24 @@ @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) isa Vector{String} end + @testset "fridgeObjective" begin + # test objective for one recipe + @test fridgeObjective([0,1,0,1,2]) == 16 + + # test objective for multiple recipes + @test fridgeObjective([[0,1,0,1,2],[1,0,0,0,3]]) == 40 + @test fridgeObjective([[0,1,0,1,2],[1,1,0,0,3]]) == Inf + end + + @testset "greedyFindCombo" begin + # test max number of recipes end + @test greedyFindCombo(testList, testDict, 2) == Dict("salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) + + # test all ingredients used end + @test greedyFindCombo(testList, testDict, 3) == Dict("macaroni" => [1,0,0,0,2], "salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) + + # test no recipes left end + @test greedyFindCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) + end + end \ No newline at end of file From b13e0435b29af6d77990b0025d8b85ee318d7fde Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 21:33:07 +0100 Subject: [PATCH 46/57] added tests for RandomCombo --- test/fridgeTest.jl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index ee7f2294..aefe2401 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -11,6 +11,10 @@ testDict2 = Dict("fries" => ["potato","salt"], "macaroni" => ["cheese", "salt", "jambon"]) + testDict3 = Dict("fries" => ["potato","salt"], + "macaroni" => ["cheese", "salt", "jambon"], + "salad" => ["cabbage","tomato","oil","horseradish"]) + @testset "checkIngredients" begin # check if all ingredients are passed if no replacement is needed @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) == testList @@ -19,15 +23,6 @@ @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) isa Vector{String} end - @testset "fridgeObjective" begin - # test objective for one recipe - @test fridgeObjective([0,1,0,1,2]) == 16 - - # test objective for multiple recipes - @test fridgeObjective([[0,1,0,1,2],[1,0,0,0,3]]) == 40 - @test fridgeObjective([[0,1,0,1,2],[1,1,0,0,3]]) == Inf - end - @testset "greedyFindCombo" begin # test max number of recipes end @test greedyFindCombo(testList, testDict, 2) == Dict("salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) @@ -39,4 +34,14 @@ @test greedyFindCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) end + @testset "RandomCombo" begin + # test all ingredients used end + @test RandomCombo(testList, testDict3, 3) == Dict("macaroni" => [1,0,0,0,2], "salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) + + # test no recipes left end + @test RandomCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) + + # test length of max number recipes end + @test length(values(RandomCombo(testList, testDict, 2))) == 2 + end end \ No newline at end of file From 5296c49fe841c987c37e0a4b60c54f4d44db9fb6 Mon Sep 17 00:00:00 2001 From: warvbell Date: Sun, 30 Jan 2022 21:57:48 +0100 Subject: [PATCH 47/57] added tests for neighbour function --- notebook/fridgeNotebook.jl | 1 + src/Fridge.jl | 16 ++++++++-------- test/fridgeTest.jl | 21 +++++++++++++++++---- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index 8720f2b6..f33c6b44 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -450,6 +450,7 @@ function Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, ra for recipe in keys(curSolution) if recipe != toRemove tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + numRecipes -= 1 end end diff --git a/src/Fridge.jl b/src/Fridge.jl index 4f632645..64be150c 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -4,7 +4,7 @@ include("recipeWebscraper.jl") using .recipeWebscraper, JLD2 -export checkIngredients, greedyFindCombo, findBestRecipe, RandomCombo, removeRecipe, SAFindCombo, scrapeRecipe, loadRecipeDBCSV +export checkIngredients, greedyFindCombo, findBestRecipe, randomCombo, Neighbour, SAFindCombo, scrapeRecipe, loadRecipeDBCSV #================================================== CHECK INGREDIENTS FUNCTIONS @@ -163,7 +163,7 @@ This function gives a random combination of recipes from the provided recipe dic ## Output: - randCombo: A dictionary containing a random combination of recipes. """ -function RandomCombo(fridgeList, recipeDict, numRecipes) +function randomCombo(fridgeList, recipeDict, numRecipes) randCombo = Dict() ingredientsArray = [] @@ -197,7 +197,7 @@ function RandomCombo(fridgeList, recipeDict, numRecipes) end """ - removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) + Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) This is a function that looks for a neighbour of the current solution. This function is used in the simulated annealing algorithm. It also uses a tabulist to stimulate the use of new solutions. @@ -214,7 +214,7 @@ It also uses a tabulist to stimulate the use of new solutions. - neighbour: A dictionary containing a combination of recipes. """ -function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) +function Neighbour(curSolution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) toRemove = rand(curSolution)[1] # adapt the fridgeList so that only ingredients from the removed ingredient are available @@ -222,9 +222,9 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, for recipe in keys(curSolution) if recipe != toRemove tempFridgeList = [i for i in fridgeList if !in(i,recipeDict[recipe])] + numRecipes -= 1 end end - # adapt the recipeDict and use greedy search to find a new solution tempRecipeDict = copy(recipeDict) for recipe in keys(curSolution) @@ -238,9 +238,9 @@ function removeRecipe(curSolution, fridgeList, recipeDict, numRecipes, tabuList, end if randRecipe - neighbour = RandomCombo(tempFridgeList, tempRecipeDict, numRecipes) + neighbour = randomCombo(tempFridgeList, tempRecipeDict, numRecipes) else - neighbour = GreedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) + neighbour = greedyFindCombo(tempFridgeList, tempRecipeDict, numRecipes) end # correct recipe vectors @@ -304,7 +304,7 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip print("T = $T \n") # repeat kT times for i in 1:kT - sn = removeRecipe(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor + sn = Neighbour(solution, fridgeList, recipeDict, numRecipes, tabuList, randRecipe) # random neighbor obj_sn = fridgeObjective([i for i in values(sn)]) # if the neighbor improves the solution, keep it # otherwise accept with a probability determined by the diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index aefe2401..7cf4f309 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -15,6 +15,8 @@ "macaroni" => ["cheese", "salt", "jambon"], "salad" => ["cabbage","tomato","oil","horseradish"]) + testSolution = Dict("salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) + @testset "checkIngredients" begin # check if all ingredients are passed if no replacement is needed @test checkIngredients(testList,["cheese","salt","tomato","chocolate"]) == testList @@ -34,14 +36,25 @@ @test greedyFindCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) end - @testset "RandomCombo" begin + @testset "randomCombo" begin # test all ingredients used end - @test RandomCombo(testList, testDict3, 3) == Dict("macaroni" => [1,0,0,0,2], "salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) + @test randomCombo(testList, testDict3, 3) == Dict("macaroni" => [1,0,0,0,2], "salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) # test no recipes left end - @test RandomCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) + @test randomCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) # test length of max number recipes end - @test length(values(RandomCombo(testList, testDict, 2))) == 2 + @test length(values(randomCombo(testList, testDict, 2))) == 2 + end + + @testset "Neighbour" begin + # test not random with empty tabuList + @test "macaroni" in keys(Neighbour(testSolution, testList, testDict, 2, [], false)) + + # test not random with tabuList + @test !in("macaroni",keys(Neighbour(testSolution, testList, testDict, 2, ["macaroni"], false))) + + # test length of random with empty tabuList + @test length(values(Neighbour(testSolution, testList, testDict, 2, [], true))) == 2 end end \ No newline at end of file From e2f739844ca8a3e25ba1d677588362b70ea5f5fb Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 10:09:13 +0100 Subject: [PATCH 48/57] greedy now only uses recipes that use fridge items --- src/Fridge.jl | 10 ++++++++- test/example.jl | 51 ---------------------------------------------- test/fridgeTest.jl | 3 +++ 3 files changed, 12 insertions(+), 52 deletions(-) delete mode 100644 test/example.jl diff --git a/src/Fridge.jl b/src/Fridge.jl index 64be150c..93f2003d 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -127,9 +127,15 @@ function greedyFindCombo(fridgeList, recipeDict, numRecipes) ingredientsArray = ingredientsArray[bestOrder] namesArray = namesArray[bestOrder] + # break if all recipes that are left, don't use anything from the fridge + if all(ingredientsArray[1][1:end-1] .== 0) + break + end + tempRecipeName = namesArray[1] bestCombo[tempRecipeName] = ingredientsArray[1] + # break if all ingredients are used if all(isone.(sum(values(bestCombo)))) break end @@ -137,6 +143,7 @@ function greedyFindCombo(fridgeList, recipeDict, numRecipes) namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + # break if there are no recipes left if isempty(namesArray) break end @@ -180,6 +187,7 @@ function randomCombo(fridgeList, recipeDict, numRecipes) tempRecipeName = namesArray[randIndex] randCombo[tempRecipeName] = ingredientsArray[randIndex] + # break if all ingredients are used if all(isone.(sum(values(randCombo)))) break end @@ -187,6 +195,7 @@ function randomCombo(fridgeList, recipeDict, numRecipes) namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& randCombo[tempRecipeName][1:end-1] ) == 0] + # break if there are no recipes left if isempty(namesArray) break end @@ -325,7 +334,6 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip end end end - #track!(tracker, f, s) # not yet implemented, maybe later # decay temperature T *= r diff --git a/test/example.jl b/test/example.jl deleted file mode 100644 index d554036c..00000000 --- a/test/example.jl +++ /dev/null @@ -1,51 +0,0 @@ -# example of a unit test in Julia -# runs a test for a certain module -# to run the tests, first open the package manager (`]` in REPL), -# activate the project if not done so and then enter `test` - -# wrap all your tests and subgroups in a `@testset` block -@testset "Example" begin - using STMOZOO.Example # load YOUR module - - @testset "solve quadratic" begin - # test some cases - @test solve_quadratic_system(8.0, -2.0, 3.0) == 0.25 - - # test for type - @test solve_quadratic_system(7.0, 27.4, 3.0) isa Number - - # test for type stability - @test solve_quadratic_system(1//2 , -2//1, 3//1) isa Rational - - P = [10 1; 1 5] - q = [100, -7] - - # test for a result - # use ≈ (`\approx`) to check approximate equality - # useful for rounding errors - # NOTE: does NOT work on ≈ 0! - @test solve_quadratic_system(P, q) ≈ - P \ q - @test solve_quadratic_system(P, q, testPD=true) isa Vector - - # test if a certain error is thrown - @test_throws AssertionError solve_quadratic_system(-P, q, testPD=true) - end - - @testset " quadratic function" begin - f_scalar = quadratic_function(3, 4, 8) - - @test f_scalar isa Function - @test f_scalar(2) isa Number - @test f_scalar(2) ≈ 0.5 * 3 * 2^2 + 4 * 2 + 8 - - P = [9.0 -2; -2 3] - q = [-3, -4] - r = -π - x = [-2.0, 2.8] - - f_vect = quadratic_function(P, q, r) - @test f_vect isa Function - @test f_vect(x) isa Number - @test f_vect(x) ≈ 0.5x' * P * x + q' * x + r - end -end \ No newline at end of file diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 7cf4f309..39d82784 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -34,6 +34,9 @@ # test no recipes left end @test greedyFindCombo(testList, testDict2, 3) == Dict("macaroni" => [1,0,0,0,2], "fries" => [0,1,0,0,1]) + + # test no recipes left that use ingredients from the fridge + @test greedyFindCombo(testList, testDict, 4) == Dict("macaroni" => [1,0,0,0,2], "salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) end @testset "randomCombo" begin From af0fc59119cd7530d9aa3ad0dcc931b850350382 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 10:27:07 +0100 Subject: [PATCH 49/57] added tests for SAFindCombo --- test/fridgeTest.jl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 39d82784..8ca14268 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -15,6 +15,14 @@ "macaroni" => ["cheese", "salt", "jambon"], "salad" => ["cabbage","tomato","oil","horseradish"]) + testDict4 = Dict("fries" => ["potato","salt"], + "macaroni" => ["cheese", "salt", "jambon"], + "salad" => ["cabbage","tomato","oil","horseradish"], + "chocolatemilk" => ["chocolate","milk"], + "waffle" => ["sugar", "eggs", "milk"], + "thea" => ["herbs", "water"], + "coffee" => ["coffeebeans", "water"]) + testSolution = Dict("salad" => [0,0,1,1,2], "fries" => [0,1,0,0,1]) @testset "checkIngredients" begin @@ -60,4 +68,12 @@ # test length of random with empty tabuList @test length(values(Neighbour(testSolution, testList, testDict, 2, [], true))) == 2 end + + @testset "SAFindCombo" begin + # test output type + @test typeof(SAFindCombo(testSolution, testList, testDict4, 2, true, tabulength=1)) == Dict{Any, Any} + + # test output length + @test length(values(SAFindCombo(testSolution, testList, testDict4, 2, true, tabulength=1))) == 2 + end end \ No newline at end of file From 16e175c7069a95465050d9a5bcf025e2c1007290 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 10:46:52 +0100 Subject: [PATCH 50/57] added tests for the recipe webscraper --- test/fridgeTest.jl | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 8ca14268..651cbb1d 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -71,9 +71,21 @@ @testset "SAFindCombo" begin # test output type - @test typeof(SAFindCombo(testSolution, testList, testDict4, 2, true, tabulength=1)) == Dict{Any, Any} + @test typeof(SAFindCombo(testSolution, testList, testDict4, 2, true, tabuLength=1)) == Dict{Any, Any} # test output length - @test length(values(SAFindCombo(testSolution, testList, testDict4, 2, true, tabulength=1))) == 2 + @test length(values(SAFindCombo(testSolution, testList, testDict4, 2, true, tabuLength=1))) == 2 + end + + @testset "scrapeRecipe" begin + # check if .csv file is produced + scrapeRecipe(106541,106542,"./testDB.csv") + @test isfile("./testDB.csv") + end + + @testset "loadRecipeDBCSV" begin + # check if downloaded recipes are correct + testDictDB = loadRecipeDBCSV("./testDB.csv") + @test keys(testDictDB) == keys(Dict("Belgian Chocolate Mousse" => ["test"], "Belgian Buns" => ["test"])) end end \ No newline at end of file From ef144a20585c588d0fb5cf56982879f0d9abb108 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 11:02:17 +0100 Subject: [PATCH 51/57] fixed documentation of Neighbour function and randomCombo function --- docs/src/searchAlgorithms.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/searchAlgorithms.md b/docs/src/searchAlgorithms.md index 6e3482a7..e1bdfa4d 100644 --- a/docs/src/searchAlgorithms.md +++ b/docs/src/searchAlgorithms.md @@ -17,6 +17,6 @@ SAFindCombo ### Neighbour Functions ```@docs -RandomCombo -removeRecipe +randomCombo +Neighbour ``` \ No newline at end of file From 499f940384b8fca418367e39217dd0e36995bddc Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 12:49:17 +0100 Subject: [PATCH 52/57] remove instructions.md file --- instructions.md | 100 ------------------------------------------------ 1 file changed, 100 deletions(-) delete mode 100644 instructions.md diff --git a/instructions.md b/instructions.md deleted file mode 100644 index bb96327c..00000000 --- a/instructions.md +++ /dev/null @@ -1,100 +0,0 @@ -# Assignments - -Edition 2021-2022 - -This file gives a detailed overview of what you have to do for this project. - -## In brief - -For the exam project, you pick a optimization related topic of your interest that is *not* covered in detail in class. This can be an algorithm, an application you solve with methods seen the course or some theoretical aspect you want to study. You write some code that you add to the STMOZOO codebase (including documentation, tests etc.) and illustrate you application in a notebook. - -## Getting started - -- [ ] pick a project (take a look at `project ideas.md` or discuss with Michiel) -- [ ] [fork](https://docs.github.com/en/enterprise-server@2.20/github/getting-started-with-github/fork-a-repo) this repo -- [ ] rename your repo using a short indicative name, e.g., `GeneticProgramming.jl`. Add `.jl` to indicate this is a Julia package. **Don't use spaces in the name!** -- [ ] make a local clone of the repository -- [ ] add the repo with your project to the project sheet -- [ ] update the `readme.md` - - [ ] add title - - [ ] add your names - - [ ] add a small abstract/example of what the code should do - -## Source code - -> **This part is optional!** Most of you will work in a Pluto notebook, so you don't have to add source code as well (it is hard to import in the notebook). Just put your functions tidily in an appendix at the bottom of a notebook. - -Every project needs to have some source code, at least one function! You have to decide which parts belong in the source code (and can hence be readily loaded by other users) and which parts of your project will be in the notebook where people can see and interact with your code. - -Developing code can be done in any text editor, though we highly recommend [Visual Studio Code](https://code.visualstudio.com/), with Juno the environment for Julia. [Atom](https://atom.io/) is an alternative but is not supported anymore. When developing, you have to activate your project. Assuming that the location of the REPL is the project folder, open the Pkg manager (typing `]`) and type `activate .`. The dot indicated the current directory. If you use external packages in your project, for example, Zygote or LinearAlgebra, you have to add them using `add PACKAGE` in the package manager. This action will create a dependency and update the `Project.toml` file. - -Importantly, all your code should be in a [module](https://docs.julialang.org/en/v1/manual/modules/), where you export only the functions useful for the user. - -- [ ] In the `src` folder, add a new Julia file with your source code, for example `geneticprogramming.jl`. Don't use spaces or capitals in the file name. -- [ ] Link your file in `STMOZOO.jl` using `include(filename)`, running the code. -- [ ] Create a module environment in your file for all your code. Use [camel case](https://en.wikipedia.org/wiki/Camel_case) for the name. - - use `module GeneticProgramming begin ... end` to wrap your code; - - import everything you need from external packages: `using LinearAlgebra: norm`; - - export your functions using `export` -- [ ] write awesome code! -- [ ] take a look at your code regarding the [Julia style guide](https://docs.julialang.org/en/v1/manual/style-guide/) -- [ ] check the [Julia performance tips](https://docs.julialang.org/en/v1/manual/performance-tips/) -- [ ] document *every* function! Make sure that an external user can understand everything! Be liberal with comments in your code. Take a look at the [guidelines](https://docs.julialang.org/en/v1/manual/documentation/) - -## Unit tests - -> **This part is optional!** Again, you only need to provide a notebook. You are encouraged to add some unit tests in the notebook (make it a hidden cell). You can do this by importing `Test` and add an `@testset` as decribed below. - -Great, we have written some code. The question is, does it work? Likely you have experimented in the REPL. For a larger project, we would like to have guarantees that it works, though. Luckily, this is very easy in Julia, where we can readily use [Unit testing](https://docs.julialang.org/en/v1/stdlib/Test/). - -You will have to write a file with some unit tests, ideally testing every function you have written! The fraction of functions that are tested is called [code coverage](https://en.wikipedia.org/wiki/Code_coverage). This project is monitored automatically using Travis (check the button on the readme page!). Currently, coverage is 100%, so help to keep this as high as possible! - -Tests can be executed using the `@test` macro. You evaluate some functions and check their results. The result should evaluate to `true`. For example: `@test 1+1 == 2` or `@test √(9) ≈ 3.0`. - -It makes sense to group several tests, which can be done using `@testset "names of tests" begin ... end`. - -Your assignments: -- [ ] add a source file to the `test/` folder, the same name as your source code file. -- [ ] add an `include(...)` with the filename in `runtests.jl` -- [ ] in your file, add a block `@testset "MyModule" begin ... end` with a series of sensible unit tests. Use subblocks of `@testset` if needed. -- [ ] run your tests, in the package manager, type `test`. It will run all tests and generate a report. - -Travis will automatically run your unit tests online when you push to the origin repo. - -## Documentation - -> **This part is optional!** If you just provide a couple of examples how to use your code in the readme, it is fine. - -Hopefully, you have already documented all your functions, so this should be a breeze! We will generate a documentation page using the [Documenter](https://juliadocs.github.io/Documenter.jl/stable/man/guide/) package. Since we will not put the project in the package manager, we won't host the documentation, though we generate HTML pages anyway. - -- [ ] add markdown file to `docs/src/man` with the documentation. -- [ ] write a general introduction explaining the rationale of your code. -- [ ] use a `@docs` block to add your functions with their documentation. -- [ ] update the `make.jl` file, linking your page. -- [ ] run the `make.jl` file to generate the documentation, an HTML file, not added to the repo. - -## Notebook - -> **This is the most important part!** Add all your functionality and explanation to the Pluto notebook so that it is stand-alone. Try to make sure that your initial examples are sufficiently small so it does not take too long to run the notebook. - -Finally, you have to add a [Pluto](https://github.com/fonsp/Pluto.jl) notebook to the `notebook` folder. Again use the same name you used for your source code. Depending on the nature of your project, this will be the most extensive task! Make full use of Pluto's interactivity to illustrate your code. In contrast to the documentation page, this is not the place to explain your functions but rather show what you can do with your software or explain a concept. - -Alternatively, you may use [Literate](https://fredrikekre.github.io/Literate.jl/v2/) to have script with text annotation to explain your code/package. Up to you what you feel most comfortable with. - -## Code review - -Each of you will have to perform a code review of two other projects. You have till noon 13h of the exam date to do this, though it should not take too long. The aim is to **help** the other groups to make each other's project even better. - -- [ ] make a fork or local clone of the repo of the person you are reviewing; -- [ ] (if relevant) check the source code, is the documentation clear? Anything obvious that can be improved. -- [ ] (if relevant) run the tests. Do they work? Anything that could be tested but is not done so? -- [ ] Is the documentation clear? Do you find any typos? Could an example be added? -- [ ] Take a good look at the notebook. Any suggestions there to improve this? - -Big things can be addressed by opening an issue. Small fixes and suggestions to the other person's code can be done immediately and via a pull request. - -Afterwards, you have the rest of the day to: -- [ ] merge the entire request and fix any issues you find meaningful. -- [ ] fill in a small questionnaire on Ufora about your project and the projects you have reviewed. - -When your code is final, you can [tag](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/managing-commits/managing-tags) your latest commit and mention Michiel you are finished (mention `@michielstock`). From 3a7b0a06e825d103ad1185221b83c9b3e48dc8fd Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 13:57:22 +0100 Subject: [PATCH 53/57] fixed bug in notebook --- BelgianRecipeDB.csv | 327 +++++++++++++++++++++++++++++++++++++ notebook/fridgeNotebook.jl | 7 + 2 files changed, 334 insertions(+) create mode 100644 BelgianRecipeDB.csv diff --git a/BelgianRecipeDB.csv b/BelgianRecipeDB.csv new file mode 100644 index 00000000..0fa26623 --- /dev/null +++ b/BelgianRecipeDB.csv @@ -0,0 +1,327 @@ +first,second +Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" +Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" +Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" +Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" +Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" +Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" +Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" +Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" +Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" +Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" +Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" +Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" +Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" +Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" +Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]" +Gaufres (Authentic Belgian Waffles),"Any[""egg"", ""sugar"", ""sugar"", ""purpose flour"", ""purpose flour"", ""butter"", ""butter""]" +Chocolate Raspberry Truffles With Fresh Raspberries,"Any[""raspberry"", ""chocolate"", ""heavy cream"", ""salt"", ""cocoa powder""]" +Decadent Pumpkin Pie Belgian Waffles,"Any[""butter"", ""pumpkin puree"", ""dark brown sugar"", ""sugar"", ""cinnamon"", ""ginger"", ""clove"", ""nutmeg"", ""salt"", ""purpose flour"", ""double acting baking powder"", ""baking soda"", ""milk"", ""cream"", ""egg"", ""dark rum"", ""vanilla extract"", ""vanilla ice cream"", ""maple syrup""]" +Classic French Tarte Au Citron - Fresh Lemon Tart,"Any[""shortcrust pastry"", ""lemon juice"", ""lemon zest"", ""creme fraiche"", ""caster sugar"", ""egg"", ""icing sugar""]" +Chocolate Cupcakes,"Any[""milk chocolate"", ""butter"", ""flour"", ""baking powder"", ""sugar"", ""egg"", ""cocoa powder"", ""walnut""]" +Dame Blanche,"Any[""chocolate"", ""cream"", ""vanilla ice cream"", ""cream""]" +Godiva Chocolate Fondue,"Any[""godiva dark chocolate bar"", ""heavy cream"", ""vanilla""]" +Dark Chocolate Pudding,"Any[""sugar"", ""cornstarch"", ""salt"", ""milk"", ""egg yolk"", ""dark chocolate candy bar"", ""vanilla extract"", ""cream"", ""chocolate""]" +Belgian Lukken waffle cookies,"Any[""egg"", ""butter"", ""flour"", ""brown sugar"", ""vanilla"", ""salt"", ""whiskey""]" +Belgian Chocolate Lace Wafers,"Any[""flour"", ""almond"", ""dark corn syrup"", ""brown sugar"", ""butter"", ""chocolate""]" +Gianduia (Gianduja) (Nutella) (Chocolate Hazelnut Spread),"Any[""dark chocolate"", ""icing sugar"", ""peanut oil nut"", ""hazelnut""]" +Tarte Au Sucre Brun,"Any[""pie crust"", ""egg"", ""cream"", ""brown sugar"", ""butter"", ""sugar""]" +Liege Waffle Recipe - Liège Gaufre Recette,"Any[""active yeast"", ""milk"", ""water"", ""water"", ""bread flour"", ""egg"", ""brown sugar"", ""brown sugar"", ""salt"", ""baking powder"", ""butter"", ""honey"", ""vanilla"", ""sugar""]" +Poached Pears in Kriek,"Any[""beer"", ""sugar"", ""cinnamon"", ""lemon"", ""pear""]" +Sweet and Savory Rosemary Belgian Waffles,"Any[""egg"", ""buttermilk"", ""milk"", ""cake flour"", ""baking powder"", ""kosher salt"", ""canola oil"", ""rosemary"", ""coconut sugar""]" +Liege Waffles (Belgian Pearl Sugar Waffles),"Any[""yeast"", ""water"", ""sugar"", ""salt"", ""flour"", ""egg"", ""butter"", ""sugar""]" +Belgian Rice Tart (Tarte Au Riz),"Any[""yeast"", ""flour"", ""milk"", ""sugar"", ""canola oil"", ""egg"", ""salt"", ""butter"", ""grain rice"", ""milk"", ""sugar"", ""egg"", ""vanilla extract""]" +Speculoos (A Flemish Spice Cookie),"Any[""purpose flour"", ""baking powder"", ""salt"", ""cinnamon"", ""ginger"", ""clove"", ""dark brown sugar"", ""butter"", ""egg"", ""flour""]" +Heavenly Chocolate Mousse,"Any[""egg"", ""sugar"", ""dark chocolate"", ""egg white"", ""cream""]" +Pom Koek (Belgian Coffee Cake),"Any[""flour"", ""sugar"", ""baking soda"", ""cinnamon"", ""clove"", ""salt"", ""honey"", ""coffee"", ""egg"", ""corn oil""]" +Godiva Strawberry White Chocolate Mint Frappé,"Any[""strawberry"", ""sugar"", ""lemon juice"", ""heavy cream"", ""milk"", ""white chocolate"", ""vanilla extract"", ""strawberry"", ""lemon juice"", ""confectioner ' sugar"", ""heavy cream"", ""mint leaf"", ""dark chocolate""]" +Belgian Plum Flan,"Any[""shortcrust pastry"", ""water"", ""caster sugar"", ""plum"", ""sugar"", ""egg yolk"", ""flour"", ""milk"", ""butter"", ""vanilla extract"", ""apricot jam"", ""lemon juice""]" +French Tart's Classic Madeleines: Madelines: Little Fluted Cakes,"Any[""egg"", ""vanilla extract"", ""lemon zest"", ""icing sugar"", ""plain flour"", ""baking powder"", ""butter"", ""icing sugar""]" +Glazed Rice Tart (Tarte De Riz),"Any[""almond"", ""grain rice"", ""milk"", ""sugar"", ""salt"", ""egg"", ""vanilla"", ""almond"", ""apricot jam"", ""kirsch liqueur"", ""whipping cream"", ""sugar""]" +Riz Au Lait,"Any[""pudding rice"", ""milk"", ""sugar"", ""vanilla extract"", ""butter""]" +Belgian Tuile Cookies,"Any[""butter"", ""sugar"", ""egg white"", ""vanilla"", ""salt"", ""purpose flour"", ""chocolate""]" +A Symphony of French Chocolate Truffles,"Any[""dark chocolate"", ""cream"", ""butter"", ""rum"", ""cocoa powder"", ""gingerroot"", ""almond"", ""dark chocolate"", ""peanut oil"", ""cocoa"", ""paper truffle"", ""parchment paper"", ""cocoa powder""]" +Jb's Classic Belgian Waffles (And Variations),"Any[""purpose flour"", ""sugar"", ""baking powder"", ""salt"", ""milk"", ""vegetable oil"", ""egg"", ""blueberry"", ""fruit syrup"", ""fruit sauce berry"", ""sugar"", ""yogurt""]" +Jam and Bread Pudding,"Any[""challah"", ""strawberry jam"", ""strawberry jam"", ""egg"", ""sugar"", ""half"", ""half"", ""vanilla"", ""butter"", ""sugar""]" +Speculoosbavarois,"Any[""milk"", ""cream"", ""vanilla sugar"", ""egg"", ""sugar"", ""sugar"", ""gelatin""]" +Our Favourite Belgian Waffles,"Any[""milk"", ""egg"", ""butter"", ""sugar"", ""flour"", ""salt""]" +"Oooh La La! French Savoury Ham, Cheese and Olive Cake","Any[""egg"", ""plain white flour"", ""baking powder"", ""olive oil"", ""butter"", ""white wine"", ""port wine"", ""green olive"", ""ham"", ""gruyere"", ""salt"", ""pepper""]" +Thermomix Belgian Lemon Teacake,"Any[""butter"", ""sugar"", ""self raising flour"", ""egg"", ""lemon juice"", ""sugar"", ""egg"", ""butter""]" +Flemish Sugar Tart,"Any[""milk"", ""active yeast"", ""purpose flour"", ""sugar"", ""cinnamon"", ""salt"", ""egg"", ""butter"", ""heavy cream"", ""egg"", ""vanilla extract"", ""dark brown sugar"", ""butter"", ""confectioner ' sugar"", ""currant"", ""cream""]" +Tarte Au Flan,"Any[""pie crust"", ""milk"", ""vanilla pod"", ""egg"", ""sugar"", ""cornstarch"", ""butter"", ""decorator sugar""]" +Mocha Cheesecake,"Any[""chocolate wafer"", ""sugar"", ""butter"", ""baking chocolate"", ""cream cheese"", ""egg"", ""sugar"", ""coffee"", ""salt"", ""baking chocolate"", ""sugar"", ""cream""]" +Quick and Easy French Cognac and Creme Fraiche Ice Cream,"Any[""creme fraiche"", ""icing sugar"", ""cognac""]" +Buttery Cupcakes,"Any[""flour"", ""butter"", ""sugar"", ""egg"", ""vanilla sugar"", ""baking powder""]" +Witbrood,"Any[""yeast"", ""water"", ""sugar"", ""flour"", ""salt"", ""milk"", ""sugar"", ""vegetable oil"", ""water""]" +Pears Poached in Spiced Red Wine,"Any[""pear"", ""red wine"", ""lemon"", ""clove"", ""sugar"", ""vanilla extract"", ""cinnamon"", ""lemon zest"", ""mint leaf""]" +Lemon Belgian Waffles With Berry Syrup,"Any[""cake flour"", ""salt"", ""baking powder"", ""nutmeg"", ""buttermilk"", ""lemon juice zest"", ""egg"", ""cream tartar"", ""water"", ""corn syrup"", ""sugar"", ""berry""]" +Melting Belgian Chocolate Cake,"Any[""cocoa"", ""chocolate"", ""butter"", ""egg"", ""egg yolk"", ""sugar"", ""dark beer"", ""purpose flour"", ""whipping cream"", ""superfine sugar"", ""vanilla""]" +Strawberry Belgian Waffles Recipe,"Any[""egg"", ""flour"", ""milk"", ""butter"", ""sugar"", ""baking powder"", ""cinnamon"", ""salt"", ""vanilla"", ""strawberry"", ""heavy whipping cream"", ""sugar""]" +Milky Carrots,"Any[""carrot"", ""onion"", ""butter"", ""milk"", ""pepper""]" +Croque Boum,"Any[""bread"", ""ham"", ""swiss cheese"", ""spaghetti sauce"", ""butter""]" +Crispy Potatoes and Leeks,"Any[""butter"", ""leek"", ""russet potato"", ""green onion"", ""salt"", ""black pepper"", ""thyme"", ""olive oil"", ""parsley""]" +Belgian Mayonnaise to Serve With Frites,"Any[""egg yolk"", ""dijon mustard"", ""lemon juice"", ""salt pepper"", ""cold water"", ""salad oil""]" +Chicory With Lemon Flemish Style,"Any[""chicory lettuce"", ""butter"", ""chicken stock"", ""brown sugar"", ""lemon"", ""white pepper""]" +Belgian Endive Appetizer,"Any[""belgian endive"", ""blue cheese"", ""walnut"", ""chutney""]" +Brussels Sprouts With Chestnuts,"Any[""brussels sprout"", ""oil"", ""chestnut"", ""salt"", ""pepper""]" +Rice With Mushrooms,"Any[""rice"", ""mushroom"", ""butter"", ""onion"", ""parsley"", ""white wine"", ""tomato puree"", ""chicken stock"", ""cheese""]" +1840s Liege Waffle,"Any[""flour"", ""yeast"", ""egg yolk"", ""water"", ""honey"", ""brown sugar"", ""vanilla"", ""flour"", ""wheat flour"", ""rye flour"", ""salt"", ""egg white"", ""baking soda"", ""vinegar"", ""butter"", ""sugar""]" +Roasted Bone Marrow With Caramelized White Turnip,"Any[""beef marrow"", ""leek"", ""carrot"", ""garlic clove"", ""bay leaf"", ""turnip"", ""sugar"", ""butter"", ""parsley"", ""sea salt""]" +Cucumber Soup (Warm),"Any[""english cucumber"", ""onion"", ""chicken stock cube"", ""milk"", ""salt pepper""]" +Belgian Stoemp Aux Carottes (Carrot Mashed Potatoes),"Any[""potato"", ""carrot"", ""bacon"", ""butter"", ""heavy cream"", ""salt"", ""pepper"", ""nutmeg""]" +Orange Blossom,"Any[""orange"", ""almond syrup"", ""gin"", ""pink grapefruit juice"", ""angostura bitter""]" +Braised Belgian Endive,"Any[""butter"", ""endive"", ""onion"", ""celery"", ""carrot"", ""thyme"", ""chicken stock"", ""butter""]" +Breakfast in Bread,"Any[""english muffin"", ""egg"", ""orange juice"", ""white wine vinegar"", ""sugar"", ""extra virgin olive oil"", ""dijon mustard"", ""salt"", ""black pepper"", ""cream"", ""mesclun"", ""walnut"", ""orange wedge""]" +The Classic French Bistro Sandwich - Croque Monsieur,"Any[""white bread"", ""butter"", ""ham"", ""gruyere cheese"", ""egg"", ""water"", ""salt"", ""black pepper""]" +Belgian Chicken Fricassee (Vol-Au-Vent),"Any[""chicken breast"", ""meat pork beef pepper"", ""mushroom"", ""ham"", ""chicken stock"", ""butter"", ""plain flour"", ""gouda cheese"", ""egg yolk"", ""lemon"", ""salt"", ""pepper""]" +Peanut Butter Cup,"Any[""frangelico liqueur"", ""buttershots butterscotch schnapps"", ""godiva chocolate liqueur"", ""milk""]" +Elegant Beef Blue,"Any[""beef tenderloin steak"", ""asparagus"", ""thyme"", ""salt"", ""pepper"", ""butter"", ""olive oil"", ""white wine"", ""beef consomme"", ""half"", ""blue cheese""]" +Healthy Pumpkin Belgian Waffles,"Any[""bisquick"", ""wheat pastry flour"", ""brown sugar"", ""pumpkin pie spice"", ""pumpkin puree"", ""milk"", ""applesauce"", ""vegetable oil"", ""egg beater substitute"", ""wheat germ"", ""flax seed"", ""walnut""]" +Red Tomato Chutney,"Any[""tomato"", ""red bell pepper"", ""red onion"", ""cranberry"", ""cider vinegar"", ""sugar"", ""brown sugar"", ""ginger"", ""salt"", ""mustard seed"", ""cinnamon"", ""cumin"", ""allspice"", ""red pepper""]" +Hashed Brussels Sprouts With Lemon Zest,"Any[""lemon juice"", ""lemon zest"", ""brussels sprout"", ""olive oil"", ""butter"", ""garlic clove"", ""black mustard seed"", ""white wine"", ""salt pepper""]" +Godiva Chocolate Sugar Cookies,"Any[""godiva dark chocolate bar"", ""purpose flour"", ""baking soda"", ""butter"", ""confectioner ' sugar"", ""egg"", ""vanilla extract"", ""sugar""]" +"Belgian Spaghetti, Student Style","Any[""olive oil"", ""onion"", ""red bell pepper"", ""white mushroom"", ""carrot"", ""garlic clove"", ""beef"", ""sugar"", ""oregano"", ""thyme"", ""basil"", ""red pepper flake"", ""parsley"", ""plum tomato"", ""red wine"", ""tomato paste"", ""salt pepper"", ""spaghetti"", ""tabasco sauce"", ""gruyere cheese""]" +Stella & Tanqueray Chillin & Sippin....,"Any[""beer""]" +Brussels Waffles,"Any[""sugar"", ""butter"", ""flour"", ""yeast"", ""milk"", ""egg yolk"", ""salt""]" +"Pan Fried Brussels Sprouts With Sriracha, Honey and Lime","Any[""brussels sprout"", ""sriracha sauce"", ""honey"", ""lime juice"", ""salt"", ""olive oil""]" +Stoemp (Belgium),"Any[""russet potato"", ""chicken broth"", ""salt"", ""leek"", ""nutmeg"", ""heavy cream"", ""butter"", ""black pepper""]" +Celery Root and Potato Purée,"Any[""celery root"", ""idaho potato"", ""milk"", ""salt"", ""salt"", ""butter"", ""heavy cream"", ""black pepper"", ""nutmeg""]" +Baked Oysters,"Any[""dozen oyster"", ""butter"", ""shallot"", ""parsley"", ""salt"", ""pepper"", ""breadcrumb""]" +Mushroomed Afternoon,"Any[""mushroom"", ""mushroom"", ""mushroom"", ""mushroom"", ""garlic clove"", ""oil"", ""parsley"", ""salt""]" +Brussels Sprouts in Vinaigrette,"Any[""brussels sprout"", ""dijon mustard"", ""herb"", ""wine vinegar"", ""sugar"", ""olive oil"", ""salt"", ""pepper""]" +Belgian Chocolate Bread Pudding,"Any[""challah egg bread"", ""egg"", ""milk"", ""sugar"", ""vanilla"", ""salt"", ""butter"", ""cocoa powder"", ""vanilla custard powder"", ""baking powder"", ""chocolate""]" +Belgian Waffles (Gluten Free),"Any[""tapioca flour"", ""sorghum flour"", ""millet flour"", ""brown rice flour"", ""xanthan gum"", ""salt"", ""baking powder"", ""brown sugar"", ""egg yolk"", ""olive oil"", ""rice milk"", ""egg white replacer"", ""maple syrup""]" +Buttermilk & Brown Butter Waffles,"Any[""butter"", ""purpose flour"", ""brown sugar"", ""baking powder"", ""kosher salt"", ""egg"", ""buttermilk"", ""vanilla extract"", ""butter"", ""maple syrup"", ""plain yogurt""]" +Aunt Jenny's Belgian Waffles,"Any[""bisquick"", ""butter"", ""egg"", ""club soda""]" +Waterzooi Van Vis - Flemmish Fish Stew,"Any[""olive oil"", ""onion"", ""garlic"", ""saffron"", ""white wine"", ""fish stock"", ""fish"", ""mussel"", ""prawn"", ""carrot"", ""leek"", ""tomato"", ""celeriac"", ""spring onion"", ""potato"", ""parsley"", ""tarragon"", ""chervil"", ""salt black pepper""]" +Petit Dejeuner,"Any[""milk"", ""egg"", ""lemon"", ""french bread"", ""breadcrumb"", ""tart apple"", ""water"", ""lemon juice"", ""sausage"", ""onion"", ""sugar"", ""cinnamon"", ""maple syrup""]" +Belgian Waffles,"Any[""flour"", ""baking soda"", ""baking powder"", ""sugar"", ""salt"", ""egg yolk"", ""buttermilk"", ""cream"", ""butter"", ""egg white""]" +Leeks With Bacon,"Any[""leek"", ""bacon"", ""breadcrumb"", ""egg"", ""butter"", ""poppy seed"", ""pepper"", ""salt""]" +Cold Egg and Leek Hors d'Oeuvre,"Any[""leek"", ""olive oil"", ""lemon"", ""egg"", ""mayonnaise"", ""french mustard"", ""caper""]" +Belgian Endive and Beetroot Salad,"Any[""belgian endive"", ""beet"", ""apple"", ""cream"", ""mustard"", ""salt pepper""]" +Belgian Endive and Apple Salad With Cranberry Vinaigrette,"Any[""olive oil"", ""cranberry juice concentrate"", ""white wine vinegar"", ""belgian endive"", ""apple"", ""cranberry"", ""green onion"", ""walnut""]" +Flemish Mussel Croquettes,"Any[""mussel"", ""white wine"", ""shallot"", ""parsley"", ""celery heart"", ""onion"", ""butter"", ""flour"", ""milk"", ""egg"", ""lemon"", ""salt"", ""pepper"", ""flour"", ""breadcrumb"", ""oil""]" +Amazing Belgian Waffles,"Any[""cake flour"", ""baking powder"", ""baking soda"", ""salt"", ""sugar"", ""milk"", ""buttermilk"", ""vanilla"", ""egg"", ""butter""]" +Sourdough Belgian Waffles,"Any[""sourdough starter"", ""water"", ""milk"", ""salt"", ""sugar"", ""butter"", ""egg"", ""flour"", ""vanilla extract""]" +Pumpkin-Pompoen Confituur,"Any[""pumpkin flesh"", ""orange"", ""lemon"", ""sugar""]" +"Cream of Tomato Soup, Belgian-Style","Any[""butter"", ""onion"", ""carrot"", ""tomato"", ""sugar"", ""cayenne pepper"", ""salt"", ""purpose flour"", ""beef broth"", ""heavy cream"", ""madeira wine"", ""black pepper"", ""butter"", ""tomato"", ""chive""]" +Belgian (Brussels) Waffles,"Any[""active yeast"", ""milk"", ""flour"", ""sugar"", ""salt"", ""butter"", ""milk"", ""vanilla extract"", ""egg""]" +Spicy Mango Ginger Chutney,"Any[""green mango"", ""onion"", ""gingerroot"", ""garlic clove"", ""brown sugar"", ""chilies"", ""salt"", ""vinegar"", ""currant"", ""raisin""]" +Scott's Belgian Waffles,"Any[""plain flour"", ""baking powder"", ""salt"", ""sugar"", ""egg"", ""butter"", ""buttermilk"", ""cold water""]" +Belgian Carrots,"Any[""carrot"", ""butter"", ""sugar"", ""salt pepper"", ""onion"", ""parsley""]" +Ground Beef Filling for Puff Pastry,"Any[""onion"", ""garlic clove"", ""butter"", ""beef"", ""parsley"", ""flour"", ""worcestershire sauce"", ""ketchup""]" +True Belgian Waffles,"Any[""flour"", ""sugar"", ""baking powder"", ""egg"", ""milk"", ""butter"", ""vanilla"", ""fruit""]" +Triple-Fruit Scones,"Any[""purpose flour"", ""wheat germ"", ""natural bran"", ""sugar"", ""baking powder"", ""baking soda"", ""salt"", ""margarine"", ""apricot"", ""cranberry"", ""buttermilk"", ""orange"", ""egg"", ""egg white"", ""cooking spray"", ""sugar""]" +Easy Bisqusteaz Belgian Waffles,"Any[""bisquick baking mix"", ""waffle batter"", ""milk"", ""oil"", ""egg"", ""lemon juice"", ""splenda sugar substitute""]" +Frieten (Belgian Fries),"Any[""potato"", ""oil""]" +Pumpkin Belgian Waffles With Cranberry Compote,"Any[""cake flour"", ""wheat flour"", ""wheat germ"", ""flax seed meal"", ""agave nectar"", ""baking powder"", ""pumpkin pie spice"", ""cinnamon"", ""salt"", ""milk"", ""pumpkin puree"", ""butter"", ""egg"", ""egg white"", ""pecan"", ""cranberry"", ""agave nectar"", ""orange juice"", ""orange zest"", ""cinnamon"", ""nutmeg"", ""vanilla extract""]" +Simple Farmstyle Belgian Endive With Bacon and Blue Cheese,"Any[""belgian endive"", ""nutmeg"", ""white pepper"", ""bacon"", ""balsamic vinegar"", ""olive oil"", ""blue cheese""]" +Belgian Endive With Roquefort Dressing,"Any[""dijon mustard"", ""raspberry vinegar"", ""walnut oil"", ""garlic clove"", ""salt"", ""pepper"", ""belgian endive"", ""walnut"", ""roquefort cheese""]" +Oatmeal Stout and Bacon Belgian Waffles,"Any[""oat flour"", ""baking powder"", ""salt"", ""orange peel"", ""egg"", ""oil"", ""stout beer"", ""vanilla extract"", ""bacon"", ""butter"", ""maple syrup"", ""sugar"", ""crisp bacon""]" +Flemish Beef Stew II,"Any[""beef"", ""water"", ""onion"", ""sugar"", ""garlic"", ""salt"", ""black pepper"", ""sage"", ""dark beer"", ""vinegar""]" +Sweet Apples in the Oven,"Any[""apple"", ""dark brown sugar"", ""butter"", ""cinnamon""]" +"Asparagus, Flemish Style","Any[""white asparagus"", ""butter"", ""hard egg"", ""lemon juice"", ""parsley"", ""salt black pepper"", ""nutmeg""]" +Easy Belgian Waffles,"Any[""bisquick"", ""egg"", ""milk"", ""oil"", ""oil""]" +"Belgian Endive, Blue Cheese and Pear Salad","Any[""pear"", ""lemon juice"", ""belgian endive"", ""blue cheese"", ""red wine vinegar salad dressing"", ""black pepper""]" +Grilled Belgian Endive,"Any[""olive oil"", ""belgian endive"", ""olive oil"", ""oregano"", ""balsamic vinegar"", ""salt black pepper""]" +Fried Fish Balls from Brussels,"Any[""fish"", ""floury potato"", ""garlic"", ""parsley"", ""chervil"", ""chive"", ""butter"", ""egg yolk"", ""plain flour"", ""olive oil"", ""beer"", ""egg white"", ""salt""]" +An Indoor Camembert Picnic Platter for Parties and Fêtes!,"Any[""camembert cheese"", ""garlic sausage"", ""radish"", ""tomato"", ""grape"", ""baguette"", ""butter"", ""chutney"", ""pickle""]" +Baked-Bean and Peanut Sandwiches,"Any[""vegetarian bean"", ""peanut"", ""celery"", ""onion"", ""ketchup"", ""salt"", ""toast""]" +"Belgian Endive With Roquefort, Walnuts and Cranberries","Any[""belgian endive"", ""cranberry"", ""california walnut"", ""roquefort cheese"", ""roquefort cheese"", ""roquefort cheese"", ""roquefort cheese"", ""mayonnaise"", ""buttermilk"", ""lime juice"", ""worcestershire sauce"", ""cayenne pepper"", ""red wine vinegar"", ""black pepper""]" +Belgian Endive Salad,"Any[""tart green apple"", ""belgian endive"", ""almond"", ""oil"", ""lemon juice"", ""garlic"", ""salt""]" +Drunken French Country Chicken Au Gratin,"Any[""chicken"", ""cognac"", ""white wine"", ""paprika"", ""creme fraiche"", ""cheddar cheese"", ""dijon mustard"", ""breadcrumb"", ""vegetable peanut oil"", ""caster sugar"", ""flour"", ""salt pepper""]" +Belgian Brownie Cocktail,"Any[""gin"", ""cognac"", ""chocolate liqueur"", ""heavy cream"", ""ice cube""]" +Ww Belgian Waffles,"Any[""yeast"", ""milk"", ""egg substitute"", ""vegetable oil"", ""sugar"", ""table salt"", ""purpose flour"", ""egg white"", ""strawberry"", ""sugar""]" +Abbey Cheese Croquettes With Pear Syrup (Belgium),"Any[""cheese"", ""egg"", ""flour"", ""breadcrumb"", ""sugar"", ""water"", ""lemon zest"", ""pear""]" +Classic Belgian Waffle,"Any[""purpose flour"", ""sugar"", ""salt"", ""active yeast"", ""butter"", ""milk"", ""vanilla extract"", ""egg""]" +Potato and Leek Pancake,"Any[""yukon gold potato"", ""butter"", ""leek"", ""salt black pepper"", ""olive oil"", ""nutmeg"", ""thyme"", ""purpose flour"", ""flat leaf parsley""]" +Waterzooi Au Poulet (Belgian Chicken Soup),"Any[""chicken quarter"", ""carrot"", ""leek"", ""celery rib"", ""onion"", ""parsley"", ""chicken broth"", ""salt pepper"", ""egg yolk""]" +"Green Beans, Potatoes and Bacon Salad from Liege","Any[""green bean"", ""potato"", ""streaky bacon"", ""butter"", ""parsley"", ""spring onion"", ""red wine vinegar""]" +Red Light Cocktail,"Any[""dutch gin"", ""orange liqueur"", ""lemon juice"", ""raspberry"", ""ice""]" +Tipsy Overnight Belgian Waffles,"Any[""purpose flour"", ""active yeast"", ""water"", ""beer"", ""sugar"", ""egg"", ""salt"", ""butter"", ""canola oil"", ""vanilla extract""]" +Raisin Breakfast Bread (Cramique),"Any[""purpose flour"", ""active yeast"", ""milk"", ""egg yolk"", ""butter"", ""sugar"", ""salt"", ""dark raisin""]" +Moule Frites (Mussels With Chips),"Any[""mussel"", ""spring onion"", ""shallot"", ""garlic clove"", ""red chile"", ""thyme"", ""flat leaf parsley"", ""olive oil"", ""white wine"", ""pernod"", ""creme fraiche"", ""potato"", ""herbes de provence"", ""rosemary"", ""oil""]" +Health Smart Belgian Waffles,"Any[""egg"", ""wheat flour"", ""white flour"", ""oatmeal"", ""baking powder"", ""salt"", ""brown sugar"", ""oil"", ""milk""]" +Ninoofse Vlaai,"Any[""milk"", ""mastellen"", ""peperkoek"", ""macaroon"", ""almond"", ""brown sugar"", ""sugar"", ""egg"", ""salt"", ""cinnamon"", ""vanilla"", ""saffron"", ""rum extract""]" +Peanut Stuffed Belgian Endive,"Any[""hoisin sauce"", ""creamy peanut butter"", ""water"", ""cider vinegar"", ""red pepper flake"", ""coleslaw mix"", ""peanut"", ""belgian endive""]" +Jan's Belgian Waffles,"Any[""egg"", ""vanilla"", ""flour"", ""salt"", ""milk"", ""butter"", ""sugar"", ""cinnamon"", ""lemon juice""]" +Belgian Endive Au Gratin,"Any[""vegetable oil"", ""endive"", ""green pepper"", ""red pepper"", ""purpose flour"", ""milk"", ""gruyere cheese"", ""parmesan cheese"", ""salt pepper"", ""ham"", ""parsley""]" +Brussels Beer Waffles,"Any[""purpose flour"", ""salt"", ""cooking oil"", ""beer"", ""egg"", ""lemon"", ""lemon juice"", ""vanilla extract""]" +Belgian Beef Stew With Beer,"Any[""stewing beef"", ""salt"", ""pepper"", ""oil"", ""onion"", ""garlic clove"", ""flour"", ""beef broth"", ""beer"", ""white wine vinegar"", ""thyme"", ""bay leaf""]" +"Belgian Endive, Orange and Date Salad","Any[""extra virgin olive oil"", ""rice vinegar"", ""orange juice"", ""honey"", ""rose water"", ""orange zest"", ""salt black pepper"", ""radish"", ""valencia orange"", ""belgian endive"", ""celery"", ""date"", ""pistachio"", ""mint leaf""]" +Chicory-Belgian Endive and Orange Salad With Ginger Dressing,"Any[""gingerroot"", ""garlic clove"", ""dijon mustard"", ""orange zest"", ""orange juice"", ""lemon juice"", ""clear honey"", ""peanut oil"", ""orange"", ""chicory lettuce"", ""lettuce"", ""watercress""]" +Moules Marinieres - Belgian Mussels,"Any[""mussel"", ""onion"", ""celery"", ""white wine"", ""pepper"", ""butter"", ""cream"", ""parsley""]" +Belgian Style Carrot Coins,"Any[""butter"", ""carrot"", ""water"", ""sugar"", ""salt"", ""pepper"", ""heavy whipping cream"", ""parsley"", ""nutmeg""]" +Asparagus in the Flemish Manner,"Any[""asparagus"", ""egg"", ""butter"", ""parsley"", ""pepper"", ""salt""]" +"Chic and Cheerful - Savoury French Olive, Cheese and Onion Cake","Any[""olive oil"", ""onion"", ""plain white flour"", ""baking powder"", ""salt"", ""egg"", ""milk"", ""gruyere"", ""green olive""]" +Belgian Molasses Bread,"Any[""butter"", ""molasses"", ""milk"", ""water"", ""active yeast"", ""purpose flour"", ""wheat flour"", ""salt""]" +Raspberry Beer & Champagne Cocktail,"Any[""raspberry beer"", ""champagne""]" +Belgian Buttermilk Almond Waffles With Cinnamon-Peach Compote,"Any[""peach"", ""golden brown sugar"", ""water"", ""cinnamon"", ""nutmeg"", ""flour"", ""almond flour"", ""sugar"", ""baking powder"", ""baking soda"", ""salt"", ""buttermilk"", ""butter"", ""egg"", ""almond extract"", ""vegetable oil"", ""almond"", ""cream"", ""almond extract""]" +Vegan Belgian Waffles,"Any[""purpose flour"", ""wheat flour"", ""sugar"", ""baking powder"", ""salt"", ""banana"", ""soymilk"", ""vegan margarine"", ""vanilla"", ""almond extract"", ""applesauce""]" +Flemish Carbonades,"Any[""butter"", ""beef"", ""salt"", ""pepper"", ""purpose flour"", ""onion"", ""ale"", ""sugar"", ""thyme"", ""bay leaf"", ""clove"", ""bread"", ""mustard""]" +Belgium Frites(French Fries),"Any[""potato"", ""salt"", ""oil""]" +Croque Madame,"Any[""bread"", ""ham"", ""swiss cheese"", ""egg"", ""butter""]" +Oven Baked Eggs,"Any[""butter"", ""egg"", ""cream"", ""chive"", ""ham"", ""parmesan cheese"", ""salt"", ""pepper""]" +Belgian Beef Stew,"Any[""butter"", ""bacon"", ""yellow onion"", ""dark brown sugar"", ""garlic clove"", ""purpose flour"", ""salt"", ""pepper"", ""steak"", ""olive oil"", ""dark beer""]" +Kale Soup With Orzo,"Any[""kale"", ""orzo pasta"", ""carrot"", ""onion"", ""celery"", ""rom tomato"", ""vegetable broth"", ""sugar"", ""thyme"", ""bay leaf"", ""basil"", ""white pepper"", ""ginger"", ""kosher salt"", ""olive oil""]" +Belgian Meatballs,"Any[""breadcrumb"", ""milk"", ""turkey"", ""pork"", ""egg"", ""shallot"", ""parsley"", ""salt"", ""pepper"", ""nutmeg"", ""flour"", ""butter"", ""canola oil"", ""onion"", ""belgian endive"", ""sugar"", ""flour"", ""beer"", ""pork broth"", ""parsley""]" +Belgian Shrimp Croquettes (Croquettes Aux Crevettes Grises),"Any[""shrimp"", ""butter"", ""onion"", ""milk"", ""milk"", ""bay leaf"", ""gelatin"", ""cold water"", ""purpose flour"", ""parmesan cheese"", ""egg yolk"", ""lemon juice"", ""salt black pepper"", ""nutmeg"", ""cayenne pepper"", ""egg white"", ""salt"", ""vegetable oil"", ""purpose flour"", ""breadcrumb"", ""vegetable oil"", ""boston lettuce leaf"", ""lemon wedge"", ""parsley""]" +Belgian Chicons Au Gratin (Endives Au Gratin),"Any[""endive"", ""ham"", ""butter"", ""flour"", ""milk"", ""swiss cheese"", ""salt"", ""pepper"", ""nutmeg""]" +Belgium Butter Crumbed Asparagus Eggs for Two,"Any[""fine french breadcrumb"", ""butter"", ""asparagus"", ""egg"", ""salt"", ""parsley"", ""chive"", ""lemon wedge"", ""black pepper""]" +Belgian Endive Croquettes,"Any[""belgian endive"", ""extra virgin olive oil"", ""onion"", ""salt black pepper"", ""morbier cheese"", ""ricotta cheese"", ""egg"", ""herb"", ""breadcrumb"", ""sandwich bread"", ""cornmeal"", ""parmigiano"", ""flour""]" +Belgian Fries (Pommes Frites),"Any[""vegetable oil"", ""potato"", ""salt""]" +"Bastille Burger - Bearnaise, Blue Cheese and Red Onion Burgers","Any[""beef"", ""blue cheese"", ""hamburger bun french bread"", ""bearnaise sauce"", ""dijon mustard"", ""red onion"", ""lettuce"", ""tomato"", ""cornichon"", ""pepper""]" +"Easy Cheese, Potato and Ham Soufflé","Any[""potato"", ""egg"", ""ham"", ""cheese"", ""butter"", ""salt black pepper"", ""single cream""]" +Classic Belgian Waffles,"Any[""active yeast"", ""water"", ""purpose flour"", ""salt"", ""milk"", ""butter"", ""egg"", ""vanilla extract""]" +Belgian Muffins,"Any[""shortening"", ""sugar"", ""egg"", ""flour"", ""baking powder"", ""nutmeg"", ""milk"", ""butter"", ""cinnamon""]" +Belgian Beef and Beer Stew,"Any[""bacon"", ""chuck roast"", ""onion"", ""cremini mushroom"", ""garlic clove"", ""purpose flour"", ""amber beer"", ""carrot"", ""parsnip"", ""beef broth"", ""dijon mustard"", ""salt"", ""thyme"", ""caraway seed"", ""black pepper"", ""bay leaf""]" +Vanilla Bean Belgian Waffles With Whipped Cream and Strawberries,"Any[""milk"", ""vanilla bean"", ""strawberry"", ""sugar"", ""egg"", ""butter"", ""purpose flour"", ""baking powder"", ""salt"", ""heavy cream"", ""sugar"", ""vanilla extract"", ""sugar""]" +Belgium Pancakes A.k.a. Crepes,"Any[""egg"", ""milk"", ""water"", ""plain flour"", ""salt"", ""butter"", ""vanilla""]" +Belgian Beer Marinade,"Any[""beer"", ""honey mustard"", ""canola oil"", ""salt"", ""pepper"", ""onion"", ""bell pepper"", ""scallion"", ""garlic clove"", ""ginger"", ""pickling spice"", ""paprika"", ""caraway seed""]" +Belgian Safehouse Drunken Applesauce,"Any[""apple"", ""beer"", ""dark brown sugar"", ""cinnamon"", ""ginger"", ""clove""]" +Mussels in White Wine,"Any[""mussel"", ""olive oil"", ""onion"", ""garlic clove"", ""white wine"", ""lemon"", ""milk"", ""parsley""]" +Belgian Waffles Texas Style,"Any[""yeast"", ""milk"", ""egg"", ""vanilla"", ""flour"", ""salt"", ""sugar"", ""butter"", ""strawberry"", ""sugar""]" +Godiva Peppermint Patty,"Any[""cocoa"", ""rumple minze pepper mint liqueur"", ""godiva chocolate liqueur""]" +Mushroom-Flavored Forcemeat Stuffing,"Any[""porcini mushroom"", ""hot water"", ""white bread"", ""milk"", ""turkey liver spot"", ""cognac"", ""port wine"", ""butter"", ""onion"", ""white mushroom"", ""oyster mushroom"", ""shiitake mushroom"", ""veal"", ""pork butt"", ""egg yolk"", ""sage leaf"", ""parsley"", ""thyme"", ""salt"", ""black pepper"", ""nutmeg""]" +Brie and Leek Sandwiches,"Any[""bread"", ""olive oil"", ""garlic"", ""leek"", ""sugar"", ""salt"", ""black pepper"", ""cold water"", ""brie cheese""]" +Gourmet Belgian Hot Chocolate,"Any[""milk"", ""vanilla bean"", ""chocolate""]" +Witte Kool in Roomsaus (Shredded Cabbage in Cream Sauce),"Any[""cabbage"", ""salt"", ""heavy whipping cream"", ""black pepper"", ""nutmeg"", ""butter"", ""red pepper flake"", ""bacon bit""]" +Kerrin's Belgian Tea Cake,"Any[""caster sugar"", ""self raising flour"", ""salt"", ""butter"", ""egg"", ""hot water"", ""walnut"", ""lemon juice zest"", ""water"", ""sugar"", ""custard powder"", ""fruit"", ""custard powder""]" +Belgian Raisin Bread (Rosynenbrood) for ABM,"Any[""active yeast"", ""bread flour"", ""milk"", ""salt"", ""sugar"", ""vegetable oil"", ""egg"", ""egg yolk"", ""water"", ""raisin""]" +Asperge Violette: Violet Asparagus With Hollandaise Sauce,"Any[""asparagus spear"", ""butter"", ""lemon wedge"", ""edible flower"", ""butter"", ""egg yolk"", ""hot water"", ""lemon juice"", ""salt pepper""]" +Low Fat Whole Wheat Crispy Belgian Waffles,"Any[""wheat flour"", ""splenda pack"", ""baking powder"", ""salt"", ""almond milk"", ""egg white"", ""applesauce"", ""vanilla extract"", ""pumpkin pie spice"", ""oatmeal"", ""wheat bran""]" +Liege Salad,"Any[""potato"", ""green bean"", ""salt"", ""butter"", ""bacon"", ""red wine vinegar"", ""parsley"", ""spring onion""]" +Leeks in Cheese Sauce,"Any[""leek"", ""milk"", ""cheddar cheese"", ""flour"", ""butter"", ""bay leaf"", ""garlic powder"", ""salt"", ""mustard powder"", ""nutmeg""]" +Aalster Vlaai,"Any[""milk"", ""candico candy syrup"", ""mastellen"", ""egg"", ""cinnamon"", ""sugar cube"", ""foelie""]" +Real Belgian Stiff Dough Waffles-No Sugar Added,"Any[""flour"", ""baking powder"", ""splenda granular"", ""butter"", ""egg"", ""water"", ""salt""]" +Hutsepot Soep,"Any[""green cabbage"", ""carrot"", ""potato"", ""chicken stock"", ""pork"", ""salt"", ""pepper""]" +Cream of Belgian Endive Soup,"Any[""belgian endive"", ""white onion"", ""garlic clove"", ""butter"", ""potato"", ""chicken broth"", ""milk"", ""salt pepper"", ""chive"", ""dill sprig""]" +Flemish Fishermen's Salad,"Any[""white bean"", ""onion"", ""savory"", ""potato"", ""beet"", ""herring fillet"", ""mayonnaise"", ""shallot"", ""french mustard"", ""parsley"", ""gherkin""]" +Caper Vinaigrette,"Any[""dijon mustard"", ""salt"", ""pepper"", ""tarragon"", ""olive oil"", ""caper""]" +Herb Sausage filling,"Any[""pork"", ""onion"", ""garlic"", ""breadcrumb"", ""egg"", ""parsley"", ""thyme"", ""nutmeg"", ""black pepper"", ""clove""]" +Buttermilk Soup With Apples (Belgium),"Any[""purpose flour"", ""buttermilk"", ""granny smith apple"", ""sugar"", ""salt"", ""dark brown sugar""]" +Herb Garlic Bread - Belgian Style,"Any[""butter"", ""garlic"", ""parsley"", ""thyme"", ""salt black pepper"", ""french bread italian""]" +Brussels Sprouts in Beer (Belgium),"Any[""brussels sprout"", ""dark beer"", ""salt"", ""butter""]" +"Green Beans, Flemish Style","Any[""salt"", ""green bean"", ""butter"", ""shallot"", ""sugar"", ""chicken broth"", ""cornstarch"", ""apple cider vinegar"", ""pepper"", ""nutmeg"", ""parsley""]" +"Pork Chops, Brussels Style","Any[""pork loin chop"", ""salt"", ""pepper"", ""purpose flour"", ""butter"", ""vegetable oil"", ""onion"", ""thyme"", ""beer"", ""cornstarch"", ""water"", ""white wine vinegar"", ""parsley""]" +Gratin of Brussels Sprouts,"Any[""heavy cream"", ""brussels sprout"", ""salt"", ""slab bacon"", ""black pepper"", ""nutmeg"", ""gruyere cheese""]" +The Best Belgian Waffles,"Any[""flour"", ""baking powder"", ""salt"", ""sugar"", ""egg"", ""vegetable oil"", ""milk"", ""vanilla""]" +Belgian Cheese Croquettes,"Any[""milk"", ""egg"", ""cheese"", ""breadcrumb"", ""flour"", ""butter"", ""cumin powder"", ""nutmeg"", ""black pepper""]" +Frieten (Belgian French Fries),"Any[""potato"", ""salt"", ""oil""]" +Belgian Hot Chocolate,"Any[""half"", ""chocolate"", ""milk chocolate"", ""salt"", ""cinnamon""]" +Belgian Meatloaf,"Any[""butter"", ""breadcrumb"", ""milk"", ""butter"", ""onion"", ""white mushroom"", ""garlic clove"", ""beef"", ""egg"", ""parsley"", ""sage"", ""oregano"", ""thyme"", ""salt"", ""pepper"", ""nutmeg"", ""port wine"", ""cognac"", ""rosemary""]" +Authentic Belgian Fries ( French Fries ),"Any[""hard vegetable"", ""floury potato"", ""salt""]" +Moules Frites - French-Belgian Bistro Style Mussels and Chips,"Any[""mussel"", ""onion"", ""shallot"", ""garlic clove"", ""thyme"", ""flat leaf parsley"", ""chervil"", ""olive oil"", ""white wine"", ""pernod"", ""creme fraiche"", ""potato"", ""salt"", ""oil""]" +Aardappel Taart - Belgian Potato Tart,"Any[""butter"", ""leek"", ""potato"", ""ham"", ""shortcrust pastry"", ""heavy cream"", ""nutmeg"", ""salt pepper""]" +Deep-Fried Potato Croquettes,"Any[""potato"", ""salt"", ""butter"", ""egg yolk"", ""purpose flour"", ""purpose flour"", ""white pepper"", ""nutmeg"", ""egg white"", ""fine breadcrumb"", ""vegetable oil""]" +Chervil Leek Soup,"Any[""butter"", ""onion"", ""leek"", ""chervil"", ""chicken bouillon cube"", ""bouquet garni"", ""water"", ""salt pepper""]" +Belgium Waterzooi Belgian (Gentse Waterzooi),"Any[""roasting chicken"", ""salt"", ""white pepper"", ""butter"", ""onion"", ""shallot"", ""leek"", ""celery rib"", ""carrot"", ""parsley root"", ""white wine"", ""chicken broth"", ""egg yolk"", ""heavy cream"", ""parsley leaf"", ""lemon"", ""chicken meat"", ""carrot"", ""celery rib"", ""onion"", ""leek"", ""black peppercorn"", ""bouquet garni"", ""white wine"", ""cold water"", ""salt black pepper""]" +Waterzooi van Vis - Flemish Fish Stew,"Any[""herring fillet"", ""celery leaf"", ""salt"", ""black pepper"", ""egg yolk"", ""whipping cream"", ""parsley""]" +Mussels Hoegaarden,"Any[""mussel"", ""onion"", ""parsley"", ""double cream"", ""wheat beer""]" +Belgian Endive with Egg Salad,"Any[""hard egg"", ""mayonnaise"", ""dijon mustard"", ""celery salt"", ""onion"", ""belgian endive"", ""bay shrimp"", ""paprika"", ""edible flower""]" +Stuffed Belgian Endive,"Any[""butter"", ""pear"", ""goat cheese"", ""cream cheese"", ""walnut half"", ""belgian endive""]" +Belgian Rabbit With Prunes in Wine Sauce,"Any[""rabbit"", ""prune"", ""water"", ""purpose flour"", ""butter"", ""oil"", ""onion"", ""salt"", ""pepper"", ""red wine"", ""orange peel"", ""red wine"", ""wine"", ""orange peel"", ""peppercorn"", ""juniper berry"", ""thyme"", ""clove"", ""bay leaf"", ""parsley"", ""onion""]" +Hutespot (Boiled Dinner),"Any[""pork loin"", ""leek"", ""celery"", ""onion"", ""salt"", ""pepper"", ""potato"", ""carrot"", ""turnip"", ""savoy cabbage"", ""water""]" +Stoofvlees (Belgian Beef Stew),"Any[""stewing beef"", ""beer"", ""peperkoek bread"", ""mustard"", ""brown sugar"", ""chocolate"", ""onion"", ""bay leaf"", ""margarine"", ""salt"", ""pepper""]" +Parsley Peppercorn Ground Beef Steaks,"Any[""beef"", ""salt"", ""garlic clove"", ""parsley"", ""black peppercorn"", ""salt"", ""beef broth"", ""heavy cream"", ""butter"", ""parsley""]" +White Asparagus,"Any[""asparagus"", ""butter"", ""egg"", ""cream"", ""prawn"", ""chive"", ""brioche bread""]" +chips or freedom fries cheats method,"Any[""potato"", ""peanut oil"", ""white pepper"", ""sea salt"", ""malt vinegar""]" +Gratin D'endives Ardennaise,"Any[""belgian endive"", ""sugar"", ""salt"", ""black pepper"", ""milk"", ""purpose flour"", ""butter"", ""nutmeg"", ""bacon"", ""gruyere cheese""]" +Belgian White Asparagus With Shrimp and Scrambled Eggs,"Any[""white asparagus"", ""shrimp"", ""butter"", ""salt"", ""pepper"", ""garlic"", ""egg"", ""parsley""]" +Ahoy There! Moules Marinières - French Sailor's Mussels,"Any[""mussel"", ""garlic clove"", ""onion"", ""white wine"", ""butter"", ""herb"", ""creme fraiche"", ""salt pepper""]" +Petits Pois à La Française - French Style Peas,"Any[""butter"", ""spring onion"", ""iceberg lettuce"", ""caster sugar"", ""vegetable stock"", ""pea"", ""creme fraiche"", ""mint""]" +Garlic and Mustard Roasted Brussel Sprouts,"Any[""brussels sprout"", ""extra virgin olive oil"", ""agave nectar"", ""stone mustard"", ""garlic"", ""lemon""]" +Rabbit and Prune Stew,"Any[""prune"", ""flour"", ""rabbit"", ""butter"", ""oil"", ""bacon"", ""onion"", ""beer"", ""cider vinegar"", ""garlic clove"", ""thyme"", ""bay leaf"", ""clove""]" +Braised Belgian Endive,"Any[""belgian endive"", ""butter"", ""sugar"", ""lemon juice"", ""chicken broth"", ""herb"", ""parsley"", ""pepper""]" +Belgian Roast- (Crock Pot),"Any[""beef rump roast"", ""oil"", ""butter"", ""thyme"", ""salt"", ""onion"", ""garlic clove"", ""brown sugar"", ""parsley"", ""white vinegar"", ""bay leaf"", ""pepper"", ""beer"", ""cornstarch"", ""water""]" +Limbourgian Beer Stew,"Any[""beef steak"", ""onion"", ""peperkoek"", ""bread apple syrup"", ""butter"", ""flour"", ""salt pepper"", ""vinegar"", ""dark beer"", ""clove"", ""bay leaf"", ""peppercorn"", ""salt pepper""]" +Calf Liver and Oyster Mushroom Tart,"Any[""pastry"", ""butter"", ""calf liver"", ""oyster mushroom"", ""balsamic vinegar"", ""dijon mustard"", ""salt"", ""black pepper"", ""cream"", ""cornstarch"", ""egg""]" +Asparagus with Fish and Eau de Vie,"Any[""asparagus"", ""fish steak"", ""pepper"", ""salt"", ""mustard"", ""butter"", ""breadcrumb"", ""chive"", ""nutmeg"", ""fish stock"", ""eau de vie"", ""cayenne pepper"", ""saffron"", ""ham""]" +Flemish Beef Stew Cooked in Beer,"Any[""stew meat"", ""salt"", ""black pepper"", ""purpose flour"", ""butter"", ""onion"", ""beer"", ""thyme"", ""bay leaf"", ""red currant jelly"", ""cider""]" +Christmas Turkey Stuffed With Mushroom-Flavored Forcemeat,"Any[""turkey"", ""butter"", ""butter"", ""salt"", ""pepper"", ""paprika"", ""carrot"", ""celery rib"", ""onion"", ""water"", ""cognac"", ""port wine"", ""purpose flour"", ""butter""]" +Café Belgique,"Any[""egg white"", ""heavy cream"", ""vanilla extract"", ""coffee""]" +Flammekeuch,"Any[""bread dough"", ""olive oil"", ""bacon"", ""onion"", ""cream"", ""salt black pepper"", ""gruyere"", ""chive""]" +Belgian Waffle Strawberry Sundaes,"Any[""strawberry"", ""sugar"", ""belgian waffle"", ""strawberry ice cream""]" +"Belgian Endive, Mache, Apples With Sherry Vinaigrette","Any[""walnut half"", ""beet"", ""belgian endive"", ""watercress"", ""apple"", ""sea salt"", ""black pepper"", ""sherry wine vinegar"", ""extra virgin olive oil""]" +Baked Belgian Endive,"Any[""belgian endive"", ""butter"", ""sugar"", ""salt"", ""black pepper"", ""bacon"", ""white flour"", ""half"", ""parmesan cheese"", ""fine breadcrumb""]" +Roast Pork With Cheese and Cured Ham,"Any[""pork loin roast"", ""butter"", ""vegetable oil"", ""salt black pepper"", ""carrot"", ""onion"", ""thyme"", ""bay leaf"", ""water"", ""gruyere cheese"", ""ham"", ""port wine"", ""beef broth"", ""parsley""]" +Carbonade Flamande - Flemish Beef and Beer Stew-Casserole,"Any[""beef"", ""bacon"", ""onion"", ""garlic clove"", ""bouquet garni"", ""belgian brown ale"", ""beef stock"", ""red wine vinegar"", ""butter"", ""olive oil"", ""french bread"", ""brown sugar"", ""dijon mustard"", ""salt"", ""pepper""]" +Moules Et Frites (Mussels and Fries),"Any[""mussel"", ""butter"", ""onion"", ""white wine"", ""parsley"", ""mustard"", ""mayonnaise""]" +"Auberge Roast Chicken Rillettes With Armagnac, Thyme and Garlic","Any[""chicken"", ""thyme leave"", ""garlic clove"", ""shallot"", ""quatre epices rabelais seasoning"", ""mace"", ""black peppercorn"", ""white wine"", ""salt"", ""armagnac"", ""duck""]" +Fillet of Cod Flemish Style,"Any[""butter"", ""onion"", ""salt black pepper"", ""parsley"", ""chive"", ""cod fish fillet"", ""lemon"", ""bay leaf"", ""thyme"", ""white wine""]" +Classic Entrecote Bordelaise - Steak in Red Wine With Shallots,"Any[""entrecote steak"", ""butter"", ""shallot"", ""red wine"", ""demi glace"", ""parsley"", ""salt"", ""black pepper""]" +Beer-Infused Belgian Waffles,"Any[""flour"", ""brown sugar"", ""baking powder"", ""salt"", ""beer"", ""milk"", ""butter"", ""egg"", ""vanilla"", ""honey"", ""sugar""]" +Carbonnade of Beef,"Any[""beef steak"", ""bacon"", ""butter"", ""onion"", ""garlic clove"", ""flour"", ""black pepper"", ""beer"", ""beef broth"", ""kitchen bouquet"", ""thyme leaf"", ""brown sugar"", ""white vinegar"", ""bay leaf""]" +"Belgian Endive, Apple and Almond Salad","Any[""tart green apple"", ""belgian endive"", ""almond"", ""salad oil"", ""lemon juice"", ""garlic"", ""salt pepper""]" +Arugula Walnut Pate With Belgian Endive,"Any[""arugula leaf"", ""hard egg"", ""plain yogurt"", ""mayonnaise"", ""walnut"", ""dijon mustard"", ""garlic clove"", ""lemon pepper"", ""lemon juice"", ""scallion"", ""belgian endive""]" +Belgian Waffles,"Any[""flour"", ""milk"", ""milk"", ""yeast"", ""egg"", ""egg yolk"", ""salt"", ""vanilla extract"", ""butter"", ""sugar"", ""milk powder""]" +Honey Glazed Corned Beef,"Any[""beef brisket"", ""water"", ""pickling spice"", ""white onion"", ""carrot"", ""celery"", ""garlic clove"", ""honey"", ""brown sugar"", ""dijon mustard"", ""ginger""]" +Sacré Boeuf Sirloin Steak Topped With Mustard Herb Butter,"Any[""sirloin steak"", ""butter"", ""parsley"", ""chervil"", ""tarragon"", ""dijon mustard"", ""cayenne pepper""]" +Belgian Pork Chops,"Any[""pork chop"", ""salt pepper"", ""plain flour"", ""oil"", ""onion"", ""beer"", ""chicken stock"", ""brussels sprout"", ""butter"", ""cornflour""]" +Belgian Walnut Rice Loaf,"Any[""walnut"", ""rice"", ""parsley"", ""egg"", ""oil"", ""celery"", ""onion"", ""green pepper"", ""tomato"", ""bay leaf"", ""garlic clove"", ""thyme"", ""salt pepper"", ""cheese""]" +Flemish Carrots,"Any[""butter"", ""carrot"", ""water"", ""brown sugar"", ""salt"", ""mace"", ""cream"", ""lemon juice"", ""egg yolk""]" +Beef in Beer - 2-Qt Pressure Cooker,"Any[""beef steak"", ""dijon mustard"", ""salt black pepper"", ""paprika"", ""olive oil"", ""dark beer"", ""flour"", ""tomato paste"", ""beef broth"", ""onion"", ""carrot"", ""leek""]" +Belgian Hutsepot,"Any[""beef roast"", ""pork shoulder"", ""water"", ""bay leaf"", ""peppercorn"", ""salt"", ""new potato"", ""savoy cabbage"", ""turnip"", ""pea"", ""crouton"", ""chive"", ""dijon mustard"", ""horseradish""]" +Creamy Braised Chicory-Belgian Endive and Celery With Peas,"Any[""chicory lettuce"", ""celery"", ""pancetta"", ""chicken stock"", ""double cream"", ""pea"", ""salt"", ""pepper""]" +"Carbonades Flamandes (Belgian Recipe for Beef, Onions in Sauce)","Any[""beef"", ""butter"", ""onion"", ""flour"", ""brown sugar"", ""wine vinegar"", ""ale"", ""salt black pepper"", ""bouquet garni""]" +Chateaubriand 'My Way',"Any[""beef tenderloin"", ""salt"", ""pepper"", ""peanut oil"", ""heavy whipping cream"", ""green peppercorn"", ""lemon juice"", ""salt"", ""white pepper"", ""honey"", ""cognac""]" +Belgian Endive Salad With Walnut Vinaigrette,"Any[""belgian endive"", ""walnut"", ""italian parsley"", ""salt pepper"", ""blue cheese"", ""walnut oil"", ""red wine vinegar"", ""dijon mustard"", ""salt pepper""]" +Packs a Wallop Beef Stew!,"Any[""paprika"", ""salt"", ""garlic powder"", ""mustard"", ""onion powder"", ""oregano leaf"", ""caraway seed"", ""cayenne"", ""cumin"", ""black pepper"", ""white pepper"", ""butter"", ""beef chuck roast"", ""potato"", ""carrot"", ""green bell pepper"", ""beef stock""]" +Beer- and Onion-Braised Chicken Carbonnade,"Any[""butter"", ""chicken thigh"", ""allspice"", ""onion"", ""dark brown sugar"", ""bay leaf"", ""dijon mustard"", ""dark beer"", ""beef broth"", ""red wine vinegar"", ""egg noodle""]" +Escargot Vol-Au-Vent. Garlic Butter Snails in Mini Vol-Au-Vents,"Any[""garlic clove"", ""sea salt"", ""butter"", ""parsley"", ""chive"", ""shallot"", ""black pepper"", ""lemon juice"", ""pernod"", ""snail"", ""puff pastry"", ""puff pastry""]" +Gentse Waterzooi,"Any[""zucchini"", ""carrot"", ""mushroom"", ""celery"", ""leek"", ""onion"", ""potato"", ""chicken breast"", ""vegetable stock"", ""egg yolk"", ""cream"", ""parsley"", ""pepper"", ""salt"", ""margarine"", ""flour""]" +Smoked Salmon and Philadephia Sandwich,"Any[""salmon"", ""cream cheese"", ""green apple"", ""tomato"", ""brown bread""]" +Belgian Endive Salad,"Any[""belgian endive"", ""tomato"", ""onion"", ""jalapeno pepper"", ""cilantro"", ""lemon juice""]" +Belgian Hare a La Maryland,"Any[""rabbit"", ""salt pepper"", ""flour"", ""egg"", ""cracker crumb"", ""butter"", ""onion"", ""bay leaf""]" +Deer Stew With Mustard and Cashew Nuts,"Any[""deer"", ""baby onion"", ""carrot"", ""celery rib"", ""green cabbage"", ""red wine"", ""vegetable bouillon"", ""olive oil"", ""mustard"", ""cashew"", ""parsley""]" +Waterzooi of Chicken,"Any[""chicken"", ""salt pepper"", ""bay leaf"", ""parsley"", ""thyme"", ""butter"", ""onion"", ""chicken broth"", ""carrot"", ""leek"", ""celery rib"", ""baking potato"", ""heavy cream"", ""egg yolk"", ""parsley""]" +Traditional Style Swiss Steak,"Any[""steak"", ""yellow onion"", ""green pepper"", ""garlic powder"", ""tomato"", ""tomato sauce"", ""adolph meat tenderizer"", ""black pepper"", ""flour"", ""crisco"", ""butter"", ""salt"", ""water""]" +Chicken Waterzooi Stew,"Any[""celery"", ""carrot"", ""chicken breast half"", ""vegetable oil"", ""butter"", ""shallot"", ""mushroom"", ""leek"", ""garlic clove"", ""thyme"", ""peppercorn"", ""half"", ""salt pepper""]" +Belgian Meatballs Braised in Beer,"Any[""white breadcrumb"", ""milk"", ""beef"", ""pork"", ""egg"", ""shallot"", ""parsley"", ""salt pepper"", ""nutmeg"", ""flour"", ""butter"", ""vegetable oil"", ""onion"", ""belgian endive"", ""sugar"", ""salt pepper"", ""flour"", ""pilsner beer"", ""beef broth"", ""parsley""]" +Flemish-Style Pork Chops,"Any[""pork chop"", ""butter"", ""tart apple"", ""lemon juice"", ""juniper berry"", ""salt pepper"", ""rosemary sprig"", ""parsley"", ""butter""]" +Lobster Ganda,"Any[""lobster"", ""ham"", ""mushroom cap"", ""shallot"", ""brandy"", ""white wine"", ""port wine"", ""salt"", ""pepper"", ""egg yolk"", ""single cream""]" +Veggies Dream Cucumber Sandwich,"Any[""wheat bread rye"", ""cream cheese"", ""cucumber"", ""alfalfa sprout"", ""olive oil"", ""red wine vinegar"", ""tomato"", ""lettuce"", ""pepperoncini pepper"", ""avocado""]" +Scallops and Endive With Pasta,"Any[""shallot"", ""garlic"", ""olive oil"", ""cherry tomato"", ""belgian endive"", ""thyme"", ""oregano"", ""basil"", ""salt pepper"", ""sherry wine"", ""butter"", ""bay scallop"", ""basil sprig"", ""pasta""]" +Braised Belgian Endive and Chicken Cutlets - Clean Eating,"Any[""olive oil"", ""chicken breast"", ""pepper"", ""thyme"", ""belgian endive"", ""honey"", ""lemon juice"", ""chicken broth"", ""parsley""]" +Carbonnade (Beef and Onions Stewed in Beer),"Any[""onion"", ""oil corn"", ""beef"", ""salt black pepper"", ""garlic"", ""bay leaf"", ""thyme leaf"", ""oregano leaf"", ""beer"", ""dijon mustard"", ""parsley leaf""]" +Belgian Mussels,"Any[""mussel"", ""leek"", ""onion"", ""celery rib"", ""pepper"", ""salt"", ""butter""]" +Belgian Beef Skewers With Beer BBQ Sauce,"Any[""beef roast"", ""garlic"", ""onion"", ""dijon mustard"", ""ale"", ""ketchup"", ""brown sugar"", ""pepper sauce"", ""salt pepper""]" +Mussels With Curry Cream Sauce,"Any[""mussel"", ""white wine"", ""butter"", ""onion"", ""carrot"", ""sultana"", ""curry powder"", ""tomato puree"", ""apple"", ""double cream""]" +Alaskan Pollack with Broccoli in a Cream Sauce,"Any[""broccoli floret"", ""shrimp"", ""shallot"", ""parmesan cheese"", ""cream"", ""milk"", ""salt"", ""sugar"", ""dill""]" +Elderberry Soup,"Any[""elderberry"", ""water"", ""cinnamon"", ""lemon"", ""sugar"", ""salt"", ""pear"", ""cornstarch"", ""white wine"", ""cream""]" +Gigot a La Cuillère - French Slow Cooked Spoon Lamb,"Any[""leg lamb"", ""onion"", ""garlic clove"", ""carrot"", ""white wine"", ""stock"", ""armagnac"", ""salt pepper"", ""thyme""]" +Stoofvlees,"Any[""stewing beef"", ""pork stew meat"", ""onion"", ""dark beer"", ""wheat bread grain"", ""sugar"", ""butter"", ""hot mustard""]" +Omelet With Belgian Endives and Shrimps,"Any[""egg"", ""butter"", ""belgian endive"", ""shrimp"", ""chive"", ""pepper"", ""salt""]" +Salade Liégeoise,"Any[""french haricot vert green bean"", ""potato"", ""streaky bacon"", ""butter"", ""parsley"", ""scallion"", ""red wine vinegar""]" +Belgian Beef Stew,"Any[""bacon"", ""butter"", ""onion"", ""garlic"", ""beef chuck roast"", ""purpose flour"", ""salt"", ""black pepper"", ""beer"", ""lemon juice""]" +Traditional French Pistolets - Little Onion and Rye Bread Rolls,"Any[""water"", ""yeast"", ""olive oil"", ""salt"", ""sugar"", ""white bread flour"", ""rye flour"", ""onion"", ""water"", ""flour""]" +Belgian Meatballs,"Any[""beef"", ""onion"", ""green onion"", ""salt"", ""pepper"", ""garlic powder"", ""cornmeal"", ""chili powder"", ""mustard"", ""milk"", ""egg"", ""flour"", ""tomato""]" +"Pear, Roquefort and Rosemary French Galettes - Tartelettes","Any[""egg white"", ""roquefort cheese"", ""creme fraiche"", ""shortcrust pastry"", ""rosemary leaf"", ""butter"", ""pear"", ""cumin seed"", ""rosemary"", ""egg yolk milk"", ""salt"", ""pepper"", ""danish blue cheese""]" +Chicken with Belgian Endive (kip met witloof),"Any[""chicken"", ""belgian endive"", ""butter"", ""heavy cream"", ""lemon"", ""flour"", ""salt pepper""]" +Belgian Stew,"Any[""beef stew meat"", ""oil"", ""onion"", ""carrot"", ""celery"", ""garlic"", ""beer"", ""marjoram"", ""brown sugar"", ""celery seed"", ""bay leaf"", ""salt pepper""]" +Grilled Ham & Chimay Cheese Sammies W-Caramelized Endive,"Any[""canola oil"", ""belgian endive"", ""sugar"", ""beer"", ""orange juice"", ""bread"", ""butter"", ""ham"", ""cheese"", ""pickle spear"", ""brown mustard""]" +Flemish Carbonnade,"Any[""beef steak"", ""bay leaf"", ""onion"", ""stoofvlees seasoning"", ""dark beer"", ""mustard"", ""brown sugar"", ""butter"", ""olive oil"", ""black pepper""]" +Stewed Veal in a Cream and Lemon Sauce,"Any[""veal"", ""anchovy"", ""thyme"", ""chicken broth"", ""salt pepper"", ""butter"", ""plain flour"", ""heavy cream"", ""nutmeg"", ""lemon"", ""lemon""]" +Flemish Beef Stew,"Any[""salt pork"", ""bay leaf"", ""beef chuck"", ""thyme"", ""onion"", ""dijon mustard"", ""flour"", ""french bread"", ""vinegar"", ""stout beer"", ""parsley sprig"", ""brown sugar""]" +Stuffed chicken for 6,"Any[""chicken"", ""turkey"", ""potato"", ""onion"", ""bread"", ""white mushroom"", ""thyme"", ""salt pepper"", ""olive oil""]" +Maïté's Leftover Chicken Salad,"Any[""chicken"", ""peach"", ""egg"", ""mayonnaise""]" +Rich Man's Hamburgers,"Any[""shallot"", ""chive"", ""dijon mustard"", ""tabasco sauce"", ""egg yolk"", ""worcestershire sauce"", ""cognac"", ""sea salt"", ""caper"", ""black peppercorn"", ""kaiser bun"", ""butter"", ""ketchup"", ""cider vinegar"", ""dark brown sugar"", ""garlic clove"", ""worcestershire sauce"", ""tabasco sauce""]" +Sauteed Shrimp and Arborio Risotto Stella Artois Asparagus Tips,"Any[""risotto rice"", ""shallot"", ""red bell pepper"", ""green asparagus"", ""vegetable stock"", ""olive oil"", ""wine"", ""beer"", ""olive oil"", ""parmesan cheese"", ""salt"", ""pepper""]" +Stoemp Aux Poireaux-Stoemp Met Prei - Belgian Mashed Potatoes,"Any[""potato"", ""butter"", ""cream"", ""onion"", ""garlic clove"", ""leek"", ""stock"", ""salt pepper"", ""nutmeg""]" +Quatre Épices - French Four Spice Mix from the Auberge,"Any[""white peppercorn"", ""nutmeg"", ""clove"", ""cinnamon"", ""ginger"", ""allspice berry""]" +Smoked Salmon Stuffed Belgian Endive Boats,"Any[""salmon"", ""mayonnaise"", ""parmesan cheese"", ""green onion"", ""lemon juice"", ""dill"", ""olive oil"", ""salt pepper"", ""belgian endive""]" +Tofu Beer Stew,"Any[""tofu"", ""onion"", ""beer"", ""vegetable broth"", ""dijon mustard"", ""brown sugar"", ""poppy seed"", ""herb"", ""vegan worcestershire sauce"", ""salt pepper"", ""cornstarch""]" +Quorn Stoverij (Belgian Beer Sauce Stew),"Any[""quorn"", ""carrot"", ""onion"", ""olive oil"", ""dark beer"", ""rosemary"", ""thyme"", ""parsley"", ""salt"", ""vegetable stock"", ""cremini mushroom"", ""jam""]" +Whitloaf,"Any[""belgian endive"", ""ham"", ""swiss cheese"", ""olive oil"", ""milk"", ""milk"", ""chicken bouillon cube"", ""swiss cheese"", ""cornstarch""]" +Cream of Endive Soup,"Any[""belgian endive"", ""white onion"", ""garlic"", ""butter"", ""potato"", ""chicken broth"", ""milk"", ""salt pepper"", ""chive"", ""dill sprig""]" +Belgium Chicken Waterzooi,"Any[""chicken"", ""carrot"", ""celery rib"", ""shallot"", ""parsley"", ""thyme"", ""bay leaf"", ""salt black pepper"", ""leek"", ""mushroom"", ""egg yolk"", ""cream"", ""lemon"", ""butter"", ""nutmeg""]" +Poulet à La Bière - Chicken in Beer,"Any[""plain flour"", ""salt black pepper"", ""chicken quarter"", ""onion"", ""carrot"", ""celery rib"", ""butter"", ""olive oil"", ""ale"", ""garlic clove"", ""bouquet garni"", ""heavy cream""]" +Paupiettes De Porc - French Stuffed Pork Fillet Parcels,"Any[""pork escalopes"", ""salt"", ""pepper"", ""pork sausage"", ""onion"", ""herb"", ""olive oil"", ""shallot"", ""plain flour"", ""sun tomato paste"", ""white wine"", ""mushroom"", ""orange zest"", ""bay leaf"", ""parsley"", ""thyme"", ""sage leaf"", ""kitchen string""]" +Belgian Beef Carbonnade,"Any[""flour"", ""salt"", ""pepper"", ""paprika"", ""beef cube"", ""butter"", ""onion"", ""garlic clove"", ""bay leaf"", ""thyme"", ""celery leaf"", ""parsley"", ""brown sugar"", ""beer"", ""vinegar""]" +Baked Apples Filled With Berries,"Any[""cranberry"", ""sugar"", ""apple"", ""butter"", ""water""]" +Belgian Endive With Lovage Vinaigrette,"Any[""sherry wine vinegar"", ""shallot"", ""dijon mustard"", ""water"", ""extra virgin olive oil"", ""lovage"", ""belgian endive"", ""green"", ""carrot""]" +"Salad Frisee with Endive, Canadian Bacon, & Croutons","Any[""belgian endive"", ""chicory lettuce"", ""walnut oil"", ""red wine vinegar"", ""salt pepper"", ""canadian bacon"", ""french bread""]" +Belgian Leek Tart & Aged Goat Cheese (Flamiche Aux Poireaux),"Any[""ice water"", ""apple cider vinegar"", ""purpose flour"", ""salt"", ""butter"", ""butter"", ""milk"", ""heavy whipping cream"", ""egg"", ""egg yolk"", ""salt"", ""goat cheese"", ""leek"", ""butter"", ""leek"", ""water"", ""salt""]" +Flemish Beef & Beer Stew,"Any[""stewing beef"", ""onion"", ""flour"", ""sunflower oil"", ""garlic clove"", ""salt"", ""brown sugar"", ""wine vinegar"", ""parsley"", ""thyme"", ""pepper"", ""beef broth"", ""beer""]" +Stoemp With Caramelized Shallots,"Any[""floury potato"", ""milk"", ""salt"", ""butter"", ""double cream"", ""salt pepper"", ""nutmeg"", ""shallot"", ""parsley""]" +Flemish Beef Sirloin in Beer Sauce With Savory Vegetables,"Any[""sirloin tip roast"", ""salt pepper"", ""vegetable oil"", ""onion"", ""garlic clove"", ""carrot"", ""clove"", ""orange zest"", ""brandy"", ""dark beer"", ""peppercorn"", ""bay leaf"", ""thyme"", ""porcini mushroom"", ""red wine vinegar"", ""cornstarch"", ""brown sugar"", ""fennel"", ""new potato""]" diff --git a/notebook/fridgeNotebook.jl b/notebook/fridgeNotebook.jl index f33c6b44..1cb5c12d 100644 --- a/notebook/fridgeNotebook.jl +++ b/notebook/fridgeNotebook.jl @@ -422,9 +422,15 @@ function greedyFindCombo(fridgeList, recipeDict, numRecipes) ingredientsArray = ingredientsArray[bestOrder] namesArray = namesArray[bestOrder] + # break if all recipes that are left, don't use anything from the fridge + if all(ingredientsArray[1][1:end-1] .== 0) + break + end + tempRecipeName = namesArray[1] bestCombo[tempRecipeName] = ingredientsArray[1] + # break if all ingredients are used if all(isone.(sum(values(bestCombo)))) break end @@ -432,6 +438,7 @@ function greedyFindCombo(fridgeList, recipeDict, numRecipes) namesArray = [name for (name, ingredientList) in zip(namesArray, ingredientsArray) if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] ingredientsArray = [ingredientList for ingredientList in ingredientsArray if sum(ingredientList[1:end-1] .& bestCombo[tempRecipeName][1:end-1] ) == 0] + # break if there are no recipes left if isempty(namesArray) break end From a6172b7310d67fbaaa62d5bca9c260354c1823d9 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 21:23:42 +0100 Subject: [PATCH 54/57] removed some small bugs and expanded tests --- BelgianRecipeDB.csv | 327 -------------------------------------------- src/Fridge.jl | 36 +++-- test/fridgeTest.jl | 6 + test/testDB.csv | 16 +++ 4 files changed, 50 insertions(+), 335 deletions(-) delete mode 100644 BelgianRecipeDB.csv create mode 100644 test/testDB.csv diff --git a/BelgianRecipeDB.csv b/BelgianRecipeDB.csv deleted file mode 100644 index 0fa26623..00000000 --- a/BelgianRecipeDB.csv +++ /dev/null @@ -1,327 +0,0 @@ -first,second -Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" -Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" -Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" -Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" -Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" -Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" -Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" -Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" -Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" -Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" -Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" -Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" -Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" -Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" -Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]" -Gaufres (Authentic Belgian Waffles),"Any[""egg"", ""sugar"", ""sugar"", ""purpose flour"", ""purpose flour"", ""butter"", ""butter""]" -Chocolate Raspberry Truffles With Fresh Raspberries,"Any[""raspberry"", ""chocolate"", ""heavy cream"", ""salt"", ""cocoa powder""]" -Decadent Pumpkin Pie Belgian Waffles,"Any[""butter"", ""pumpkin puree"", ""dark brown sugar"", ""sugar"", ""cinnamon"", ""ginger"", ""clove"", ""nutmeg"", ""salt"", ""purpose flour"", ""double acting baking powder"", ""baking soda"", ""milk"", ""cream"", ""egg"", ""dark rum"", ""vanilla extract"", ""vanilla ice cream"", ""maple syrup""]" -Classic French Tarte Au Citron - Fresh Lemon Tart,"Any[""shortcrust pastry"", ""lemon juice"", ""lemon zest"", ""creme fraiche"", ""caster sugar"", ""egg"", ""icing sugar""]" -Chocolate Cupcakes,"Any[""milk chocolate"", ""butter"", ""flour"", ""baking powder"", ""sugar"", ""egg"", ""cocoa powder"", ""walnut""]" -Dame Blanche,"Any[""chocolate"", ""cream"", ""vanilla ice cream"", ""cream""]" -Godiva Chocolate Fondue,"Any[""godiva dark chocolate bar"", ""heavy cream"", ""vanilla""]" -Dark Chocolate Pudding,"Any[""sugar"", ""cornstarch"", ""salt"", ""milk"", ""egg yolk"", ""dark chocolate candy bar"", ""vanilla extract"", ""cream"", ""chocolate""]" -Belgian Lukken waffle cookies,"Any[""egg"", ""butter"", ""flour"", ""brown sugar"", ""vanilla"", ""salt"", ""whiskey""]" -Belgian Chocolate Lace Wafers,"Any[""flour"", ""almond"", ""dark corn syrup"", ""brown sugar"", ""butter"", ""chocolate""]" -Gianduia (Gianduja) (Nutella) (Chocolate Hazelnut Spread),"Any[""dark chocolate"", ""icing sugar"", ""peanut oil nut"", ""hazelnut""]" -Tarte Au Sucre Brun,"Any[""pie crust"", ""egg"", ""cream"", ""brown sugar"", ""butter"", ""sugar""]" -Liege Waffle Recipe - Liège Gaufre Recette,"Any[""active yeast"", ""milk"", ""water"", ""water"", ""bread flour"", ""egg"", ""brown sugar"", ""brown sugar"", ""salt"", ""baking powder"", ""butter"", ""honey"", ""vanilla"", ""sugar""]" -Poached Pears in Kriek,"Any[""beer"", ""sugar"", ""cinnamon"", ""lemon"", ""pear""]" -Sweet and Savory Rosemary Belgian Waffles,"Any[""egg"", ""buttermilk"", ""milk"", ""cake flour"", ""baking powder"", ""kosher salt"", ""canola oil"", ""rosemary"", ""coconut sugar""]" -Liege Waffles (Belgian Pearl Sugar Waffles),"Any[""yeast"", ""water"", ""sugar"", ""salt"", ""flour"", ""egg"", ""butter"", ""sugar""]" -Belgian Rice Tart (Tarte Au Riz),"Any[""yeast"", ""flour"", ""milk"", ""sugar"", ""canola oil"", ""egg"", ""salt"", ""butter"", ""grain rice"", ""milk"", ""sugar"", ""egg"", ""vanilla extract""]" -Speculoos (A Flemish Spice Cookie),"Any[""purpose flour"", ""baking powder"", ""salt"", ""cinnamon"", ""ginger"", ""clove"", ""dark brown sugar"", ""butter"", ""egg"", ""flour""]" -Heavenly Chocolate Mousse,"Any[""egg"", ""sugar"", ""dark chocolate"", ""egg white"", ""cream""]" -Pom Koek (Belgian Coffee Cake),"Any[""flour"", ""sugar"", ""baking soda"", ""cinnamon"", ""clove"", ""salt"", ""honey"", ""coffee"", ""egg"", ""corn oil""]" -Godiva Strawberry White Chocolate Mint Frappé,"Any[""strawberry"", ""sugar"", ""lemon juice"", ""heavy cream"", ""milk"", ""white chocolate"", ""vanilla extract"", ""strawberry"", ""lemon juice"", ""confectioner ' sugar"", ""heavy cream"", ""mint leaf"", ""dark chocolate""]" -Belgian Plum Flan,"Any[""shortcrust pastry"", ""water"", ""caster sugar"", ""plum"", ""sugar"", ""egg yolk"", ""flour"", ""milk"", ""butter"", ""vanilla extract"", ""apricot jam"", ""lemon juice""]" -French Tart's Classic Madeleines: Madelines: Little Fluted Cakes,"Any[""egg"", ""vanilla extract"", ""lemon zest"", ""icing sugar"", ""plain flour"", ""baking powder"", ""butter"", ""icing sugar""]" -Glazed Rice Tart (Tarte De Riz),"Any[""almond"", ""grain rice"", ""milk"", ""sugar"", ""salt"", ""egg"", ""vanilla"", ""almond"", ""apricot jam"", ""kirsch liqueur"", ""whipping cream"", ""sugar""]" -Riz Au Lait,"Any[""pudding rice"", ""milk"", ""sugar"", ""vanilla extract"", ""butter""]" -Belgian Tuile Cookies,"Any[""butter"", ""sugar"", ""egg white"", ""vanilla"", ""salt"", ""purpose flour"", ""chocolate""]" -A Symphony of French Chocolate Truffles,"Any[""dark chocolate"", ""cream"", ""butter"", ""rum"", ""cocoa powder"", ""gingerroot"", ""almond"", ""dark chocolate"", ""peanut oil"", ""cocoa"", ""paper truffle"", ""parchment paper"", ""cocoa powder""]" -Jb's Classic Belgian Waffles (And Variations),"Any[""purpose flour"", ""sugar"", ""baking powder"", ""salt"", ""milk"", ""vegetable oil"", ""egg"", ""blueberry"", ""fruit syrup"", ""fruit sauce berry"", ""sugar"", ""yogurt""]" -Jam and Bread Pudding,"Any[""challah"", ""strawberry jam"", ""strawberry jam"", ""egg"", ""sugar"", ""half"", ""half"", ""vanilla"", ""butter"", ""sugar""]" -Speculoosbavarois,"Any[""milk"", ""cream"", ""vanilla sugar"", ""egg"", ""sugar"", ""sugar"", ""gelatin""]" -Our Favourite Belgian Waffles,"Any[""milk"", ""egg"", ""butter"", ""sugar"", ""flour"", ""salt""]" -"Oooh La La! French Savoury Ham, Cheese and Olive Cake","Any[""egg"", ""plain white flour"", ""baking powder"", ""olive oil"", ""butter"", ""white wine"", ""port wine"", ""green olive"", ""ham"", ""gruyere"", ""salt"", ""pepper""]" -Thermomix Belgian Lemon Teacake,"Any[""butter"", ""sugar"", ""self raising flour"", ""egg"", ""lemon juice"", ""sugar"", ""egg"", ""butter""]" -Flemish Sugar Tart,"Any[""milk"", ""active yeast"", ""purpose flour"", ""sugar"", ""cinnamon"", ""salt"", ""egg"", ""butter"", ""heavy cream"", ""egg"", ""vanilla extract"", ""dark brown sugar"", ""butter"", ""confectioner ' sugar"", ""currant"", ""cream""]" -Tarte Au Flan,"Any[""pie crust"", ""milk"", ""vanilla pod"", ""egg"", ""sugar"", ""cornstarch"", ""butter"", ""decorator sugar""]" -Mocha Cheesecake,"Any[""chocolate wafer"", ""sugar"", ""butter"", ""baking chocolate"", ""cream cheese"", ""egg"", ""sugar"", ""coffee"", ""salt"", ""baking chocolate"", ""sugar"", ""cream""]" -Quick and Easy French Cognac and Creme Fraiche Ice Cream,"Any[""creme fraiche"", ""icing sugar"", ""cognac""]" -Buttery Cupcakes,"Any[""flour"", ""butter"", ""sugar"", ""egg"", ""vanilla sugar"", ""baking powder""]" -Witbrood,"Any[""yeast"", ""water"", ""sugar"", ""flour"", ""salt"", ""milk"", ""sugar"", ""vegetable oil"", ""water""]" -Pears Poached in Spiced Red Wine,"Any[""pear"", ""red wine"", ""lemon"", ""clove"", ""sugar"", ""vanilla extract"", ""cinnamon"", ""lemon zest"", ""mint leaf""]" -Lemon Belgian Waffles With Berry Syrup,"Any[""cake flour"", ""salt"", ""baking powder"", ""nutmeg"", ""buttermilk"", ""lemon juice zest"", ""egg"", ""cream tartar"", ""water"", ""corn syrup"", ""sugar"", ""berry""]" -Melting Belgian Chocolate Cake,"Any[""cocoa"", ""chocolate"", ""butter"", ""egg"", ""egg yolk"", ""sugar"", ""dark beer"", ""purpose flour"", ""whipping cream"", ""superfine sugar"", ""vanilla""]" -Strawberry Belgian Waffles Recipe,"Any[""egg"", ""flour"", ""milk"", ""butter"", ""sugar"", ""baking powder"", ""cinnamon"", ""salt"", ""vanilla"", ""strawberry"", ""heavy whipping cream"", ""sugar""]" -Milky Carrots,"Any[""carrot"", ""onion"", ""butter"", ""milk"", ""pepper""]" -Croque Boum,"Any[""bread"", ""ham"", ""swiss cheese"", ""spaghetti sauce"", ""butter""]" -Crispy Potatoes and Leeks,"Any[""butter"", ""leek"", ""russet potato"", ""green onion"", ""salt"", ""black pepper"", ""thyme"", ""olive oil"", ""parsley""]" -Belgian Mayonnaise to Serve With Frites,"Any[""egg yolk"", ""dijon mustard"", ""lemon juice"", ""salt pepper"", ""cold water"", ""salad oil""]" -Chicory With Lemon Flemish Style,"Any[""chicory lettuce"", ""butter"", ""chicken stock"", ""brown sugar"", ""lemon"", ""white pepper""]" -Belgian Endive Appetizer,"Any[""belgian endive"", ""blue cheese"", ""walnut"", ""chutney""]" -Brussels Sprouts With Chestnuts,"Any[""brussels sprout"", ""oil"", ""chestnut"", ""salt"", ""pepper""]" -Rice With Mushrooms,"Any[""rice"", ""mushroom"", ""butter"", ""onion"", ""parsley"", ""white wine"", ""tomato puree"", ""chicken stock"", ""cheese""]" -1840s Liege Waffle,"Any[""flour"", ""yeast"", ""egg yolk"", ""water"", ""honey"", ""brown sugar"", ""vanilla"", ""flour"", ""wheat flour"", ""rye flour"", ""salt"", ""egg white"", ""baking soda"", ""vinegar"", ""butter"", ""sugar""]" -Roasted Bone Marrow With Caramelized White Turnip,"Any[""beef marrow"", ""leek"", ""carrot"", ""garlic clove"", ""bay leaf"", ""turnip"", ""sugar"", ""butter"", ""parsley"", ""sea salt""]" -Cucumber Soup (Warm),"Any[""english cucumber"", ""onion"", ""chicken stock cube"", ""milk"", ""salt pepper""]" -Belgian Stoemp Aux Carottes (Carrot Mashed Potatoes),"Any[""potato"", ""carrot"", ""bacon"", ""butter"", ""heavy cream"", ""salt"", ""pepper"", ""nutmeg""]" -Orange Blossom,"Any[""orange"", ""almond syrup"", ""gin"", ""pink grapefruit juice"", ""angostura bitter""]" -Braised Belgian Endive,"Any[""butter"", ""endive"", ""onion"", ""celery"", ""carrot"", ""thyme"", ""chicken stock"", ""butter""]" -Breakfast in Bread,"Any[""english muffin"", ""egg"", ""orange juice"", ""white wine vinegar"", ""sugar"", ""extra virgin olive oil"", ""dijon mustard"", ""salt"", ""black pepper"", ""cream"", ""mesclun"", ""walnut"", ""orange wedge""]" -The Classic French Bistro Sandwich - Croque Monsieur,"Any[""white bread"", ""butter"", ""ham"", ""gruyere cheese"", ""egg"", ""water"", ""salt"", ""black pepper""]" -Belgian Chicken Fricassee (Vol-Au-Vent),"Any[""chicken breast"", ""meat pork beef pepper"", ""mushroom"", ""ham"", ""chicken stock"", ""butter"", ""plain flour"", ""gouda cheese"", ""egg yolk"", ""lemon"", ""salt"", ""pepper""]" -Peanut Butter Cup,"Any[""frangelico liqueur"", ""buttershots butterscotch schnapps"", ""godiva chocolate liqueur"", ""milk""]" -Elegant Beef Blue,"Any[""beef tenderloin steak"", ""asparagus"", ""thyme"", ""salt"", ""pepper"", ""butter"", ""olive oil"", ""white wine"", ""beef consomme"", ""half"", ""blue cheese""]" -Healthy Pumpkin Belgian Waffles,"Any[""bisquick"", ""wheat pastry flour"", ""brown sugar"", ""pumpkin pie spice"", ""pumpkin puree"", ""milk"", ""applesauce"", ""vegetable oil"", ""egg beater substitute"", ""wheat germ"", ""flax seed"", ""walnut""]" -Red Tomato Chutney,"Any[""tomato"", ""red bell pepper"", ""red onion"", ""cranberry"", ""cider vinegar"", ""sugar"", ""brown sugar"", ""ginger"", ""salt"", ""mustard seed"", ""cinnamon"", ""cumin"", ""allspice"", ""red pepper""]" -Hashed Brussels Sprouts With Lemon Zest,"Any[""lemon juice"", ""lemon zest"", ""brussels sprout"", ""olive oil"", ""butter"", ""garlic clove"", ""black mustard seed"", ""white wine"", ""salt pepper""]" -Godiva Chocolate Sugar Cookies,"Any[""godiva dark chocolate bar"", ""purpose flour"", ""baking soda"", ""butter"", ""confectioner ' sugar"", ""egg"", ""vanilla extract"", ""sugar""]" -"Belgian Spaghetti, Student Style","Any[""olive oil"", ""onion"", ""red bell pepper"", ""white mushroom"", ""carrot"", ""garlic clove"", ""beef"", ""sugar"", ""oregano"", ""thyme"", ""basil"", ""red pepper flake"", ""parsley"", ""plum tomato"", ""red wine"", ""tomato paste"", ""salt pepper"", ""spaghetti"", ""tabasco sauce"", ""gruyere cheese""]" -Stella & Tanqueray Chillin & Sippin....,"Any[""beer""]" -Brussels Waffles,"Any[""sugar"", ""butter"", ""flour"", ""yeast"", ""milk"", ""egg yolk"", ""salt""]" -"Pan Fried Brussels Sprouts With Sriracha, Honey and Lime","Any[""brussels sprout"", ""sriracha sauce"", ""honey"", ""lime juice"", ""salt"", ""olive oil""]" -Stoemp (Belgium),"Any[""russet potato"", ""chicken broth"", ""salt"", ""leek"", ""nutmeg"", ""heavy cream"", ""butter"", ""black pepper""]" -Celery Root and Potato Purée,"Any[""celery root"", ""idaho potato"", ""milk"", ""salt"", ""salt"", ""butter"", ""heavy cream"", ""black pepper"", ""nutmeg""]" -Baked Oysters,"Any[""dozen oyster"", ""butter"", ""shallot"", ""parsley"", ""salt"", ""pepper"", ""breadcrumb""]" -Mushroomed Afternoon,"Any[""mushroom"", ""mushroom"", ""mushroom"", ""mushroom"", ""garlic clove"", ""oil"", ""parsley"", ""salt""]" -Brussels Sprouts in Vinaigrette,"Any[""brussels sprout"", ""dijon mustard"", ""herb"", ""wine vinegar"", ""sugar"", ""olive oil"", ""salt"", ""pepper""]" -Belgian Chocolate Bread Pudding,"Any[""challah egg bread"", ""egg"", ""milk"", ""sugar"", ""vanilla"", ""salt"", ""butter"", ""cocoa powder"", ""vanilla custard powder"", ""baking powder"", ""chocolate""]" -Belgian Waffles (Gluten Free),"Any[""tapioca flour"", ""sorghum flour"", ""millet flour"", ""brown rice flour"", ""xanthan gum"", ""salt"", ""baking powder"", ""brown sugar"", ""egg yolk"", ""olive oil"", ""rice milk"", ""egg white replacer"", ""maple syrup""]" -Buttermilk & Brown Butter Waffles,"Any[""butter"", ""purpose flour"", ""brown sugar"", ""baking powder"", ""kosher salt"", ""egg"", ""buttermilk"", ""vanilla extract"", ""butter"", ""maple syrup"", ""plain yogurt""]" -Aunt Jenny's Belgian Waffles,"Any[""bisquick"", ""butter"", ""egg"", ""club soda""]" -Waterzooi Van Vis - Flemmish Fish Stew,"Any[""olive oil"", ""onion"", ""garlic"", ""saffron"", ""white wine"", ""fish stock"", ""fish"", ""mussel"", ""prawn"", ""carrot"", ""leek"", ""tomato"", ""celeriac"", ""spring onion"", ""potato"", ""parsley"", ""tarragon"", ""chervil"", ""salt black pepper""]" -Petit Dejeuner,"Any[""milk"", ""egg"", ""lemon"", ""french bread"", ""breadcrumb"", ""tart apple"", ""water"", ""lemon juice"", ""sausage"", ""onion"", ""sugar"", ""cinnamon"", ""maple syrup""]" -Belgian Waffles,"Any[""flour"", ""baking soda"", ""baking powder"", ""sugar"", ""salt"", ""egg yolk"", ""buttermilk"", ""cream"", ""butter"", ""egg white""]" -Leeks With Bacon,"Any[""leek"", ""bacon"", ""breadcrumb"", ""egg"", ""butter"", ""poppy seed"", ""pepper"", ""salt""]" -Cold Egg and Leek Hors d'Oeuvre,"Any[""leek"", ""olive oil"", ""lemon"", ""egg"", ""mayonnaise"", ""french mustard"", ""caper""]" -Belgian Endive and Beetroot Salad,"Any[""belgian endive"", ""beet"", ""apple"", ""cream"", ""mustard"", ""salt pepper""]" -Belgian Endive and Apple Salad With Cranberry Vinaigrette,"Any[""olive oil"", ""cranberry juice concentrate"", ""white wine vinegar"", ""belgian endive"", ""apple"", ""cranberry"", ""green onion"", ""walnut""]" -Flemish Mussel Croquettes,"Any[""mussel"", ""white wine"", ""shallot"", ""parsley"", ""celery heart"", ""onion"", ""butter"", ""flour"", ""milk"", ""egg"", ""lemon"", ""salt"", ""pepper"", ""flour"", ""breadcrumb"", ""oil""]" -Amazing Belgian Waffles,"Any[""cake flour"", ""baking powder"", ""baking soda"", ""salt"", ""sugar"", ""milk"", ""buttermilk"", ""vanilla"", ""egg"", ""butter""]" -Sourdough Belgian Waffles,"Any[""sourdough starter"", ""water"", ""milk"", ""salt"", ""sugar"", ""butter"", ""egg"", ""flour"", ""vanilla extract""]" -Pumpkin-Pompoen Confituur,"Any[""pumpkin flesh"", ""orange"", ""lemon"", ""sugar""]" -"Cream of Tomato Soup, Belgian-Style","Any[""butter"", ""onion"", ""carrot"", ""tomato"", ""sugar"", ""cayenne pepper"", ""salt"", ""purpose flour"", ""beef broth"", ""heavy cream"", ""madeira wine"", ""black pepper"", ""butter"", ""tomato"", ""chive""]" -Belgian (Brussels) Waffles,"Any[""active yeast"", ""milk"", ""flour"", ""sugar"", ""salt"", ""butter"", ""milk"", ""vanilla extract"", ""egg""]" -Spicy Mango Ginger Chutney,"Any[""green mango"", ""onion"", ""gingerroot"", ""garlic clove"", ""brown sugar"", ""chilies"", ""salt"", ""vinegar"", ""currant"", ""raisin""]" -Scott's Belgian Waffles,"Any[""plain flour"", ""baking powder"", ""salt"", ""sugar"", ""egg"", ""butter"", ""buttermilk"", ""cold water""]" -Belgian Carrots,"Any[""carrot"", ""butter"", ""sugar"", ""salt pepper"", ""onion"", ""parsley""]" -Ground Beef Filling for Puff Pastry,"Any[""onion"", ""garlic clove"", ""butter"", ""beef"", ""parsley"", ""flour"", ""worcestershire sauce"", ""ketchup""]" -True Belgian Waffles,"Any[""flour"", ""sugar"", ""baking powder"", ""egg"", ""milk"", ""butter"", ""vanilla"", ""fruit""]" -Triple-Fruit Scones,"Any[""purpose flour"", ""wheat germ"", ""natural bran"", ""sugar"", ""baking powder"", ""baking soda"", ""salt"", ""margarine"", ""apricot"", ""cranberry"", ""buttermilk"", ""orange"", ""egg"", ""egg white"", ""cooking spray"", ""sugar""]" -Easy Bisqusteaz Belgian Waffles,"Any[""bisquick baking mix"", ""waffle batter"", ""milk"", ""oil"", ""egg"", ""lemon juice"", ""splenda sugar substitute""]" -Frieten (Belgian Fries),"Any[""potato"", ""oil""]" -Pumpkin Belgian Waffles With Cranberry Compote,"Any[""cake flour"", ""wheat flour"", ""wheat germ"", ""flax seed meal"", ""agave nectar"", ""baking powder"", ""pumpkin pie spice"", ""cinnamon"", ""salt"", ""milk"", ""pumpkin puree"", ""butter"", ""egg"", ""egg white"", ""pecan"", ""cranberry"", ""agave nectar"", ""orange juice"", ""orange zest"", ""cinnamon"", ""nutmeg"", ""vanilla extract""]" -Simple Farmstyle Belgian Endive With Bacon and Blue Cheese,"Any[""belgian endive"", ""nutmeg"", ""white pepper"", ""bacon"", ""balsamic vinegar"", ""olive oil"", ""blue cheese""]" -Belgian Endive With Roquefort Dressing,"Any[""dijon mustard"", ""raspberry vinegar"", ""walnut oil"", ""garlic clove"", ""salt"", ""pepper"", ""belgian endive"", ""walnut"", ""roquefort cheese""]" -Oatmeal Stout and Bacon Belgian Waffles,"Any[""oat flour"", ""baking powder"", ""salt"", ""orange peel"", ""egg"", ""oil"", ""stout beer"", ""vanilla extract"", ""bacon"", ""butter"", ""maple syrup"", ""sugar"", ""crisp bacon""]" -Flemish Beef Stew II,"Any[""beef"", ""water"", ""onion"", ""sugar"", ""garlic"", ""salt"", ""black pepper"", ""sage"", ""dark beer"", ""vinegar""]" -Sweet Apples in the Oven,"Any[""apple"", ""dark brown sugar"", ""butter"", ""cinnamon""]" -"Asparagus, Flemish Style","Any[""white asparagus"", ""butter"", ""hard egg"", ""lemon juice"", ""parsley"", ""salt black pepper"", ""nutmeg""]" -Easy Belgian Waffles,"Any[""bisquick"", ""egg"", ""milk"", ""oil"", ""oil""]" -"Belgian Endive, Blue Cheese and Pear Salad","Any[""pear"", ""lemon juice"", ""belgian endive"", ""blue cheese"", ""red wine vinegar salad dressing"", ""black pepper""]" -Grilled Belgian Endive,"Any[""olive oil"", ""belgian endive"", ""olive oil"", ""oregano"", ""balsamic vinegar"", ""salt black pepper""]" -Fried Fish Balls from Brussels,"Any[""fish"", ""floury potato"", ""garlic"", ""parsley"", ""chervil"", ""chive"", ""butter"", ""egg yolk"", ""plain flour"", ""olive oil"", ""beer"", ""egg white"", ""salt""]" -An Indoor Camembert Picnic Platter for Parties and Fêtes!,"Any[""camembert cheese"", ""garlic sausage"", ""radish"", ""tomato"", ""grape"", ""baguette"", ""butter"", ""chutney"", ""pickle""]" -Baked-Bean and Peanut Sandwiches,"Any[""vegetarian bean"", ""peanut"", ""celery"", ""onion"", ""ketchup"", ""salt"", ""toast""]" -"Belgian Endive With Roquefort, Walnuts and Cranberries","Any[""belgian endive"", ""cranberry"", ""california walnut"", ""roquefort cheese"", ""roquefort cheese"", ""roquefort cheese"", ""roquefort cheese"", ""mayonnaise"", ""buttermilk"", ""lime juice"", ""worcestershire sauce"", ""cayenne pepper"", ""red wine vinegar"", ""black pepper""]" -Belgian Endive Salad,"Any[""tart green apple"", ""belgian endive"", ""almond"", ""oil"", ""lemon juice"", ""garlic"", ""salt""]" -Drunken French Country Chicken Au Gratin,"Any[""chicken"", ""cognac"", ""white wine"", ""paprika"", ""creme fraiche"", ""cheddar cheese"", ""dijon mustard"", ""breadcrumb"", ""vegetable peanut oil"", ""caster sugar"", ""flour"", ""salt pepper""]" -Belgian Brownie Cocktail,"Any[""gin"", ""cognac"", ""chocolate liqueur"", ""heavy cream"", ""ice cube""]" -Ww Belgian Waffles,"Any[""yeast"", ""milk"", ""egg substitute"", ""vegetable oil"", ""sugar"", ""table salt"", ""purpose flour"", ""egg white"", ""strawberry"", ""sugar""]" -Abbey Cheese Croquettes With Pear Syrup (Belgium),"Any[""cheese"", ""egg"", ""flour"", ""breadcrumb"", ""sugar"", ""water"", ""lemon zest"", ""pear""]" -Classic Belgian Waffle,"Any[""purpose flour"", ""sugar"", ""salt"", ""active yeast"", ""butter"", ""milk"", ""vanilla extract"", ""egg""]" -Potato and Leek Pancake,"Any[""yukon gold potato"", ""butter"", ""leek"", ""salt black pepper"", ""olive oil"", ""nutmeg"", ""thyme"", ""purpose flour"", ""flat leaf parsley""]" -Waterzooi Au Poulet (Belgian Chicken Soup),"Any[""chicken quarter"", ""carrot"", ""leek"", ""celery rib"", ""onion"", ""parsley"", ""chicken broth"", ""salt pepper"", ""egg yolk""]" -"Green Beans, Potatoes and Bacon Salad from Liege","Any[""green bean"", ""potato"", ""streaky bacon"", ""butter"", ""parsley"", ""spring onion"", ""red wine vinegar""]" -Red Light Cocktail,"Any[""dutch gin"", ""orange liqueur"", ""lemon juice"", ""raspberry"", ""ice""]" -Tipsy Overnight Belgian Waffles,"Any[""purpose flour"", ""active yeast"", ""water"", ""beer"", ""sugar"", ""egg"", ""salt"", ""butter"", ""canola oil"", ""vanilla extract""]" -Raisin Breakfast Bread (Cramique),"Any[""purpose flour"", ""active yeast"", ""milk"", ""egg yolk"", ""butter"", ""sugar"", ""salt"", ""dark raisin""]" -Moule Frites (Mussels With Chips),"Any[""mussel"", ""spring onion"", ""shallot"", ""garlic clove"", ""red chile"", ""thyme"", ""flat leaf parsley"", ""olive oil"", ""white wine"", ""pernod"", ""creme fraiche"", ""potato"", ""herbes de provence"", ""rosemary"", ""oil""]" -Health Smart Belgian Waffles,"Any[""egg"", ""wheat flour"", ""white flour"", ""oatmeal"", ""baking powder"", ""salt"", ""brown sugar"", ""oil"", ""milk""]" -Ninoofse Vlaai,"Any[""milk"", ""mastellen"", ""peperkoek"", ""macaroon"", ""almond"", ""brown sugar"", ""sugar"", ""egg"", ""salt"", ""cinnamon"", ""vanilla"", ""saffron"", ""rum extract""]" -Peanut Stuffed Belgian Endive,"Any[""hoisin sauce"", ""creamy peanut butter"", ""water"", ""cider vinegar"", ""red pepper flake"", ""coleslaw mix"", ""peanut"", ""belgian endive""]" -Jan's Belgian Waffles,"Any[""egg"", ""vanilla"", ""flour"", ""salt"", ""milk"", ""butter"", ""sugar"", ""cinnamon"", ""lemon juice""]" -Belgian Endive Au Gratin,"Any[""vegetable oil"", ""endive"", ""green pepper"", ""red pepper"", ""purpose flour"", ""milk"", ""gruyere cheese"", ""parmesan cheese"", ""salt pepper"", ""ham"", ""parsley""]" -Brussels Beer Waffles,"Any[""purpose flour"", ""salt"", ""cooking oil"", ""beer"", ""egg"", ""lemon"", ""lemon juice"", ""vanilla extract""]" -Belgian Beef Stew With Beer,"Any[""stewing beef"", ""salt"", ""pepper"", ""oil"", ""onion"", ""garlic clove"", ""flour"", ""beef broth"", ""beer"", ""white wine vinegar"", ""thyme"", ""bay leaf""]" -"Belgian Endive, Orange and Date Salad","Any[""extra virgin olive oil"", ""rice vinegar"", ""orange juice"", ""honey"", ""rose water"", ""orange zest"", ""salt black pepper"", ""radish"", ""valencia orange"", ""belgian endive"", ""celery"", ""date"", ""pistachio"", ""mint leaf""]" -Chicory-Belgian Endive and Orange Salad With Ginger Dressing,"Any[""gingerroot"", ""garlic clove"", ""dijon mustard"", ""orange zest"", ""orange juice"", ""lemon juice"", ""clear honey"", ""peanut oil"", ""orange"", ""chicory lettuce"", ""lettuce"", ""watercress""]" -Moules Marinieres - Belgian Mussels,"Any[""mussel"", ""onion"", ""celery"", ""white wine"", ""pepper"", ""butter"", ""cream"", ""parsley""]" -Belgian Style Carrot Coins,"Any[""butter"", ""carrot"", ""water"", ""sugar"", ""salt"", ""pepper"", ""heavy whipping cream"", ""parsley"", ""nutmeg""]" -Asparagus in the Flemish Manner,"Any[""asparagus"", ""egg"", ""butter"", ""parsley"", ""pepper"", ""salt""]" -"Chic and Cheerful - Savoury French Olive, Cheese and Onion Cake","Any[""olive oil"", ""onion"", ""plain white flour"", ""baking powder"", ""salt"", ""egg"", ""milk"", ""gruyere"", ""green olive""]" -Belgian Molasses Bread,"Any[""butter"", ""molasses"", ""milk"", ""water"", ""active yeast"", ""purpose flour"", ""wheat flour"", ""salt""]" -Raspberry Beer & Champagne Cocktail,"Any[""raspberry beer"", ""champagne""]" -Belgian Buttermilk Almond Waffles With Cinnamon-Peach Compote,"Any[""peach"", ""golden brown sugar"", ""water"", ""cinnamon"", ""nutmeg"", ""flour"", ""almond flour"", ""sugar"", ""baking powder"", ""baking soda"", ""salt"", ""buttermilk"", ""butter"", ""egg"", ""almond extract"", ""vegetable oil"", ""almond"", ""cream"", ""almond extract""]" -Vegan Belgian Waffles,"Any[""purpose flour"", ""wheat flour"", ""sugar"", ""baking powder"", ""salt"", ""banana"", ""soymilk"", ""vegan margarine"", ""vanilla"", ""almond extract"", ""applesauce""]" -Flemish Carbonades,"Any[""butter"", ""beef"", ""salt"", ""pepper"", ""purpose flour"", ""onion"", ""ale"", ""sugar"", ""thyme"", ""bay leaf"", ""clove"", ""bread"", ""mustard""]" -Belgium Frites(French Fries),"Any[""potato"", ""salt"", ""oil""]" -Croque Madame,"Any[""bread"", ""ham"", ""swiss cheese"", ""egg"", ""butter""]" -Oven Baked Eggs,"Any[""butter"", ""egg"", ""cream"", ""chive"", ""ham"", ""parmesan cheese"", ""salt"", ""pepper""]" -Belgian Beef Stew,"Any[""butter"", ""bacon"", ""yellow onion"", ""dark brown sugar"", ""garlic clove"", ""purpose flour"", ""salt"", ""pepper"", ""steak"", ""olive oil"", ""dark beer""]" -Kale Soup With Orzo,"Any[""kale"", ""orzo pasta"", ""carrot"", ""onion"", ""celery"", ""rom tomato"", ""vegetable broth"", ""sugar"", ""thyme"", ""bay leaf"", ""basil"", ""white pepper"", ""ginger"", ""kosher salt"", ""olive oil""]" -Belgian Meatballs,"Any[""breadcrumb"", ""milk"", ""turkey"", ""pork"", ""egg"", ""shallot"", ""parsley"", ""salt"", ""pepper"", ""nutmeg"", ""flour"", ""butter"", ""canola oil"", ""onion"", ""belgian endive"", ""sugar"", ""flour"", ""beer"", ""pork broth"", ""parsley""]" -Belgian Shrimp Croquettes (Croquettes Aux Crevettes Grises),"Any[""shrimp"", ""butter"", ""onion"", ""milk"", ""milk"", ""bay leaf"", ""gelatin"", ""cold water"", ""purpose flour"", ""parmesan cheese"", ""egg yolk"", ""lemon juice"", ""salt black pepper"", ""nutmeg"", ""cayenne pepper"", ""egg white"", ""salt"", ""vegetable oil"", ""purpose flour"", ""breadcrumb"", ""vegetable oil"", ""boston lettuce leaf"", ""lemon wedge"", ""parsley""]" -Belgian Chicons Au Gratin (Endives Au Gratin),"Any[""endive"", ""ham"", ""butter"", ""flour"", ""milk"", ""swiss cheese"", ""salt"", ""pepper"", ""nutmeg""]" -Belgium Butter Crumbed Asparagus Eggs for Two,"Any[""fine french breadcrumb"", ""butter"", ""asparagus"", ""egg"", ""salt"", ""parsley"", ""chive"", ""lemon wedge"", ""black pepper""]" -Belgian Endive Croquettes,"Any[""belgian endive"", ""extra virgin olive oil"", ""onion"", ""salt black pepper"", ""morbier cheese"", ""ricotta cheese"", ""egg"", ""herb"", ""breadcrumb"", ""sandwich bread"", ""cornmeal"", ""parmigiano"", ""flour""]" -Belgian Fries (Pommes Frites),"Any[""vegetable oil"", ""potato"", ""salt""]" -"Bastille Burger - Bearnaise, Blue Cheese and Red Onion Burgers","Any[""beef"", ""blue cheese"", ""hamburger bun french bread"", ""bearnaise sauce"", ""dijon mustard"", ""red onion"", ""lettuce"", ""tomato"", ""cornichon"", ""pepper""]" -"Easy Cheese, Potato and Ham Soufflé","Any[""potato"", ""egg"", ""ham"", ""cheese"", ""butter"", ""salt black pepper"", ""single cream""]" -Classic Belgian Waffles,"Any[""active yeast"", ""water"", ""purpose flour"", ""salt"", ""milk"", ""butter"", ""egg"", ""vanilla extract""]" -Belgian Muffins,"Any[""shortening"", ""sugar"", ""egg"", ""flour"", ""baking powder"", ""nutmeg"", ""milk"", ""butter"", ""cinnamon""]" -Belgian Beef and Beer Stew,"Any[""bacon"", ""chuck roast"", ""onion"", ""cremini mushroom"", ""garlic clove"", ""purpose flour"", ""amber beer"", ""carrot"", ""parsnip"", ""beef broth"", ""dijon mustard"", ""salt"", ""thyme"", ""caraway seed"", ""black pepper"", ""bay leaf""]" -Vanilla Bean Belgian Waffles With Whipped Cream and Strawberries,"Any[""milk"", ""vanilla bean"", ""strawberry"", ""sugar"", ""egg"", ""butter"", ""purpose flour"", ""baking powder"", ""salt"", ""heavy cream"", ""sugar"", ""vanilla extract"", ""sugar""]" -Belgium Pancakes A.k.a. Crepes,"Any[""egg"", ""milk"", ""water"", ""plain flour"", ""salt"", ""butter"", ""vanilla""]" -Belgian Beer Marinade,"Any[""beer"", ""honey mustard"", ""canola oil"", ""salt"", ""pepper"", ""onion"", ""bell pepper"", ""scallion"", ""garlic clove"", ""ginger"", ""pickling spice"", ""paprika"", ""caraway seed""]" -Belgian Safehouse Drunken Applesauce,"Any[""apple"", ""beer"", ""dark brown sugar"", ""cinnamon"", ""ginger"", ""clove""]" -Mussels in White Wine,"Any[""mussel"", ""olive oil"", ""onion"", ""garlic clove"", ""white wine"", ""lemon"", ""milk"", ""parsley""]" -Belgian Waffles Texas Style,"Any[""yeast"", ""milk"", ""egg"", ""vanilla"", ""flour"", ""salt"", ""sugar"", ""butter"", ""strawberry"", ""sugar""]" -Godiva Peppermint Patty,"Any[""cocoa"", ""rumple minze pepper mint liqueur"", ""godiva chocolate liqueur""]" -Mushroom-Flavored Forcemeat Stuffing,"Any[""porcini mushroom"", ""hot water"", ""white bread"", ""milk"", ""turkey liver spot"", ""cognac"", ""port wine"", ""butter"", ""onion"", ""white mushroom"", ""oyster mushroom"", ""shiitake mushroom"", ""veal"", ""pork butt"", ""egg yolk"", ""sage leaf"", ""parsley"", ""thyme"", ""salt"", ""black pepper"", ""nutmeg""]" -Brie and Leek Sandwiches,"Any[""bread"", ""olive oil"", ""garlic"", ""leek"", ""sugar"", ""salt"", ""black pepper"", ""cold water"", ""brie cheese""]" -Gourmet Belgian Hot Chocolate,"Any[""milk"", ""vanilla bean"", ""chocolate""]" -Witte Kool in Roomsaus (Shredded Cabbage in Cream Sauce),"Any[""cabbage"", ""salt"", ""heavy whipping cream"", ""black pepper"", ""nutmeg"", ""butter"", ""red pepper flake"", ""bacon bit""]" -Kerrin's Belgian Tea Cake,"Any[""caster sugar"", ""self raising flour"", ""salt"", ""butter"", ""egg"", ""hot water"", ""walnut"", ""lemon juice zest"", ""water"", ""sugar"", ""custard powder"", ""fruit"", ""custard powder""]" -Belgian Raisin Bread (Rosynenbrood) for ABM,"Any[""active yeast"", ""bread flour"", ""milk"", ""salt"", ""sugar"", ""vegetable oil"", ""egg"", ""egg yolk"", ""water"", ""raisin""]" -Asperge Violette: Violet Asparagus With Hollandaise Sauce,"Any[""asparagus spear"", ""butter"", ""lemon wedge"", ""edible flower"", ""butter"", ""egg yolk"", ""hot water"", ""lemon juice"", ""salt pepper""]" -Low Fat Whole Wheat Crispy Belgian Waffles,"Any[""wheat flour"", ""splenda pack"", ""baking powder"", ""salt"", ""almond milk"", ""egg white"", ""applesauce"", ""vanilla extract"", ""pumpkin pie spice"", ""oatmeal"", ""wheat bran""]" -Liege Salad,"Any[""potato"", ""green bean"", ""salt"", ""butter"", ""bacon"", ""red wine vinegar"", ""parsley"", ""spring onion""]" -Leeks in Cheese Sauce,"Any[""leek"", ""milk"", ""cheddar cheese"", ""flour"", ""butter"", ""bay leaf"", ""garlic powder"", ""salt"", ""mustard powder"", ""nutmeg""]" -Aalster Vlaai,"Any[""milk"", ""candico candy syrup"", ""mastellen"", ""egg"", ""cinnamon"", ""sugar cube"", ""foelie""]" -Real Belgian Stiff Dough Waffles-No Sugar Added,"Any[""flour"", ""baking powder"", ""splenda granular"", ""butter"", ""egg"", ""water"", ""salt""]" -Hutsepot Soep,"Any[""green cabbage"", ""carrot"", ""potato"", ""chicken stock"", ""pork"", ""salt"", ""pepper""]" -Cream of Belgian Endive Soup,"Any[""belgian endive"", ""white onion"", ""garlic clove"", ""butter"", ""potato"", ""chicken broth"", ""milk"", ""salt pepper"", ""chive"", ""dill sprig""]" -Flemish Fishermen's Salad,"Any[""white bean"", ""onion"", ""savory"", ""potato"", ""beet"", ""herring fillet"", ""mayonnaise"", ""shallot"", ""french mustard"", ""parsley"", ""gherkin""]" -Caper Vinaigrette,"Any[""dijon mustard"", ""salt"", ""pepper"", ""tarragon"", ""olive oil"", ""caper""]" -Herb Sausage filling,"Any[""pork"", ""onion"", ""garlic"", ""breadcrumb"", ""egg"", ""parsley"", ""thyme"", ""nutmeg"", ""black pepper"", ""clove""]" -Buttermilk Soup With Apples (Belgium),"Any[""purpose flour"", ""buttermilk"", ""granny smith apple"", ""sugar"", ""salt"", ""dark brown sugar""]" -Herb Garlic Bread - Belgian Style,"Any[""butter"", ""garlic"", ""parsley"", ""thyme"", ""salt black pepper"", ""french bread italian""]" -Brussels Sprouts in Beer (Belgium),"Any[""brussels sprout"", ""dark beer"", ""salt"", ""butter""]" -"Green Beans, Flemish Style","Any[""salt"", ""green bean"", ""butter"", ""shallot"", ""sugar"", ""chicken broth"", ""cornstarch"", ""apple cider vinegar"", ""pepper"", ""nutmeg"", ""parsley""]" -"Pork Chops, Brussels Style","Any[""pork loin chop"", ""salt"", ""pepper"", ""purpose flour"", ""butter"", ""vegetable oil"", ""onion"", ""thyme"", ""beer"", ""cornstarch"", ""water"", ""white wine vinegar"", ""parsley""]" -Gratin of Brussels Sprouts,"Any[""heavy cream"", ""brussels sprout"", ""salt"", ""slab bacon"", ""black pepper"", ""nutmeg"", ""gruyere cheese""]" -The Best Belgian Waffles,"Any[""flour"", ""baking powder"", ""salt"", ""sugar"", ""egg"", ""vegetable oil"", ""milk"", ""vanilla""]" -Belgian Cheese Croquettes,"Any[""milk"", ""egg"", ""cheese"", ""breadcrumb"", ""flour"", ""butter"", ""cumin powder"", ""nutmeg"", ""black pepper""]" -Frieten (Belgian French Fries),"Any[""potato"", ""salt"", ""oil""]" -Belgian Hot Chocolate,"Any[""half"", ""chocolate"", ""milk chocolate"", ""salt"", ""cinnamon""]" -Belgian Meatloaf,"Any[""butter"", ""breadcrumb"", ""milk"", ""butter"", ""onion"", ""white mushroom"", ""garlic clove"", ""beef"", ""egg"", ""parsley"", ""sage"", ""oregano"", ""thyme"", ""salt"", ""pepper"", ""nutmeg"", ""port wine"", ""cognac"", ""rosemary""]" -Authentic Belgian Fries ( French Fries ),"Any[""hard vegetable"", ""floury potato"", ""salt""]" -Moules Frites - French-Belgian Bistro Style Mussels and Chips,"Any[""mussel"", ""onion"", ""shallot"", ""garlic clove"", ""thyme"", ""flat leaf parsley"", ""chervil"", ""olive oil"", ""white wine"", ""pernod"", ""creme fraiche"", ""potato"", ""salt"", ""oil""]" -Aardappel Taart - Belgian Potato Tart,"Any[""butter"", ""leek"", ""potato"", ""ham"", ""shortcrust pastry"", ""heavy cream"", ""nutmeg"", ""salt pepper""]" -Deep-Fried Potato Croquettes,"Any[""potato"", ""salt"", ""butter"", ""egg yolk"", ""purpose flour"", ""purpose flour"", ""white pepper"", ""nutmeg"", ""egg white"", ""fine breadcrumb"", ""vegetable oil""]" -Chervil Leek Soup,"Any[""butter"", ""onion"", ""leek"", ""chervil"", ""chicken bouillon cube"", ""bouquet garni"", ""water"", ""salt pepper""]" -Belgium Waterzooi Belgian (Gentse Waterzooi),"Any[""roasting chicken"", ""salt"", ""white pepper"", ""butter"", ""onion"", ""shallot"", ""leek"", ""celery rib"", ""carrot"", ""parsley root"", ""white wine"", ""chicken broth"", ""egg yolk"", ""heavy cream"", ""parsley leaf"", ""lemon"", ""chicken meat"", ""carrot"", ""celery rib"", ""onion"", ""leek"", ""black peppercorn"", ""bouquet garni"", ""white wine"", ""cold water"", ""salt black pepper""]" -Waterzooi van Vis - Flemish Fish Stew,"Any[""herring fillet"", ""celery leaf"", ""salt"", ""black pepper"", ""egg yolk"", ""whipping cream"", ""parsley""]" -Mussels Hoegaarden,"Any[""mussel"", ""onion"", ""parsley"", ""double cream"", ""wheat beer""]" -Belgian Endive with Egg Salad,"Any[""hard egg"", ""mayonnaise"", ""dijon mustard"", ""celery salt"", ""onion"", ""belgian endive"", ""bay shrimp"", ""paprika"", ""edible flower""]" -Stuffed Belgian Endive,"Any[""butter"", ""pear"", ""goat cheese"", ""cream cheese"", ""walnut half"", ""belgian endive""]" -Belgian Rabbit With Prunes in Wine Sauce,"Any[""rabbit"", ""prune"", ""water"", ""purpose flour"", ""butter"", ""oil"", ""onion"", ""salt"", ""pepper"", ""red wine"", ""orange peel"", ""red wine"", ""wine"", ""orange peel"", ""peppercorn"", ""juniper berry"", ""thyme"", ""clove"", ""bay leaf"", ""parsley"", ""onion""]" -Hutespot (Boiled Dinner),"Any[""pork loin"", ""leek"", ""celery"", ""onion"", ""salt"", ""pepper"", ""potato"", ""carrot"", ""turnip"", ""savoy cabbage"", ""water""]" -Stoofvlees (Belgian Beef Stew),"Any[""stewing beef"", ""beer"", ""peperkoek bread"", ""mustard"", ""brown sugar"", ""chocolate"", ""onion"", ""bay leaf"", ""margarine"", ""salt"", ""pepper""]" -Parsley Peppercorn Ground Beef Steaks,"Any[""beef"", ""salt"", ""garlic clove"", ""parsley"", ""black peppercorn"", ""salt"", ""beef broth"", ""heavy cream"", ""butter"", ""parsley""]" -White Asparagus,"Any[""asparagus"", ""butter"", ""egg"", ""cream"", ""prawn"", ""chive"", ""brioche bread""]" -chips or freedom fries cheats method,"Any[""potato"", ""peanut oil"", ""white pepper"", ""sea salt"", ""malt vinegar""]" -Gratin D'endives Ardennaise,"Any[""belgian endive"", ""sugar"", ""salt"", ""black pepper"", ""milk"", ""purpose flour"", ""butter"", ""nutmeg"", ""bacon"", ""gruyere cheese""]" -Belgian White Asparagus With Shrimp and Scrambled Eggs,"Any[""white asparagus"", ""shrimp"", ""butter"", ""salt"", ""pepper"", ""garlic"", ""egg"", ""parsley""]" -Ahoy There! Moules Marinières - French Sailor's Mussels,"Any[""mussel"", ""garlic clove"", ""onion"", ""white wine"", ""butter"", ""herb"", ""creme fraiche"", ""salt pepper""]" -Petits Pois à La Française - French Style Peas,"Any[""butter"", ""spring onion"", ""iceberg lettuce"", ""caster sugar"", ""vegetable stock"", ""pea"", ""creme fraiche"", ""mint""]" -Garlic and Mustard Roasted Brussel Sprouts,"Any[""brussels sprout"", ""extra virgin olive oil"", ""agave nectar"", ""stone mustard"", ""garlic"", ""lemon""]" -Rabbit and Prune Stew,"Any[""prune"", ""flour"", ""rabbit"", ""butter"", ""oil"", ""bacon"", ""onion"", ""beer"", ""cider vinegar"", ""garlic clove"", ""thyme"", ""bay leaf"", ""clove""]" -Braised Belgian Endive,"Any[""belgian endive"", ""butter"", ""sugar"", ""lemon juice"", ""chicken broth"", ""herb"", ""parsley"", ""pepper""]" -Belgian Roast- (Crock Pot),"Any[""beef rump roast"", ""oil"", ""butter"", ""thyme"", ""salt"", ""onion"", ""garlic clove"", ""brown sugar"", ""parsley"", ""white vinegar"", ""bay leaf"", ""pepper"", ""beer"", ""cornstarch"", ""water""]" -Limbourgian Beer Stew,"Any[""beef steak"", ""onion"", ""peperkoek"", ""bread apple syrup"", ""butter"", ""flour"", ""salt pepper"", ""vinegar"", ""dark beer"", ""clove"", ""bay leaf"", ""peppercorn"", ""salt pepper""]" -Calf Liver and Oyster Mushroom Tart,"Any[""pastry"", ""butter"", ""calf liver"", ""oyster mushroom"", ""balsamic vinegar"", ""dijon mustard"", ""salt"", ""black pepper"", ""cream"", ""cornstarch"", ""egg""]" -Asparagus with Fish and Eau de Vie,"Any[""asparagus"", ""fish steak"", ""pepper"", ""salt"", ""mustard"", ""butter"", ""breadcrumb"", ""chive"", ""nutmeg"", ""fish stock"", ""eau de vie"", ""cayenne pepper"", ""saffron"", ""ham""]" -Flemish Beef Stew Cooked in Beer,"Any[""stew meat"", ""salt"", ""black pepper"", ""purpose flour"", ""butter"", ""onion"", ""beer"", ""thyme"", ""bay leaf"", ""red currant jelly"", ""cider""]" -Christmas Turkey Stuffed With Mushroom-Flavored Forcemeat,"Any[""turkey"", ""butter"", ""butter"", ""salt"", ""pepper"", ""paprika"", ""carrot"", ""celery rib"", ""onion"", ""water"", ""cognac"", ""port wine"", ""purpose flour"", ""butter""]" -Café Belgique,"Any[""egg white"", ""heavy cream"", ""vanilla extract"", ""coffee""]" -Flammekeuch,"Any[""bread dough"", ""olive oil"", ""bacon"", ""onion"", ""cream"", ""salt black pepper"", ""gruyere"", ""chive""]" -Belgian Waffle Strawberry Sundaes,"Any[""strawberry"", ""sugar"", ""belgian waffle"", ""strawberry ice cream""]" -"Belgian Endive, Mache, Apples With Sherry Vinaigrette","Any[""walnut half"", ""beet"", ""belgian endive"", ""watercress"", ""apple"", ""sea salt"", ""black pepper"", ""sherry wine vinegar"", ""extra virgin olive oil""]" -Baked Belgian Endive,"Any[""belgian endive"", ""butter"", ""sugar"", ""salt"", ""black pepper"", ""bacon"", ""white flour"", ""half"", ""parmesan cheese"", ""fine breadcrumb""]" -Roast Pork With Cheese and Cured Ham,"Any[""pork loin roast"", ""butter"", ""vegetable oil"", ""salt black pepper"", ""carrot"", ""onion"", ""thyme"", ""bay leaf"", ""water"", ""gruyere cheese"", ""ham"", ""port wine"", ""beef broth"", ""parsley""]" -Carbonade Flamande - Flemish Beef and Beer Stew-Casserole,"Any[""beef"", ""bacon"", ""onion"", ""garlic clove"", ""bouquet garni"", ""belgian brown ale"", ""beef stock"", ""red wine vinegar"", ""butter"", ""olive oil"", ""french bread"", ""brown sugar"", ""dijon mustard"", ""salt"", ""pepper""]" -Moules Et Frites (Mussels and Fries),"Any[""mussel"", ""butter"", ""onion"", ""white wine"", ""parsley"", ""mustard"", ""mayonnaise""]" -"Auberge Roast Chicken Rillettes With Armagnac, Thyme and Garlic","Any[""chicken"", ""thyme leave"", ""garlic clove"", ""shallot"", ""quatre epices rabelais seasoning"", ""mace"", ""black peppercorn"", ""white wine"", ""salt"", ""armagnac"", ""duck""]" -Fillet of Cod Flemish Style,"Any[""butter"", ""onion"", ""salt black pepper"", ""parsley"", ""chive"", ""cod fish fillet"", ""lemon"", ""bay leaf"", ""thyme"", ""white wine""]" -Classic Entrecote Bordelaise - Steak in Red Wine With Shallots,"Any[""entrecote steak"", ""butter"", ""shallot"", ""red wine"", ""demi glace"", ""parsley"", ""salt"", ""black pepper""]" -Beer-Infused Belgian Waffles,"Any[""flour"", ""brown sugar"", ""baking powder"", ""salt"", ""beer"", ""milk"", ""butter"", ""egg"", ""vanilla"", ""honey"", ""sugar""]" -Carbonnade of Beef,"Any[""beef steak"", ""bacon"", ""butter"", ""onion"", ""garlic clove"", ""flour"", ""black pepper"", ""beer"", ""beef broth"", ""kitchen bouquet"", ""thyme leaf"", ""brown sugar"", ""white vinegar"", ""bay leaf""]" -"Belgian Endive, Apple and Almond Salad","Any[""tart green apple"", ""belgian endive"", ""almond"", ""salad oil"", ""lemon juice"", ""garlic"", ""salt pepper""]" -Arugula Walnut Pate With Belgian Endive,"Any[""arugula leaf"", ""hard egg"", ""plain yogurt"", ""mayonnaise"", ""walnut"", ""dijon mustard"", ""garlic clove"", ""lemon pepper"", ""lemon juice"", ""scallion"", ""belgian endive""]" -Belgian Waffles,"Any[""flour"", ""milk"", ""milk"", ""yeast"", ""egg"", ""egg yolk"", ""salt"", ""vanilla extract"", ""butter"", ""sugar"", ""milk powder""]" -Honey Glazed Corned Beef,"Any[""beef brisket"", ""water"", ""pickling spice"", ""white onion"", ""carrot"", ""celery"", ""garlic clove"", ""honey"", ""brown sugar"", ""dijon mustard"", ""ginger""]" -Sacré Boeuf Sirloin Steak Topped With Mustard Herb Butter,"Any[""sirloin steak"", ""butter"", ""parsley"", ""chervil"", ""tarragon"", ""dijon mustard"", ""cayenne pepper""]" -Belgian Pork Chops,"Any[""pork chop"", ""salt pepper"", ""plain flour"", ""oil"", ""onion"", ""beer"", ""chicken stock"", ""brussels sprout"", ""butter"", ""cornflour""]" -Belgian Walnut Rice Loaf,"Any[""walnut"", ""rice"", ""parsley"", ""egg"", ""oil"", ""celery"", ""onion"", ""green pepper"", ""tomato"", ""bay leaf"", ""garlic clove"", ""thyme"", ""salt pepper"", ""cheese""]" -Flemish Carrots,"Any[""butter"", ""carrot"", ""water"", ""brown sugar"", ""salt"", ""mace"", ""cream"", ""lemon juice"", ""egg yolk""]" -Beef in Beer - 2-Qt Pressure Cooker,"Any[""beef steak"", ""dijon mustard"", ""salt black pepper"", ""paprika"", ""olive oil"", ""dark beer"", ""flour"", ""tomato paste"", ""beef broth"", ""onion"", ""carrot"", ""leek""]" -Belgian Hutsepot,"Any[""beef roast"", ""pork shoulder"", ""water"", ""bay leaf"", ""peppercorn"", ""salt"", ""new potato"", ""savoy cabbage"", ""turnip"", ""pea"", ""crouton"", ""chive"", ""dijon mustard"", ""horseradish""]" -Creamy Braised Chicory-Belgian Endive and Celery With Peas,"Any[""chicory lettuce"", ""celery"", ""pancetta"", ""chicken stock"", ""double cream"", ""pea"", ""salt"", ""pepper""]" -"Carbonades Flamandes (Belgian Recipe for Beef, Onions in Sauce)","Any[""beef"", ""butter"", ""onion"", ""flour"", ""brown sugar"", ""wine vinegar"", ""ale"", ""salt black pepper"", ""bouquet garni""]" -Chateaubriand 'My Way',"Any[""beef tenderloin"", ""salt"", ""pepper"", ""peanut oil"", ""heavy whipping cream"", ""green peppercorn"", ""lemon juice"", ""salt"", ""white pepper"", ""honey"", ""cognac""]" -Belgian Endive Salad With Walnut Vinaigrette,"Any[""belgian endive"", ""walnut"", ""italian parsley"", ""salt pepper"", ""blue cheese"", ""walnut oil"", ""red wine vinegar"", ""dijon mustard"", ""salt pepper""]" -Packs a Wallop Beef Stew!,"Any[""paprika"", ""salt"", ""garlic powder"", ""mustard"", ""onion powder"", ""oregano leaf"", ""caraway seed"", ""cayenne"", ""cumin"", ""black pepper"", ""white pepper"", ""butter"", ""beef chuck roast"", ""potato"", ""carrot"", ""green bell pepper"", ""beef stock""]" -Beer- and Onion-Braised Chicken Carbonnade,"Any[""butter"", ""chicken thigh"", ""allspice"", ""onion"", ""dark brown sugar"", ""bay leaf"", ""dijon mustard"", ""dark beer"", ""beef broth"", ""red wine vinegar"", ""egg noodle""]" -Escargot Vol-Au-Vent. Garlic Butter Snails in Mini Vol-Au-Vents,"Any[""garlic clove"", ""sea salt"", ""butter"", ""parsley"", ""chive"", ""shallot"", ""black pepper"", ""lemon juice"", ""pernod"", ""snail"", ""puff pastry"", ""puff pastry""]" -Gentse Waterzooi,"Any[""zucchini"", ""carrot"", ""mushroom"", ""celery"", ""leek"", ""onion"", ""potato"", ""chicken breast"", ""vegetable stock"", ""egg yolk"", ""cream"", ""parsley"", ""pepper"", ""salt"", ""margarine"", ""flour""]" -Smoked Salmon and Philadephia Sandwich,"Any[""salmon"", ""cream cheese"", ""green apple"", ""tomato"", ""brown bread""]" -Belgian Endive Salad,"Any[""belgian endive"", ""tomato"", ""onion"", ""jalapeno pepper"", ""cilantro"", ""lemon juice""]" -Belgian Hare a La Maryland,"Any[""rabbit"", ""salt pepper"", ""flour"", ""egg"", ""cracker crumb"", ""butter"", ""onion"", ""bay leaf""]" -Deer Stew With Mustard and Cashew Nuts,"Any[""deer"", ""baby onion"", ""carrot"", ""celery rib"", ""green cabbage"", ""red wine"", ""vegetable bouillon"", ""olive oil"", ""mustard"", ""cashew"", ""parsley""]" -Waterzooi of Chicken,"Any[""chicken"", ""salt pepper"", ""bay leaf"", ""parsley"", ""thyme"", ""butter"", ""onion"", ""chicken broth"", ""carrot"", ""leek"", ""celery rib"", ""baking potato"", ""heavy cream"", ""egg yolk"", ""parsley""]" -Traditional Style Swiss Steak,"Any[""steak"", ""yellow onion"", ""green pepper"", ""garlic powder"", ""tomato"", ""tomato sauce"", ""adolph meat tenderizer"", ""black pepper"", ""flour"", ""crisco"", ""butter"", ""salt"", ""water""]" -Chicken Waterzooi Stew,"Any[""celery"", ""carrot"", ""chicken breast half"", ""vegetable oil"", ""butter"", ""shallot"", ""mushroom"", ""leek"", ""garlic clove"", ""thyme"", ""peppercorn"", ""half"", ""salt pepper""]" -Belgian Meatballs Braised in Beer,"Any[""white breadcrumb"", ""milk"", ""beef"", ""pork"", ""egg"", ""shallot"", ""parsley"", ""salt pepper"", ""nutmeg"", ""flour"", ""butter"", ""vegetable oil"", ""onion"", ""belgian endive"", ""sugar"", ""salt pepper"", ""flour"", ""pilsner beer"", ""beef broth"", ""parsley""]" -Flemish-Style Pork Chops,"Any[""pork chop"", ""butter"", ""tart apple"", ""lemon juice"", ""juniper berry"", ""salt pepper"", ""rosemary sprig"", ""parsley"", ""butter""]" -Lobster Ganda,"Any[""lobster"", ""ham"", ""mushroom cap"", ""shallot"", ""brandy"", ""white wine"", ""port wine"", ""salt"", ""pepper"", ""egg yolk"", ""single cream""]" -Veggies Dream Cucumber Sandwich,"Any[""wheat bread rye"", ""cream cheese"", ""cucumber"", ""alfalfa sprout"", ""olive oil"", ""red wine vinegar"", ""tomato"", ""lettuce"", ""pepperoncini pepper"", ""avocado""]" -Scallops and Endive With Pasta,"Any[""shallot"", ""garlic"", ""olive oil"", ""cherry tomato"", ""belgian endive"", ""thyme"", ""oregano"", ""basil"", ""salt pepper"", ""sherry wine"", ""butter"", ""bay scallop"", ""basil sprig"", ""pasta""]" -Braised Belgian Endive and Chicken Cutlets - Clean Eating,"Any[""olive oil"", ""chicken breast"", ""pepper"", ""thyme"", ""belgian endive"", ""honey"", ""lemon juice"", ""chicken broth"", ""parsley""]" -Carbonnade (Beef and Onions Stewed in Beer),"Any[""onion"", ""oil corn"", ""beef"", ""salt black pepper"", ""garlic"", ""bay leaf"", ""thyme leaf"", ""oregano leaf"", ""beer"", ""dijon mustard"", ""parsley leaf""]" -Belgian Mussels,"Any[""mussel"", ""leek"", ""onion"", ""celery rib"", ""pepper"", ""salt"", ""butter""]" -Belgian Beef Skewers With Beer BBQ Sauce,"Any[""beef roast"", ""garlic"", ""onion"", ""dijon mustard"", ""ale"", ""ketchup"", ""brown sugar"", ""pepper sauce"", ""salt pepper""]" -Mussels With Curry Cream Sauce,"Any[""mussel"", ""white wine"", ""butter"", ""onion"", ""carrot"", ""sultana"", ""curry powder"", ""tomato puree"", ""apple"", ""double cream""]" -Alaskan Pollack with Broccoli in a Cream Sauce,"Any[""broccoli floret"", ""shrimp"", ""shallot"", ""parmesan cheese"", ""cream"", ""milk"", ""salt"", ""sugar"", ""dill""]" -Elderberry Soup,"Any[""elderberry"", ""water"", ""cinnamon"", ""lemon"", ""sugar"", ""salt"", ""pear"", ""cornstarch"", ""white wine"", ""cream""]" -Gigot a La Cuillère - French Slow Cooked Spoon Lamb,"Any[""leg lamb"", ""onion"", ""garlic clove"", ""carrot"", ""white wine"", ""stock"", ""armagnac"", ""salt pepper"", ""thyme""]" -Stoofvlees,"Any[""stewing beef"", ""pork stew meat"", ""onion"", ""dark beer"", ""wheat bread grain"", ""sugar"", ""butter"", ""hot mustard""]" -Omelet With Belgian Endives and Shrimps,"Any[""egg"", ""butter"", ""belgian endive"", ""shrimp"", ""chive"", ""pepper"", ""salt""]" -Salade Liégeoise,"Any[""french haricot vert green bean"", ""potato"", ""streaky bacon"", ""butter"", ""parsley"", ""scallion"", ""red wine vinegar""]" -Belgian Beef Stew,"Any[""bacon"", ""butter"", ""onion"", ""garlic"", ""beef chuck roast"", ""purpose flour"", ""salt"", ""black pepper"", ""beer"", ""lemon juice""]" -Traditional French Pistolets - Little Onion and Rye Bread Rolls,"Any[""water"", ""yeast"", ""olive oil"", ""salt"", ""sugar"", ""white bread flour"", ""rye flour"", ""onion"", ""water"", ""flour""]" -Belgian Meatballs,"Any[""beef"", ""onion"", ""green onion"", ""salt"", ""pepper"", ""garlic powder"", ""cornmeal"", ""chili powder"", ""mustard"", ""milk"", ""egg"", ""flour"", ""tomato""]" -"Pear, Roquefort and Rosemary French Galettes - Tartelettes","Any[""egg white"", ""roquefort cheese"", ""creme fraiche"", ""shortcrust pastry"", ""rosemary leaf"", ""butter"", ""pear"", ""cumin seed"", ""rosemary"", ""egg yolk milk"", ""salt"", ""pepper"", ""danish blue cheese""]" -Chicken with Belgian Endive (kip met witloof),"Any[""chicken"", ""belgian endive"", ""butter"", ""heavy cream"", ""lemon"", ""flour"", ""salt pepper""]" -Belgian Stew,"Any[""beef stew meat"", ""oil"", ""onion"", ""carrot"", ""celery"", ""garlic"", ""beer"", ""marjoram"", ""brown sugar"", ""celery seed"", ""bay leaf"", ""salt pepper""]" -Grilled Ham & Chimay Cheese Sammies W-Caramelized Endive,"Any[""canola oil"", ""belgian endive"", ""sugar"", ""beer"", ""orange juice"", ""bread"", ""butter"", ""ham"", ""cheese"", ""pickle spear"", ""brown mustard""]" -Flemish Carbonnade,"Any[""beef steak"", ""bay leaf"", ""onion"", ""stoofvlees seasoning"", ""dark beer"", ""mustard"", ""brown sugar"", ""butter"", ""olive oil"", ""black pepper""]" -Stewed Veal in a Cream and Lemon Sauce,"Any[""veal"", ""anchovy"", ""thyme"", ""chicken broth"", ""salt pepper"", ""butter"", ""plain flour"", ""heavy cream"", ""nutmeg"", ""lemon"", ""lemon""]" -Flemish Beef Stew,"Any[""salt pork"", ""bay leaf"", ""beef chuck"", ""thyme"", ""onion"", ""dijon mustard"", ""flour"", ""french bread"", ""vinegar"", ""stout beer"", ""parsley sprig"", ""brown sugar""]" -Stuffed chicken for 6,"Any[""chicken"", ""turkey"", ""potato"", ""onion"", ""bread"", ""white mushroom"", ""thyme"", ""salt pepper"", ""olive oil""]" -Maïté's Leftover Chicken Salad,"Any[""chicken"", ""peach"", ""egg"", ""mayonnaise""]" -Rich Man's Hamburgers,"Any[""shallot"", ""chive"", ""dijon mustard"", ""tabasco sauce"", ""egg yolk"", ""worcestershire sauce"", ""cognac"", ""sea salt"", ""caper"", ""black peppercorn"", ""kaiser bun"", ""butter"", ""ketchup"", ""cider vinegar"", ""dark brown sugar"", ""garlic clove"", ""worcestershire sauce"", ""tabasco sauce""]" -Sauteed Shrimp and Arborio Risotto Stella Artois Asparagus Tips,"Any[""risotto rice"", ""shallot"", ""red bell pepper"", ""green asparagus"", ""vegetable stock"", ""olive oil"", ""wine"", ""beer"", ""olive oil"", ""parmesan cheese"", ""salt"", ""pepper""]" -Stoemp Aux Poireaux-Stoemp Met Prei - Belgian Mashed Potatoes,"Any[""potato"", ""butter"", ""cream"", ""onion"", ""garlic clove"", ""leek"", ""stock"", ""salt pepper"", ""nutmeg""]" -Quatre Épices - French Four Spice Mix from the Auberge,"Any[""white peppercorn"", ""nutmeg"", ""clove"", ""cinnamon"", ""ginger"", ""allspice berry""]" -Smoked Salmon Stuffed Belgian Endive Boats,"Any[""salmon"", ""mayonnaise"", ""parmesan cheese"", ""green onion"", ""lemon juice"", ""dill"", ""olive oil"", ""salt pepper"", ""belgian endive""]" -Tofu Beer Stew,"Any[""tofu"", ""onion"", ""beer"", ""vegetable broth"", ""dijon mustard"", ""brown sugar"", ""poppy seed"", ""herb"", ""vegan worcestershire sauce"", ""salt pepper"", ""cornstarch""]" -Quorn Stoverij (Belgian Beer Sauce Stew),"Any[""quorn"", ""carrot"", ""onion"", ""olive oil"", ""dark beer"", ""rosemary"", ""thyme"", ""parsley"", ""salt"", ""vegetable stock"", ""cremini mushroom"", ""jam""]" -Whitloaf,"Any[""belgian endive"", ""ham"", ""swiss cheese"", ""olive oil"", ""milk"", ""milk"", ""chicken bouillon cube"", ""swiss cheese"", ""cornstarch""]" -Cream of Endive Soup,"Any[""belgian endive"", ""white onion"", ""garlic"", ""butter"", ""potato"", ""chicken broth"", ""milk"", ""salt pepper"", ""chive"", ""dill sprig""]" -Belgium Chicken Waterzooi,"Any[""chicken"", ""carrot"", ""celery rib"", ""shallot"", ""parsley"", ""thyme"", ""bay leaf"", ""salt black pepper"", ""leek"", ""mushroom"", ""egg yolk"", ""cream"", ""lemon"", ""butter"", ""nutmeg""]" -Poulet à La Bière - Chicken in Beer,"Any[""plain flour"", ""salt black pepper"", ""chicken quarter"", ""onion"", ""carrot"", ""celery rib"", ""butter"", ""olive oil"", ""ale"", ""garlic clove"", ""bouquet garni"", ""heavy cream""]" -Paupiettes De Porc - French Stuffed Pork Fillet Parcels,"Any[""pork escalopes"", ""salt"", ""pepper"", ""pork sausage"", ""onion"", ""herb"", ""olive oil"", ""shallot"", ""plain flour"", ""sun tomato paste"", ""white wine"", ""mushroom"", ""orange zest"", ""bay leaf"", ""parsley"", ""thyme"", ""sage leaf"", ""kitchen string""]" -Belgian Beef Carbonnade,"Any[""flour"", ""salt"", ""pepper"", ""paprika"", ""beef cube"", ""butter"", ""onion"", ""garlic clove"", ""bay leaf"", ""thyme"", ""celery leaf"", ""parsley"", ""brown sugar"", ""beer"", ""vinegar""]" -Baked Apples Filled With Berries,"Any[""cranberry"", ""sugar"", ""apple"", ""butter"", ""water""]" -Belgian Endive With Lovage Vinaigrette,"Any[""sherry wine vinegar"", ""shallot"", ""dijon mustard"", ""water"", ""extra virgin olive oil"", ""lovage"", ""belgian endive"", ""green"", ""carrot""]" -"Salad Frisee with Endive, Canadian Bacon, & Croutons","Any[""belgian endive"", ""chicory lettuce"", ""walnut oil"", ""red wine vinegar"", ""salt pepper"", ""canadian bacon"", ""french bread""]" -Belgian Leek Tart & Aged Goat Cheese (Flamiche Aux Poireaux),"Any[""ice water"", ""apple cider vinegar"", ""purpose flour"", ""salt"", ""butter"", ""butter"", ""milk"", ""heavy whipping cream"", ""egg"", ""egg yolk"", ""salt"", ""goat cheese"", ""leek"", ""butter"", ""leek"", ""water"", ""salt""]" -Flemish Beef & Beer Stew,"Any[""stewing beef"", ""onion"", ""flour"", ""sunflower oil"", ""garlic clove"", ""salt"", ""brown sugar"", ""wine vinegar"", ""parsley"", ""thyme"", ""pepper"", ""beef broth"", ""beer""]" -Stoemp With Caramelized Shallots,"Any[""floury potato"", ""milk"", ""salt"", ""butter"", ""double cream"", ""salt pepper"", ""nutmeg"", ""shallot"", ""parsley""]" -Flemish Beef Sirloin in Beer Sauce With Savory Vegetables,"Any[""sirloin tip roast"", ""salt pepper"", ""vegetable oil"", ""onion"", ""garlic clove"", ""carrot"", ""clove"", ""orange zest"", ""brandy"", ""dark beer"", ""peppercorn"", ""bay leaf"", ""thyme"", ""porcini mushroom"", ""red wine vinegar"", ""cornstarch"", ""brown sugar"", ""fennel"", ""new potato""]" diff --git a/src/Fridge.jl b/src/Fridge.jl index 93f2003d..f4f4695b 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -31,12 +31,13 @@ For instance cheese may be replaced by swiss cheese. ## Input: - fridgeList: A list containing the different foods in your fridge as a string. - ingredientList: A list containing all the different ingredients that are used in the recipe database. +- test: An optional Boolean argument. When true the function simulates user input. ## Output: - fridgeList: The (adapted) given fridgeList """ -function checkIngredients(fridgeList,ingredientList) +function checkIngredients(fridgeList,ingredientList; test=false) print("Checking if the food in your fridge is found in our database.\n\n") @@ -54,7 +55,14 @@ function checkIngredients(fridgeList,ingredientList) print("[$indexNum] $alternative\n") end print("If you want to take an alternative type its number, else type no.\n") - answer = readline() + if !test + # read wanted alternative number + answer = readline() + else + # simulate user input + answer = string(rand(1:length(alternatives))) + print("The computer typed $answer.") + end if answer != "no" correctInput = false while !correctInput @@ -303,13 +311,24 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" + + solution = curSolution - obj = fridgeObjective([i for i in values(solution)]) + if isempty(solution) + print("There are no recipes in the database matching your fridge.") + T = Tmin-1 + else + obj = fridgeObjective([i for i in values(solution)]) + T = Tmax + end + tabuList = String[i for i in keys(curSolution)] - # current temperature - T = Tmax while T > Tmin + if isempty(solution) + print("There are no recipes in the database matching your fridge.") + break + end print("T = $T \n") # repeat kT times for i in 1:kT @@ -359,12 +378,13 @@ if not it offers possible alternatives. Next it uses simulated annealing to find ## Optional Inputs: - numRecipes: The max amount of recipes that a combo should contain. - randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. +- testmode: An optional Boolean argument. When true the function simulates user input. ## Output: - SASolution: A dictionary containing the best found combination of recipes. """ -function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false, testmode=false) # load the recipe dictionary from the db file @@ -374,10 +394,10 @@ function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) ingredientList = createIngredientDatabase(recipeDict) # check for every food in your fridge if it's in the database. If not check if their are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList) + fridgeList = checkIngredients(fridgeList, ingredientList, test=testmode) # find the best greedy recipe - greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) print("greedySolution = $greedySolution\n") # find the best recipe with SA diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 651cbb1d..2344f1f5 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -88,4 +88,10 @@ testDictDB = loadRecipeDBCSV("./testDB.csv") @test keys(testDictDB) == keys(Dict("Belgian Chocolate Mousse" => ["test"], "Belgian Buns" => ["test"])) end + + @testset "findBestRecipe" begin + scrapeRecipe(106543,106555,"./testDB.csv") + # check if the combination of all recipes works + @test length(values(findBestRecipe(testList, "./testDB.csv", numRecipes=2, randRecipe=true, testmode=true))) == 0 + end end \ No newline at end of file diff --git a/test/testDB.csv b/test/testDB.csv new file mode 100644 index 00000000..8af72242 --- /dev/null +++ b/test/testDB.csv @@ -0,0 +1,16 @@ +first,second +Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" +Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" +Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" +Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" +Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" +Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" +Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" +Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" +Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" +Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" +Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" +Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" +Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" +Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" +Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]" From 3ce5282d3044aaf3bcf196c15791143eca20e974 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 21:28:47 +0100 Subject: [PATCH 55/57] temp --- src/Fridge.jl | 36 ++++++++---------------------------- test/fridgeTest.jl | 6 ------ test/testDB.csv | 16 ---------------- 3 files changed, 8 insertions(+), 50 deletions(-) delete mode 100644 test/testDB.csv diff --git a/src/Fridge.jl b/src/Fridge.jl index f4f4695b..93f2003d 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -31,13 +31,12 @@ For instance cheese may be replaced by swiss cheese. ## Input: - fridgeList: A list containing the different foods in your fridge as a string. - ingredientList: A list containing all the different ingredients that are used in the recipe database. -- test: An optional Boolean argument. When true the function simulates user input. ## Output: - fridgeList: The (adapted) given fridgeList """ -function checkIngredients(fridgeList,ingredientList; test=false) +function checkIngredients(fridgeList,ingredientList) print("Checking if the food in your fridge is found in our database.\n\n") @@ -55,14 +54,7 @@ function checkIngredients(fridgeList,ingredientList; test=false) print("[$indexNum] $alternative\n") end print("If you want to take an alternative type its number, else type no.\n") - if !test - # read wanted alternative number - answer = readline() - else - # simulate user input - answer = string(rand(1:length(alternatives))) - print("The computer typed $answer.") - end + answer = readline() if answer != "no" correctInput = false while !correctInput @@ -311,24 +303,13 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" - - solution = curSolution - if isempty(solution) - print("There are no recipes in the database matching your fridge.") - T = Tmin-1 - else - obj = fridgeObjective([i for i in values(solution)]) - T = Tmax - end - + obj = fridgeObjective([i for i in values(solution)]) tabuList = String[i for i in keys(curSolution)] + # current temperature + T = Tmax while T > Tmin - if isempty(solution) - print("There are no recipes in the database matching your fridge.") - break - end print("T = $T \n") # repeat kT times for i in 1:kT @@ -378,13 +359,12 @@ if not it offers possible alternatives. Next it uses simulated annealing to find ## Optional Inputs: - numRecipes: The max amount of recipes that a combo should contain. - randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. -- testmode: An optional Boolean argument. When true the function simulates user input. ## Output: - SASolution: A dictionary containing the best found combination of recipes. """ -function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false, testmode=false) +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) # load the recipe dictionary from the db file @@ -394,10 +374,10 @@ function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false, te ingredientList = createIngredientDatabase(recipeDict) # check for every food in your fridge if it's in the database. If not check if their are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList, test=testmode) + fridgeList = checkIngredients(fridgeList, ingredientList) # find the best greedy recipe - greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) + greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) print("greedySolution = $greedySolution\n") # find the best recipe with SA diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 2344f1f5..651cbb1d 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -88,10 +88,4 @@ testDictDB = loadRecipeDBCSV("./testDB.csv") @test keys(testDictDB) == keys(Dict("Belgian Chocolate Mousse" => ["test"], "Belgian Buns" => ["test"])) end - - @testset "findBestRecipe" begin - scrapeRecipe(106543,106555,"./testDB.csv") - # check if the combination of all recipes works - @test length(values(findBestRecipe(testList, "./testDB.csv", numRecipes=2, randRecipe=true, testmode=true))) == 0 - end end \ No newline at end of file diff --git a/test/testDB.csv b/test/testDB.csv deleted file mode 100644 index 8af72242..00000000 --- a/test/testDB.csv +++ /dev/null @@ -1,16 +0,0 @@ -first,second -Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" -Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" -Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" -Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" -Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" -Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" -Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" -Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" -Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" -Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" -Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" -Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" -Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" -Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" -Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]" From 3c42359e5d7f3d2aad790493f52edd383b8160f2 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 21:23:42 +0100 Subject: [PATCH 56/57] removed some small bugs and expanded tests --- src/Fridge.jl | 36 ++++++++++++++++++++++++++++-------- test/fridgeTest.jl | 6 ++++++ test/testDB.csv | 16 ++++++++++++++++ 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 test/testDB.csv diff --git a/src/Fridge.jl b/src/Fridge.jl index 93f2003d..f4f4695b 100644 --- a/src/Fridge.jl +++ b/src/Fridge.jl @@ -31,12 +31,13 @@ For instance cheese may be replaced by swiss cheese. ## Input: - fridgeList: A list containing the different foods in your fridge as a string. - ingredientList: A list containing all the different ingredients that are used in the recipe database. +- test: An optional Boolean argument. When true the function simulates user input. ## Output: - fridgeList: The (adapted) given fridgeList """ -function checkIngredients(fridgeList,ingredientList) +function checkIngredients(fridgeList,ingredientList; test=false) print("Checking if the food in your fridge is found in our database.\n\n") @@ -54,7 +55,14 @@ function checkIngredients(fridgeList,ingredientList) print("[$indexNum] $alternative\n") end print("If you want to take an alternative type its number, else type no.\n") - answer = readline() + if !test + # read wanted alternative number + answer = readline() + else + # simulate user input + answer = string(rand(1:length(alternatives))) + print("The computer typed $answer.") + end if answer != "no" correctInput = false while !correctInput @@ -303,13 +311,24 @@ function SAFindCombo(curSolution, fridgeList, recipeDict, numRecipes, randRecip @assert 0 < Tmin < Tmax "Temperatures should be positive" @assert 0 < r < 1 "cooling rate is between 0 and 1" + + solution = curSolution - obj = fridgeObjective([i for i in values(solution)]) + if isempty(solution) + print("There are no recipes in the database matching your fridge.") + T = Tmin-1 + else + obj = fridgeObjective([i for i in values(solution)]) + T = Tmax + end + tabuList = String[i for i in keys(curSolution)] - # current temperature - T = Tmax while T > Tmin + if isempty(solution) + print("There are no recipes in the database matching your fridge.") + break + end print("T = $T \n") # repeat kT times for i in 1:kT @@ -359,12 +378,13 @@ if not it offers possible alternatives. Next it uses simulated annealing to find ## Optional Inputs: - numRecipes: The max amount of recipes that a combo should contain. - randRecipe: A Boolean `true` or `false` value. When `true`, random recipes are used to find the neighbour in simulated annealing. +- testmode: An optional Boolean argument. When true the function simulates user input. ## Output: - SASolution: A dictionary containing the best found combination of recipes. """ -function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) +function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false, testmode=false) # load the recipe dictionary from the db file @@ -374,10 +394,10 @@ function findBestRecipe(fridgeList, dataPath; numRecipes=3, randRecipe=false) ingredientList = createIngredientDatabase(recipeDict) # check for every food in your fridge if it's in the database. If not check if their are alternatives. - fridgeList = checkIngredients(fridgeList, ingredientList) + fridgeList = checkIngredients(fridgeList, ingredientList, test=testmode) # find the best greedy recipe - greedySolution = GreedyFindCombo(fridgeList, recipeDict, numRecipes) + greedySolution = greedyFindCombo(fridgeList, recipeDict, numRecipes) print("greedySolution = $greedySolution\n") # find the best recipe with SA diff --git a/test/fridgeTest.jl b/test/fridgeTest.jl index 651cbb1d..2344f1f5 100644 --- a/test/fridgeTest.jl +++ b/test/fridgeTest.jl @@ -88,4 +88,10 @@ testDictDB = loadRecipeDBCSV("./testDB.csv") @test keys(testDictDB) == keys(Dict("Belgian Chocolate Mousse" => ["test"], "Belgian Buns" => ["test"])) end + + @testset "findBestRecipe" begin + scrapeRecipe(106543,106555,"./testDB.csv") + # check if the combination of all recipes works + @test length(values(findBestRecipe(testList, "./testDB.csv", numRecipes=2, randRecipe=true, testmode=true))) == 0 + end end \ No newline at end of file diff --git a/test/testDB.csv b/test/testDB.csv new file mode 100644 index 00000000..8af72242 --- /dev/null +++ b/test/testDB.csv @@ -0,0 +1,16 @@ +first,second +Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" +Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" +Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" +Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" +Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" +Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" +Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" +Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" +Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" +Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" +Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" +Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" +Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" +Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" +Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]" From c21a360cbd626388e64fe26a36770a2510f4ba00 Mon Sep 17 00:00:00 2001 From: warvbell Date: Mon, 31 Jan 2022 21:29:35 +0100 Subject: [PATCH 57/57] removed DB file --- test/testDB.csv | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 test/testDB.csv diff --git a/test/testDB.csv b/test/testDB.csv deleted file mode 100644 index 8af72242..00000000 --- a/test/testDB.csv +++ /dev/null @@ -1,16 +0,0 @@ -first,second -Belgian Chocolate Mousse,"Any[""egg"", ""dark chocolate"", ""cream""]" -Belgian Buns,"Any[""margarine"", ""egg"", ""milk"", ""flour"", ""sugar"", ""yeast"", ""raisin""]" -Belgian Spice (Speculaas) Cookies,"Any[""brown sugar"", ""shortening"", ""butter"", ""cream"", ""clove"", ""nutmeg"", ""cinnamon"", ""flour"", ""baking soda"", ""pecan""]" -Belgian White Beer Cookies With Orange Icing,"Any[""beer"", ""honey"", ""butter"", ""sugar"", ""egg"", ""vanilla extract"", ""orange zest"", ""coriander"", ""purpose flour"", ""baking soda"", ""vanilla extract"", ""sugar"", ""orange juice"", ""milk"", ""orange zest""]" -Belgian Christmas Cookies,"Any[""butter"", ""almond extract"", ""dark brown sugar"", ""egg"", ""purpose flour"", ""baking powder"", ""salt"", ""almond"", ""cinnamon"", ""red sugar crystal"", ""green sugar crystal""]" -Tarte Aux Abricots - Glazed French Apricot Tart With Almonds,"Any[""butter"", ""plain flour"", ""lemon"", ""caster sugar"", ""egg"", ""cold water"", ""apricot"", ""brown sugar"", ""almond"", ""range egg"", ""caster sugar"", ""vanilla pod"", ""double cream"", ""apricot jam"", ""icing sugar"", ""edible flower"", ""creme fraiche""]" -Buche De Noel - Yule Log Cake,"Any[""egg"", ""sugar"", ""vanilla"", ""cake flour"", ""butter"", ""confectioner ' sugar"", ""half cream"", ""vanilla"", ""cocoa powder""]" -Brussels Cookies,"Any[""flour"", ""baking soda"", ""cream tartar"", ""butter"", ""sugar"", ""orange extract"", ""vanilla"", ""orange zest"", ""egg white"", ""almond"", ""cooking oat"", ""chocolate"", ""chocolate""]" -Pain D'amandes - Brussels Almond Bread Cookies,"Any[""flour"", ""baking powder"", ""cinnamon"", ""salt"", ""almond"", ""brown sugar"", ""brown sugar"", ""brandy"", ""milk"", ""butter""]" -Black Bottom Caramel Pudding,"Any[""sugar"", ""sugar"", ""heavy cream"", ""milk"", ""cornstarch"", ""egg"", ""vanilla"", ""salt"", ""chocolate"", ""cream"", ""chocolate wafer cookie""]" -Tarte Au Fromage,"Any[""flour"", ""butter"", ""sugar"", ""vanilla sugar"", ""egg yolk"", ""yeast"", ""salt"", ""water"", ""applesauce"", ""white cheese"", ""egg yolk"", ""vanilla sugar"", ""sugar"", ""flour"", ""butter"", ""egg white""]" -Belgian Waffle Cookies,"Any[""butter"", ""sugar"", ""vanilla"", ""salt"", ""egg"", ""flour""]" -Belgian Cinnamon Cookies,"Any[""butter"", ""dark brown sugar"", ""water"", ""egg"", ""honey"", ""self raising flour"", ""salt"", ""cinnamon"", ""almond"", ""milk""]" -Speculoos (Belgian Spice Cookies),"Any[""purpose flour"", ""cinnamon"", ""ginger"", ""nutmeg"", ""allspice"", ""clove"", ""table salt"", ""baking soda"", ""baking powder"", ""butter"", ""white sugar"", ""brown sugar"", ""vanilla extract""]" -Belgian Brownies,"Any[""chocolate"", ""butter"", ""egg"", ""superfine sugar"", ""pastry flour""]"