From 46a2a8ca87dd96b5ab9205bb2524f2978aa8d991 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Thu, 4 Aug 2022 18:41:54 +0100 Subject: [PATCH 01/12] Updating Python venv creation and framework --- .../Compute/Audio/PlayAudio.cs | 44 - .../Compute/Audio/PlayAudio.py | 28 - .../Compute/Audio/RecogniseSpeech.cs | 42 - .../Compute/Audio/RecogniseSpeech.py | 52 - .../Compute/Audio/SynthesiseSpeech.cs | 42 - .../Compute/Audio/SynthesiseSpeech.py | 62 - .../Compute/Audio/__init__ .py | 25 - .../Compute/Charts/Diurnal.cs | 46 - .../Compute/Charts/Diurnal.py | 156 --- .../Compute/Charts/Frequency.cs | 46 - .../Compute/Charts/Frequency.py | 112 -- .../Compute/Charts/Heatmap.cs | 68 -- .../Compute/Charts/Heatmap.py | 134 --- .../Compute/Charts/PlotImage.cs | 50 - .../Compute/Charts/PlotImage.py | 59 - MachineLearning_Engine/Compute/Charts/UTCI.cs | 64 - MachineLearning_Engine/Compute/Charts/UTCI.py | 272 ----- .../Compute/Charts/__init__.py | 27 - .../Compute/Datasets/LoadCsv.cs | 81 -- .../Compute/InstallMachineLearningToolkit.cs | 84 -- MachineLearning_Engine/Compute/Invoke.cs | 74 -- ...ore.cs => MachineLearningPythonToolkit.cs} | 38 +- .../Compute/Preprocessing/MinMaxScaler.cs | 71 -- .../Compute/Preprocessing/MinMaxScaler.py | 46 - .../Preprocessing/PolynomialFeatures.cs | 61 - .../Preprocessing/PolynomialFeatures.py | 38 - .../Compute/Preprocessing/StandardScaler.cs | 71 -- .../Compute/Preprocessing/StandardScaler.py | 46 - .../Compute/Preprocessing/__init__.py | 25 - .../Compute/Structured/Coefficients.cs | 55 - .../Compute/Structured/LinearRegression.cs | 66 - .../Compute/Structured/LinearRegression.py | 56 - .../Compute/Structured/LogisticRegression.cs | 66 - .../Compute/Structured/LogisticRegression.py | 56 - .../Structured/SupportVectorRegression.cs | 58 - .../Structured/SupportVectorRegression.py | 57 - .../Compute/Structured/__init__.py | 25 - MachineLearning_Engine/Compute/Text/Answer.cs | 40 - MachineLearning_Engine/Compute/Text/Answer.py | 45 - .../Compute/Text/SentimentAnalysis.cs | 40 - .../Compute/Text/SentimentAnalysis.py | 38 - .../Compute/Text/Summarise.cs | 40 - .../Compute/Text/Summarise.py | 36 - .../Compute/Text/__init__.py | 25 - .../Compute/Vision/DetectObjects.cs | 40 - .../Compute/Vision/DetectObjects.py | 49 - .../Compute/Vision/DrawDetection.cs | 43 - .../Compute/Vision/DrawDetection.py | 226 ---- .../Compute/Vision/FindContours.cs | 59 - .../Compute/Vision/FindContours.py | 58 - .../Compute/Vision/RecogniseObject.cs | 47 - .../Compute/Vision/RecogniseObject.py | 1058 ----------------- .../Compute/Vision/SemanticSegmentation.cs | 42 - .../Compute/Vision/SemanticSegmentation.py | 62 - .../Compute/Vision/__init__.py | 27 - MachineLearning_Engine/Compute/__init__.py | 21 - MachineLearning_Engine/Convert/FromDType.cs | 59 - MachineLearning_Engine/Convert/ToDType.cs | 59 - MachineLearning_Engine/Convert/ToList.cs | 115 -- MachineLearning_Engine/Convert/ToPython.cs | 144 --- MachineLearning_Engine/Create/Tensor.cs | 52 - MachineLearning_Engine/Extensions/script.py | 1 - .../MachineLearning_Engine.csproj | 108 +- MachineLearning_Engine/Modify/AsType.cs | 53 - MachineLearning_Engine/Python/README.md | 3 + .../Python/requirements.txt | 6 + MachineLearning_Engine/Python/setup.py | 20 + MachineLearning_Engine/Python/src/__init__.py | 20 + .../src/machinelearning_toolkit/__init__.py | 20 + MachineLearning_Engine/Query/DType.cs | 46 - MachineLearning_Engine/Query/GetAttribute.cs | 44 - MachineLearning_Engine/Query/Import.cs | 70 -- MachineLearning_Engine/Query/Shape.cs | 44 - MachineLearning_Engine/Query/Size.cs | 43 - MachineLearning_Engine/Query/ToolkitName.cs | 16 + MachineLearning_Engine/__init__.py | 21 - MachineLearning_Toolkit.sln | 10 +- MachineLearning_oM/IRegressionModel.cs | 37 - MachineLearning_oM/IScaler.cs | 30 - MachineLearning_oM/ITransformer.cs | 30 - MachineLearning_oM/LinearRegression.cs | 51 - MachineLearning_oM/LogisticRegression.cs | 51 - MachineLearning_oM/MachineLearning_oM.csproj | 15 - MachineLearning_oM/MinMaxScaler.cs | 51 - MachineLearning_oM/PolynomialFeatures.cs | 51 - MachineLearning_oM/StandardScaler.cs | 51 - MachineLearning_oM/SupportVectorRegression.cs | 51 - MachineLearning_oM/Tensor.cs | 61 - MachineLearning_oM/Vision/DetectionResults.cs | 44 - MachineLearning_oM/Vision/Image.cs | 53 - 90 files changed, 136 insertions(+), 5793 deletions(-) delete mode 100644 MachineLearning_Engine/Compute/Audio/PlayAudio.cs delete mode 100644 MachineLearning_Engine/Compute/Audio/PlayAudio.py delete mode 100644 MachineLearning_Engine/Compute/Audio/RecogniseSpeech.cs delete mode 100644 MachineLearning_Engine/Compute/Audio/RecogniseSpeech.py delete mode 100644 MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.cs delete mode 100644 MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.py delete mode 100644 MachineLearning_Engine/Compute/Audio/__init__ .py delete mode 100644 MachineLearning_Engine/Compute/Charts/Diurnal.cs delete mode 100644 MachineLearning_Engine/Compute/Charts/Diurnal.py delete mode 100644 MachineLearning_Engine/Compute/Charts/Frequency.cs delete mode 100644 MachineLearning_Engine/Compute/Charts/Frequency.py delete mode 100644 MachineLearning_Engine/Compute/Charts/Heatmap.cs delete mode 100644 MachineLearning_Engine/Compute/Charts/Heatmap.py delete mode 100644 MachineLearning_Engine/Compute/Charts/PlotImage.cs delete mode 100644 MachineLearning_Engine/Compute/Charts/PlotImage.py delete mode 100644 MachineLearning_Engine/Compute/Charts/UTCI.cs delete mode 100644 MachineLearning_Engine/Compute/Charts/UTCI.py delete mode 100644 MachineLearning_Engine/Compute/Charts/__init__.py delete mode 100644 MachineLearning_Engine/Compute/Datasets/LoadCsv.cs delete mode 100644 MachineLearning_Engine/Compute/InstallMachineLearningToolkit.cs delete mode 100644 MachineLearning_Engine/Compute/Invoke.cs rename MachineLearning_Engine/Compute/{Structured/Score.cs => MachineLearningPythonToolkit.cs} (61%) delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.cs delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.py delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.cs delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.py delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/StandardScaler.cs delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/StandardScaler.py delete mode 100644 MachineLearning_Engine/Compute/Preprocessing/__init__.py delete mode 100644 MachineLearning_Engine/Compute/Structured/Coefficients.cs delete mode 100644 MachineLearning_Engine/Compute/Structured/LinearRegression.cs delete mode 100644 MachineLearning_Engine/Compute/Structured/LinearRegression.py delete mode 100644 MachineLearning_Engine/Compute/Structured/LogisticRegression.cs delete mode 100644 MachineLearning_Engine/Compute/Structured/LogisticRegression.py delete mode 100644 MachineLearning_Engine/Compute/Structured/SupportVectorRegression.cs delete mode 100644 MachineLearning_Engine/Compute/Structured/SupportVectorRegression.py delete mode 100644 MachineLearning_Engine/Compute/Structured/__init__.py delete mode 100644 MachineLearning_Engine/Compute/Text/Answer.cs delete mode 100644 MachineLearning_Engine/Compute/Text/Answer.py delete mode 100644 MachineLearning_Engine/Compute/Text/SentimentAnalysis.cs delete mode 100644 MachineLearning_Engine/Compute/Text/SentimentAnalysis.py delete mode 100644 MachineLearning_Engine/Compute/Text/Summarise.cs delete mode 100644 MachineLearning_Engine/Compute/Text/Summarise.py delete mode 100644 MachineLearning_Engine/Compute/Text/__init__.py delete mode 100644 MachineLearning_Engine/Compute/Vision/DetectObjects.cs delete mode 100644 MachineLearning_Engine/Compute/Vision/DetectObjects.py delete mode 100644 MachineLearning_Engine/Compute/Vision/DrawDetection.cs delete mode 100644 MachineLearning_Engine/Compute/Vision/DrawDetection.py delete mode 100644 MachineLearning_Engine/Compute/Vision/FindContours.cs delete mode 100644 MachineLearning_Engine/Compute/Vision/FindContours.py delete mode 100644 MachineLearning_Engine/Compute/Vision/RecogniseObject.cs delete mode 100644 MachineLearning_Engine/Compute/Vision/RecogniseObject.py delete mode 100644 MachineLearning_Engine/Compute/Vision/SemanticSegmentation.cs delete mode 100644 MachineLearning_Engine/Compute/Vision/SemanticSegmentation.py delete mode 100644 MachineLearning_Engine/Compute/Vision/__init__.py delete mode 100644 MachineLearning_Engine/Compute/__init__.py delete mode 100644 MachineLearning_Engine/Convert/FromDType.cs delete mode 100644 MachineLearning_Engine/Convert/ToDType.cs delete mode 100644 MachineLearning_Engine/Convert/ToList.cs delete mode 100644 MachineLearning_Engine/Convert/ToPython.cs delete mode 100644 MachineLearning_Engine/Create/Tensor.cs delete mode 100644 MachineLearning_Engine/Extensions/script.py delete mode 100644 MachineLearning_Engine/Modify/AsType.cs create mode 100644 MachineLearning_Engine/Python/README.md create mode 100644 MachineLearning_Engine/Python/requirements.txt create mode 100644 MachineLearning_Engine/Python/setup.py create mode 100644 MachineLearning_Engine/Python/src/__init__.py create mode 100644 MachineLearning_Engine/Python/src/machinelearning_toolkit/__init__.py delete mode 100644 MachineLearning_Engine/Query/DType.cs delete mode 100644 MachineLearning_Engine/Query/GetAttribute.cs delete mode 100644 MachineLearning_Engine/Query/Import.cs delete mode 100644 MachineLearning_Engine/Query/Shape.cs delete mode 100644 MachineLearning_Engine/Query/Size.cs create mode 100644 MachineLearning_Engine/Query/ToolkitName.cs delete mode 100644 MachineLearning_Engine/__init__.py delete mode 100644 MachineLearning_oM/IRegressionModel.cs delete mode 100644 MachineLearning_oM/IScaler.cs delete mode 100644 MachineLearning_oM/ITransformer.cs delete mode 100644 MachineLearning_oM/LinearRegression.cs delete mode 100644 MachineLearning_oM/LogisticRegression.cs delete mode 100644 MachineLearning_oM/MinMaxScaler.cs delete mode 100644 MachineLearning_oM/PolynomialFeatures.cs delete mode 100644 MachineLearning_oM/StandardScaler.cs delete mode 100644 MachineLearning_oM/SupportVectorRegression.cs delete mode 100644 MachineLearning_oM/Tensor.cs delete mode 100644 MachineLearning_oM/Vision/DetectionResults.cs delete mode 100644 MachineLearning_oM/Vision/Image.cs diff --git a/MachineLearning_Engine/Compute/Audio/PlayAudio.cs b/MachineLearning_Engine/Compute/Audio/PlayAudio.cs deleted file mode 100644 index 31605ee..0000000 --- a/MachineLearning_Engine/Compute/Audio/PlayAudio.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; - -namespace BH.Engine.MachineLearning.Audio -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static void PlayAudio(Tensor audioTensor, int rate = 22050, bool run = false) - { - if (run) - BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "PlayAudio.play_numpy_audio", audioTensor, rate); - return; - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Audio/PlayAudio.py b/MachineLearning_Engine/Compute/Audio/PlayAudio.py deleted file mode 100644 index c5c824e..0000000 --- a/MachineLearning_Engine/Compute/Audio/PlayAudio.py +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import sounddevice as sd - - -def play_numpy_audio(audio_numpy, rate): - sd.play(audio_numpy, samplerate=rate) - return diff --git a/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.cs b/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.cs deleted file mode 100644 index 466b367..0000000 --- a/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; - -namespace BH.Engine.MachineLearning.Audio -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static Tensor RecogniseSpeech(string wavFile = "", bool run = false) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "RecogniseSpeech.infer", wavFile, run)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.py b/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.py deleted file mode 100644 index e6c7f44..0000000 --- a/MachineLearning_Engine/Compute/Audio/RecogniseSpeech.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import sys -import at16k -import at16k.api - - -def infer(wav_file: str, run: bool): - if not run: - return "" - - os.environ['AT16K_RESOURCES_DIR'] = HOME - - # load models if necessary - global SPEECH_RECOGNITION_MODEL - if SPEECH_RECOGNITION_MODEL is None: - _download() - SPEECH_RECOGNITION_MODEL = at16k.api.SpeechToText(os.path.normpath("en_16k")) - - return audio_numpy - - -def _download(): - os.makedirs(HOME, exist_ok=True) - - sys.argv = ['download', 'en_16k'] - exec(open(at16k.download.__file__).read()) - return - -HOME = "C:\\ProgramData\\BHoM\\Extensions\\Python\\models\\audio\\at_16k\\" -SPEECH_RECOGNITION_MODEL = None diff --git a/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.cs b/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.cs deleted file mode 100644 index c7b061c..0000000 --- a/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; - -namespace BH.Engine.MachineLearning.Audio -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static Tensor SynthesiseSpeech(string text, bool gpu = false) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "SynthesiseSpeech.infer", text, gpu)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.py b/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.py deleted file mode 100644 index 1cf7b72..0000000 --- a/MachineLearning_Engine/Compute/Audio/SynthesiseSpeech.py +++ /dev/null @@ -1,62 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import torch -import numpy as np - - -def infer(text: str, gpu: bool): - # check if cuda is avaliable - gpu = gpu and torch.cuda.is_avaliable() - - # accelerate on gpu if possible - device = "cuda" if gpu else "cpu" - - # load models if necessary - global WAVEGLOW - if WAVEGLOW is None: - WAVEGLOW = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_waveglow') - WAVEGLOW = WAVEGLOW.remove_weightnorm(WAVEGLOW) - WAVEGLOW.eval() - - global TACOTRON2 - if TACOTRON2 is None: - TACOTRON2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2') - TACOTRON2.eval() - - WAVEGLOW = WAVEGLOW.to(device) - TACOTRON2 = TACOTRON2.to(device) - - # preprocess text sequence - sequence = np.array(TACOTRON2.text_to_sequence(text, ['english_cleaners']))[None, :] - sequence = torch.as_tensor(sequence, device=device, dtype=torch.int64) - - # compute output - with torch.no_grad(): - _, mel, _, _ = TACOTRON2.infer(sequence) - audio = WAVEGLOW.infer(mel) - audio_numpy = audio[0].data.cpu().numpy() - - return audio_numpy - -TACOTRON2 = None -WAVEGLOW = None diff --git a/MachineLearning_Engine/Compute/Audio/__init__ .py b/MachineLearning_Engine/Compute/Audio/__init__ .py deleted file mode 100644 index 48eb5d9..0000000 --- a/MachineLearning_Engine/Compute/Audio/__init__ .py +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import PlayAudio -from . import SynthesiseSpeech -from . import RecogniseSpeech diff --git a/MachineLearning_Engine/Compute/Charts/Diurnal.cs b/MachineLearning_Engine/Compute/Charts/Diurnal.cs deleted file mode 100644 index 90fc1cf..0000000 --- a/MachineLearning_Engine/Compute/Charts/Diurnal.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using System.Collections.Generic; -using BH.oM.Reflection.Attributes; - -namespace BH.Engine.MachineLearning.Charts -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string PlotDiurnal(List annualValues, string savePath, string grouping = "Daily", List months = null, string title = null, string unit = null, string color = "black", string toneColor = "black", bool transparency = false, bool run = false) - { - if (!run) - return null; - - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "Diurnal.diurnal", annualValues, savePath, grouping, months, title, unit, color, toneColor, transparency).ToString(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Charts/Diurnal.py b/MachineLearning_Engine/Compute/Charts/Diurnal.py deleted file mode 100644 index c36ef74..0000000 --- a/MachineLearning_Engine/Compute/Charts/Diurnal.py +++ /dev/null @@ -1,156 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import numpy as np -import pandas as pd -import matplotlib -matplotlib.use("agg") -import matplotlib.pyplot as plt -from matplotlib.ticker import MaxNLocator - -ANNUAL_DATETIME = pd.date_range(start="2018-01-01 00:30:00", freq="60T", periods=8760, closed="left") - - -def diurnal(annual_values: np.ndarray, save_path: str, grouping: str="Daily", months: np.ndarray=range(1, 13), title: str=None, unit: str=None, color: str="black", tone_color: str="black", transparency=False): - """ Create a histogram with summary table for the data passed - - Parameters - ---------- - annual_values : np.ndarray - List of values to bin. - save_path : str - The full path where the plot will be saved. - grouping : str - The method of grouping the aggregate diurnal values. Choose from ["Daily", "Weekly", "Monthly"]. - months : np.ndarray - A list of integers denoting the months to include in the summary - title : str or None - Adds a title to the plot. - unit : str or None - Adds a unit string to the y-axis of the plot. - color : str - A Matplotlib valid color name. An up-to-date list of values is available from https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/colors.py. - tone_color : str or None - Text and border colours throughout the plot. - transparency : bool - Sets transparency of saved plot. - - Returns - ------- - imagePath : str - Path to the saved image - - """ - - # Run input data checks - assert len(annual_values) == 8760, \ - "Number of hourly values passed ({}) does not equal 8760".format(len(annual_values)) - - assert ((min(months) >= 1) & (max(months) <= 12)), \ - "Month integers must be between 1 and 12 (inclusive)" - - # Convert passed values into a pd.Series object (and filter to remove unwanted months) - series = pd.Series(annual_values, index=ANNUAL_DATETIME)[ANNUAL_DATETIME.month.isin(months)] - - if grouping == "Monthly": - assert (len(months) == 12), \ - "Month filtering is not possible when grouping = \"Monthly\"" - - assert os.path.exists(os.path.dirname(save_path)), \ - "\"{}\" does not exist".format(os.path.abspath(os.path.dirname(save_path))) - - # Define grouping methodologies - groupings = { - "Daily": { - "grp": series.index.hour, - "periods": 24, - "xlabels": ["{0:02d}:00".format(i) for i in range(24)], - "xticks": np.arange(0, 24, 1), - "skip_n": [0, 1] - }, - "Weekly": { - "grp": [series.index.dayofweek, series.index.hour], - "periods": 24 * 7, - "xlabels": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], - "xticks": np.arange(0, 24 * 7, 24), - "skip_n": [0, 7] - }, - "Monthly": { - "grp": [series.index.month, series.index.hour], - "periods": 24 * 12, - "xlabels": ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - "xticks": np.arange(0, 24 * 12, 24), - "skip_n": [0, 12] - } - } - - assert grouping in groupings.keys(), \ - "\"{}\" not available as a filter for grouping annual hourly data. Choose from {}".format(grouping, list(groupings.keys())) - - _grouping = series.groupby(groupings[grouping]["grp"]) - _min = _grouping.min().reset_index(drop=True) - _mean = _grouping.mean().reset_index(drop=True) - _max = _grouping.max().reset_index(drop=True) - # TODO: Add end value to each day/week/month to fill gaps in Series - - # Instantiate plot - fig, ax = plt.subplots(1, 1, figsize=(15, 4)) - - # Plot aggregate - [ax.plot(_mean.iloc[i:i + 24], color=color, lw=2, label='Average') for i in np.arange(0, groupings[grouping]["periods"])[::24]] - [ax.fill_between(np.arange(i, i + 24), _min.iloc[i:i + 24], _max.iloc[i:i + 24], color=color, alpha=0.2, - label='Range') for i in np.arange(0, groupings[grouping]["periods"])[::24]] - ax.set_ylabel(unit, labelpad=2, color=tone_color) - ax.yaxis.set_major_locator(MaxNLocator(7)) - - # Format plot area - [ax.spines[spine].set_visible(False) for spine in ['top', 'right']] - [ax.spines[j].set_color(tone_color) for j in ['bottom', 'left']] - ax.set_xlim([0, groupings[grouping]["periods"]]) - ax.xaxis.set_ticks(groupings[grouping]["xticks"]) - ax.set_xticklabels(groupings[grouping]["xlabels"], ha='left', color=tone_color) - plt.setp(ax.get_yticklabels(), color=tone_color) - ax.grid(b=True, which='major', axis='both', c=tone_color, ls='--', lw=1, alpha=0.3) - ax.tick_params(length=0, labelleft=True, labelright=False, labeltop=False, labelbottom=True, color=tone_color) - - # Legend - handles, labels = ax.get_legend_handles_labels() - lgd = ax.legend(bbox_to_anchor=(0.5, -0.2), loc=8, ncol=3, borderaxespad=0., frameon=False, - handles=[handles[groupings[grouping]["skip_n"][0]], handles[groupings[grouping]["skip_n"][1]]], labels=[labels[groupings[grouping]["skip_n"][0]], labels[groupings[grouping]["skip_n"][1]]]) - lgd.get_frame().set_facecolor((1, 1, 1, 0)) - [plt.setp(text, color=tone_color) for text in lgd.get_texts()] - - # Add a title - if title is None: - plt_title = "{0:} diurnal profile".format(grouping) - else: - plt_title = "{0:}\n{1:} diurnal profile".format(title, grouping) - title = plt.suptitle(plt_title, color=tone_color, ha="left", va="bottom", x=0, y=1.01, transform=ax.transAxes) - - # Tidy plot - plt.tight_layout() - - # Save figure - fig.savefig(save_path, bbox_inches="tight", dpi=300, transparent=False) - - return save_path diff --git a/MachineLearning_Engine/Compute/Charts/Frequency.cs b/MachineLearning_Engine/Compute/Charts/Frequency.cs deleted file mode 100644 index ed654c9..0000000 --- a/MachineLearning_Engine/Compute/Charts/Frequency.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using System.Collections.Generic; -using BH.oM.Reflection.Attributes; - -namespace BH.Engine.MachineLearning.Charts -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string PlotFrequency(List values, string savePath, string title = null, string unit = null, List vRange = null, int bins = 10, string color = "black", string toneColor = "black", bool transparency = false, bool run = false) - { - if (!run) - return null; - - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "Frequency.frequency", values, savePath, title, unit, vRange, bins, color, toneColor, transparency).ToString(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Charts/Frequency.py b/MachineLearning_Engine/Compute/Charts/Frequency.py deleted file mode 100644 index 7cca303..0000000 --- a/MachineLearning_Engine/Compute/Charts/Frequency.py +++ /dev/null @@ -1,112 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import numpy as np -import pandas as pd -import matplotlib -matplotlib.use("agg") -import matplotlib.pyplot as plt - - -def frequency(values: np.ndarray, save_path: str, title: str=None, unit: str=None, vrange: np.ndarray=None, bins: int=10, color: str="black", tone_color: str="black", transparency=False): - """ Create a histogram with summary table for the data passed - - Parameters - ---------- - values : np.ndarray - List of values to bin. - save_path : str - The full path where the plot will be saved. - title : str or None - Adds a title to the plot. - unit : str or None - Adds a unit string to the x-axis of the histogram. - vrange : np.ndarray or None - Sets the range of values within which the bins will be distributed. - bins : int - Number of bins into which the data should be sorted - color : str - A Matplotlib valid color name. An up-to-date list of values is available from https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/colors.py. - tone_color : str or None - Text and border colours throughout the plot. - transparency : bool - Sets transparency of saved plot. - - Returns - ------- - imagePath : str - Path to the saved image - - """ - - assert os.path.exists(os.path.dirname(save_path)), \ - "\"{}\" does not exist".format(os.path.abspath(os.path.dirname(save_path))) - - # Convert passed values into a pd.Series object - series = pd.Series(values) - - # Instantiate the plot and add sub-plots - fig, ax = plt.subplots(1, 1, figsize=(15, 4)) - - # Plot histogram - if vrange is None: - vrange = [series.min(), series.max()] - ax.hist(series, bins=np.linspace(vrange[0], vrange[1], bins), color=color, alpha=0.9) - - # Format histogram - ax.grid(b=True, which='major', color="k", linestyle=':', alpha=0.5, zorder=3) - [ax.spines[spine].set_visible(False) for spine in ['top', 'right']] - [ax.spines[j].set_color(tone_color) for j in ['bottom', 'left']] - ax.tick_params(length=0, labelleft=True, labelright=False, labeltop=False, labelbottom=True, color=tone_color) - ax.set_ylabel("Hours", color=tone_color) - if vrange is None: - ax.set_xlim(vrange) - if unit is not None: - ax.set_xlabel(unit, color=tone_color) - plt.setp(ax.get_xticklabels(), ha='left', color=tone_color) - plt.setp(ax.get_yticklabels(), color=tone_color) - - if title is not None: - ax.set_title(title, color=tone_color, ha="left", va="bottom", x=0, y=1.01, transform=ax.transAxes) - - # Plot summary statistics - _vals = np.round(series.describe().values, 2) - _ids = ["Count", "Mean", "Std", "Min", "25%", "50%", "75%", "Max"] - summary_text = "" - max_id_length = max([len(i) for i in _ids]) - max_val_length = max([len(str(i)) for i in _vals]) - string_length = max_id_length + max_val_length - for i, j in list(zip(*[_ids, _vals])): - _id_length = len(i) - _val_length = len(str(j)) - space_length = string_length - _id_length - _val_length - summary_text += "{0:}: {1:}{2:}\n".format(i, " " * space_length, j) - txt = ax.text(1.01, 1, summary_text, fontsize=12, color=tone_color, horizontalalignment='left', verticalalignment='top', transform=ax.transAxes, **{'fontname':'Courier New'}) - - # Tidy plot - plt.tight_layout() - - # Save figure - fig.savefig(save_path, bbox_inches="tight", bbox_extra_artists=(txt,), dpi=300, transparent=transparency) - - return save_path diff --git a/MachineLearning_Engine/Compute/Charts/Heatmap.cs b/MachineLearning_Engine/Compute/Charts/Heatmap.cs deleted file mode 100644 index 325e042..0000000 --- a/MachineLearning_Engine/Compute/Charts/Heatmap.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using System.Collections.Generic; -using BH.oM.Reflection.Attributes; - -namespace BH.Engine.MachineLearning.Charts -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string PlotHeatmap( - List annualValues, - string savePath, - string title = null, - string unit = null, - List vRange = null, - string cmap = "viridis", - string toneColor = "black", - bool invertY = true, - bool transparency = false, - bool run = false - ) - { - if (!run) - return null; - - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, - "Heatmap.heatmap", - annualValues, - savePath, - title, - unit, - vRange, - cmap, - toneColor, - invertY, - transparency - ).ToString(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Charts/Heatmap.py b/MachineLearning_Engine/Compute/Charts/Heatmap.py deleted file mode 100644 index ef264ea..0000000 --- a/MachineLearning_Engine/Compute/Charts/Heatmap.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import numpy as np -import pandas as pd -import matplotlib -matplotlib.use("agg") -import matplotlib.pyplot as plt -from matplotlib.dates import date2num, DateFormatter - -ANNUAL_DATETIME = pd.date_range(start="2018-01-01 00:30:00", freq="60T", periods=8760, closed="left") - - -def heatmap( - annual_values: np.ndarray, - save_path: str, - title: str = None, - unit: str = None, - vrange: np.ndarray = None, - cmap: str = 'viridis', - tone_color: str = "black", - invert_y: bool = False, - transparency: bool = False - ): - """ Generate a heatmap from a set of annual hourly values - - Parameters - ---------- - annual_values : np.ndarray - List of 8760 annual hourly values. - save_path : str - The full path where the plot will be saved. - title : str or None - Adds a title to the plot. - unit : str or None - Adds a unit string to the color-bar associated with the heatmap. - vrange : np.ndarray or None - Sets the range of values within which the color-bar will be applied. - cmap : str or None - A Matplotlib valid colormap name. An up-to-date list of values is available from https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/_color_data.py. - tone_color : str or None - Text and border colours throughout the plot. - invert_y : bool - Reverse the y-axis so that 0-24 hours runs from top to bottom. - transparency : bool - Sets transparency of saved plot. - - Returns - ------- - imagePath : str - Path to the saved image - """ - - # Run input data checks - assert len(annual_values) == 8760, \ - "Number of hourly values passed ({}) does not equal 8760".format(len(annual_values)) - - assert os.path.exists(os.path.dirname(save_path)), \ - "\"{}\" does not exist".format(os.path.abspath(os.path.dirname(save_path))) - - # Create DataFrame from passed values - df = pd.DataFrame(data=annual_values, index=ANNUAL_DATETIME, columns=[title]) - - # Reshape data into time/day matrix - annual_matrix = df.pivot_table(columns=df.index.date, index=df.index.time).values[::-1] - - # Instantiate figure - fig, ax = plt.subplots(1, 1, figsize=(15, 5)) - - # Plot data - heatmap = ax.imshow( - annual_matrix, - extent=[date2num(df.index.min()), date2num(df.index.max()), 726449, 726450], - aspect='auto', - cmap=cmap, - interpolation='none', - vmin=vrange[0] if vrange is not None else None, - vmax=vrange[-1] if vrange is not None else None, - ) - - # Axis formatting - ax.xaxis_date() - ax.xaxis.set_major_formatter(DateFormatter('%b')) - ax.yaxis_date() - ax.yaxis.set_major_formatter(DateFormatter('%H:%M')) - if invert_y: - ax.invert_yaxis() - ax.tick_params(labelleft=True, labelright=True, labelbottom=True, color=tone_color) - plt.setp(ax.get_xticklabels(), ha='left', color=tone_color) - plt.setp(ax.get_yticklabels(), color=tone_color) - - # Spine formatting - [ax.spines[spine].set_visible(False) for spine in ['top', 'bottom', 'left', 'right']] - - # Grid formatting - ax.grid(b=True, which='major', color='white', linestyle=':', alpha=1) - - # Color-bar formatting - cb = fig.colorbar(heatmap, orientation='horizontal', drawedges=False, fraction=0.05, aspect=100, pad=0.075) - plt.setp(plt.getp(cb.ax.axes, 'xticklabels'), color=tone_color) - cb.set_label(unit, color=tone_color) - cb.outline.set_visible(False) - - # Add title if provided - if title is not None: - plt.title(title, color=tone_color, ha="left", va="bottom", x=0, y=1.01, transform=ax.transAxes) - - # Tidy plot - plt.tight_layout() - - # Save figure - fig.savefig(save_path, bbox_inches="tight", dpi=300, transparent=transparency) - - return save_path diff --git a/MachineLearning_Engine/Compute/Charts/PlotImage.cs b/MachineLearning_Engine/Compute/Charts/PlotImage.cs deleted file mode 100644 index c89321c..0000000 --- a/MachineLearning_Engine/Compute/Charts/PlotImage.cs +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.MachineLearning.Vision; - -namespace BH.Engine.MachineLearning.Charts -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static object PlotImage(Image image, int height, int width, bool grayscale = false) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "PlotImage.plot_pil_image", image, height, width, grayscale); - } - - /*************************************/ - - public static object PlotImage(Tensor tensor, int height, int width, bool grayscale = false) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "PlotImage.plot_tensor_image", tensor, height, width, grayscale); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Charts/PlotImage.py b/MachineLearning_Engine/Compute/Charts/PlotImage.py deleted file mode 100644 index 096688a..0000000 --- a/MachineLearning_Engine/Compute/Charts/PlotImage.py +++ /dev/null @@ -1,59 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import PIL -import torch -import torchvision -import matplotlib.pyplot as plt -import os -import subprocess - - -def plot_pil_image(image: PIL.Image, height: int, width: int, grayscale: bool): - fig = plt.figure(figsize=(height, width)) - - if grayscale: - cmap = "gray" - else: - cmap = None - - plt.imshow(image, cmap=cmap) - plt.tight_layout() - - home = os.path.abspath("C:\\ProgramData\\BHoM\\Extensions\\Python\\temp\\") - if not os.path.exists(home): - os.makedirs(home, exist_ok=True) - - path = os.path.join(home, "current_plot.png") - if os.path.exists(path): - os.remove(path) - - plt.savefig(path) - - subprocess.run(["explorer", path]) - return - - -def plot_tensor_image(image: torch.Tensor, height: int, width: int, grayscale: bool): - image = image.float() - pil_image = torchvision.transforms.functional.to_pil_image(image.cpu()) - return plot_pil_image(pil_image, height, width, grayscale) diff --git a/MachineLearning_Engine/Compute/Charts/UTCI.cs b/MachineLearning_Engine/Compute/Charts/UTCI.cs deleted file mode 100644 index a29616b..0000000 --- a/MachineLearning_Engine/Compute/Charts/UTCI.cs +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using System.Collections.Generic; -using BH.oM.Reflection.Attributes; - -namespace BH.Engine.MachineLearning.Charts -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string PlotUTCI( - List annualValues, - string savePath, - bool detailed = false, - string title = "", - string toneColor = "black", - bool invertY = true, - bool transparency = false, - bool run = false - ) - { - if (!run) - return null; - - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, - "UTCI.utci", - annualValues, - savePath, - detailed, - title, - toneColor, - invertY, - transparency - ).ToString(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Charts/UTCI.py b/MachineLearning_Engine/Compute/Charts/UTCI.py deleted file mode 100644 index a9d54bc..0000000 --- a/MachineLearning_Engine/Compute/Charts/UTCI.py +++ /dev/null @@ -1,272 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import numpy as np -import pandas as pd -import matplotlib -matplotlib.use("agg") -import matplotlib.pyplot as plt -from matplotlib.colors import ListedColormap, BoundaryNorm -from matplotlib.dates import date2num, DateFormatter - -ANNUAL_DATETIME = pd.date_range(start="2018-01-01 00:30:00", freq="60T", periods=8760, closed="left") - - -def utci( - annual_values: np.ndarray, - save_path: str, - detailed: bool = False, - title: str = None, - tone_color: str = "black", - invert_y: bool = False, - transparency: bool = False - ): - """ Generate a UTCI heatmap from a set of annual hourly values - - Parameters - ---------- - annual_values : np.ndarray - List of 8760 annual hourly values. - save_path : str - The full path where the plot will be saved. - detailed : bool - Set to True to include monthly stacked charts with proportion of time comfortable. - title : str or None - Adds a title to the plot. - tone_color : str or None - Text and border colours throughout the plot. - invert_y : bool - Reverse the y-axis so that 0-24 hours runs from top to bottom. - transparency : bool - Sets transparency of saved plot. - - Returns - ------- - imagePath : str - Path to the saved image - """ - - # Run input data checks - assert len(annual_values) == 8760, \ - "Number of hourly values passed ({}) does not equal 8760".format(len(annual_values)) - - assert os.path.exists(os.path.dirname(save_path)), \ - "\"{}\" does not exist".format(os.path.abspath(os.path.dirname(save_path))) - - # Create DataFrame from passed values - df = pd.DataFrame(data=annual_values, index=ANNUAL_DATETIME, columns=[title]) - - # Reshape data into time/day matrix for heatmap plotting - annual_matrix = df.pivot_table(columns=df.index.date, index=df.index.time).values[::-1] - - # Create UTCI colormap - utci_cmap = ListedColormap(['#0D104B', '#262972', '#3452A4', '#3C65AF', '#37BCED', '#2EB349', '#F38322', '#C31F25', '#7F1416', '#580002']) - utci_cmap_bounds = [-100, -40, -27, -13, 0, 9, 26, 32, 38, 46, 100] - utci_cmap_norm = BoundaryNorm(utci_cmap_bounds, utci_cmap.N) - - bounds = np.arange(-41, 48, 1) - norm = BoundaryNorm(bounds, max(len(bounds), utci_cmap.N)) - - if not detailed: - # Instantiate figure - fig, ax = plt.subplots(1, 1, figsize=(15, 5)) - - # Plot data - heatmap = ax.imshow( - annual_matrix, - extent=[date2num(df.index.min()), date2num(df.index.max()), 726449, 726450], - aspect='auto', - cmap=utci_cmap, - interpolation='none', - vmin=-40, - vmax=46, - norm=utci_cmap_norm - ) - - # Axis formatting - ax.xaxis_date() - ax.xaxis.set_major_formatter(DateFormatter('%b')) - ax.yaxis_date() - ax.yaxis.set_major_formatter(DateFormatter('%H:%M')) - if invert_y: - ax.invert_yaxis() - ax.tick_params(length=0, labelleft=True, labelright=True, labeltop=False, labelbottom=True, color=tone_color) - plt.setp(ax.get_xticklabels(), ha='left', color=tone_color) - plt.setp(ax.get_yticklabels(), color=tone_color) - - # Spine formatting - [ax.spines[spine].set_visible(False) for spine in ['top', 'bottom', 'left', 'right']] - - # Grid formatting - ax.grid(b=True, which='major', color='white', linestyle=':', alpha=1) - - # Add colorbar legend and text descriptors for comfort bands - # cb = fig.colorbar(heatmap, orientation='horizontal', drawedges=False, fraction=0.05, aspect=100, pad=0.075) - cb = fig.colorbar(heatmap, cmap=utci_cmap, norm=norm, boundaries=bounds, orientation='horizontal', drawedges=False, fraction=0.05, aspect=100, pad=0.15, extend='both', ticks=[-40, -27, -13, 0, 9, 26, 32, 38, 46]) - plt.setp(plt.getp(cb.ax.axes, 'xticklabels'), color=tone_color) - cb.set_label("°C", color=tone_color) - cb.outline.set_visible(False) - y_move = -0.135 - ax.text(0, y_move, 'Extreme\ncold stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(-27 + (-40 - -27) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Very strong\ncold stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(-13 + (-27 - -13) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Strong\ncold stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(0 + (-13 - 0) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Moderate\ncold stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(0 + (9 - 0) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Slight\ncold stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(9 + (26 - 9) / 2, [-44.319, 50.319], [0, 1]), y_move, 'No thermal stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(26 + (32 - 26) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Moderate\nheat stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(32 + (38 - 32) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Strong\nheat stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(np.interp(38 + (46 - 38) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Very strong\nheat stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - ax.text(1, y_move, 'Extreme\nheat stress', ha='center', va='center', transform=ax.transAxes, color=tone_color, fontsize='small') - - # Add title if provided - if title is None: - plt_title = "Universal Thermal Climate Index" - else: - plt_title = "{0:}\nUniversal Thermal Climate Index".format(title) - ti = plt.title(plt_title, color=tone_color, ha="left", va="bottom", x=0, y=1.01, transform=ax.transAxes) - - else: - fig = plt.figure(figsize=(15, 6), constrained_layout=True) - spec = fig.add_gridspec(ncols=1, nrows=2, width_ratios=[1], height_ratios=[2, 1], hspace=0.1) - - hmap = fig.add_subplot(spec[0, 0]) - hbar = fig.add_subplot(spec[1, 0]) - - # Plot heatmap - heatmap = hmap.imshow(pd.pivot_table(df, index=df.index.time, columns=df.index.date, - values=df.columns[0]).values[::-1], norm=utci_cmap_norm, - extent=[date2num(df.index.min()), date2num(df.index.max()), 726449, - 726450], - aspect='auto', cmap=utci_cmap, interpolation='none', vmin=-40, vmax=46) - hmap.xaxis_date() - hmap.xaxis.set_major_formatter(DateFormatter('%b')) - hmap.yaxis_date() - hmap.yaxis.set_major_formatter(DateFormatter('%H:%M')) - if invert_y: - hmap.invert_yaxis() - hmap.tick_params(length=0, labelleft=True, labelright=True, labeltop=False, labelbottom=True, color=tone_color) - plt.setp(hmap.get_xticklabels(), ha='left', color=tone_color) - plt.setp(hmap.get_yticklabels(), color=tone_color) - for spine in ['top', 'bottom', 'left', 'right']: - hmap.spines[spine].set_visible(False) - hmap.spines[spine].set_color(tone_color) - hmap.grid(b=True, which='major', color="white", linestyle=':', alpha=1) - - # Add colorbar legend and text descriptors for comfort bands - cb = fig.colorbar(heatmap, cmap=utci_cmap, norm=norm, boundaries=bounds, - orientation='horizontal', drawedges=False, fraction=0.01, aspect=50, - pad=-0.0, extend='both', ticks=[-40, -27, -13, 0, 9, 26, 32, 38, 46]) - plt.setp(plt.getp(cb.ax.axes, 'xticklabels'), color=tone_color) - cb.outline.set_visible(False) - cb.set_label("°C", color=tone_color) - - y_move = -0.4 - hbar.text(0, y_move, 'Extreme\ncold stress', ha='center', va='center', transform=hbar.transAxes, - color=tone_color, - fontsize='small') - hbar.text(np.interp(-27 + (-40 - -27) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Very strong\ncold stress', - ha='center', va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(-13 + (-27 - -13) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Strong\ncold stress', - ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(0 + (-13 - 0) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Moderate\ncold stress', ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(0 + (9 - 0) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Slight\ncold stress', ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(9 + (26 - 9) / 2, [-44.319, 50.319], [0, 1]), y_move, 'No thermal stress', ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(26 + (32 - 26) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Moderate\nheat stress', - ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(32 + (38 - 32) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Strong\nheat stress', ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(np.interp(38 + (46 - 38) / 2, [-44.319, 50.319], [0, 1]), y_move, 'Very strong\nheat stress', - ha='center', - va='center', transform=hbar.transAxes, color=tone_color, fontsize='small') - hbar.text(1, y_move, 'Extreme\nheat stress', ha='center', va='center', transform=hbar.transAxes, - color=tone_color, - fontsize='small') - - # Add stacked plot - bins = [-100, -40, -27, -13, 0, 9, 26, 32, 38, 46, 100] - tags = ["Extreme cold stress", "Very strong cold stress", "Strong cold stress", "Moderate cold stress", - "Slight cold stress", "No thermal stress", "Moderate heat stress", "Strong heat stress", - "Very strong heat stress", "Extreme heat stress"] - months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - - clrs = utci_cmap.colors - - adf = pd.DataFrame() - for mnth_n, mnth in enumerate(months): - # Filter the series to return only the month - a = df[df.index.month == mnth_n + 1].dropna().values - a = pd.Series(index=tags, name=mnth, - data=[((a > i) & (a <= j)).sum() / len(a) for n, (i, j) in - enumerate(zip(bins[:-1], bins[1:]))]) - adf = pd.concat([adf, a], axis=1) - adf = adf.T[tags] - adf.plot(kind="bar", ax=hbar, stacked=True, color=clrs, width=1, legend=False) - hbar.set_xlim(-0.5, 11.5) - # - # # Major ticks - hbar.set_xticks(np.arange(-0.5, 11, 1)) - - # Labels for major ticks - hbar.set_xticklabels(months) - - plt.setp(hbar.get_xticklabels(), ha='center', rotation=0, color=tone_color) - plt.setp(hbar.get_xticklabels(), ha='left', color=tone_color) - plt.setp(hbar.get_yticklabels(), color=tone_color) - for spine in ['top', 'right']: - hbar.spines[spine].set_visible(False) - for spine in ['bottom', 'left']: - hbar.spines[spine].set_color(tone_color) - hbar.grid(b=True, which='major', color="white", linestyle=':', alpha=1) - hbar.set_yticklabels(['{:,.0%}'.format(x) for x in hbar.get_yticks()]) - - # Add header percentages for bar plot - cold_percentages = adf.iloc[:, :5].sum(axis=1).values - comfortable_percentages = adf.iloc[:, 5] - hot_percentages = adf.iloc[:, 6:].sum(axis=1).values - for n, (i, j, k) in enumerate(zip(*[cold_percentages, comfortable_percentages, hot_percentages])): - hbar.text(n, 1.02, "{0:0.1f}%".format(i * 100), va="bottom", ha="center", color="#3C65AF", fontsize="small") - hbar.text(n, 1.02, "{0:0.1f}%\n".format(j * 100), va="bottom", ha="center", color="#2EB349", - fontsize="small") - hbar.text(n, 1.02, "{0:0.1f}%\n\n".format(k * 100), va="bottom", ha="center", color="#C31F25", - fontsize="small") - hbar.set_ylim(0, 1) - - # Add title if provided - if title is None: - plt_title = "Universal Thermal Climate Index" - else: - plt_title = "{0:}\nUniversal Thermal Climate Index".format(title) - ti = hmap.set_title(plt_title, color=tone_color, ha="left", va="bottom", x=0, y=1.01, transform=hmap.transAxes) - - # Tidy figure - plt.tight_layout() - - # Save figure - fig.savefig(save_path, bbox_inches="tight", bbox_extra_artists=[ti,], dpi=300, transparent=transparency) - - return save_path diff --git a/MachineLearning_Engine/Compute/Charts/__init__.py b/MachineLearning_Engine/Compute/Charts/__init__.py deleted file mode 100644 index ec85768..0000000 --- a/MachineLearning_Engine/Compute/Charts/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import Diurnal -from . import UTCI -from . import Frequency -from . import Heatmap -from . import PlotImage \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Datasets/LoadCsv.cs b/MachineLearning_Engine/Compute/Datasets/LoadCsv.cs deleted file mode 100644 index b146165..0000000 --- a/MachineLearning_Engine/Compute/Datasets/LoadCsv.cs +++ /dev/null @@ -1,81 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.MachineLearning; -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using System; -using System.IO; -using System.Linq; -using System.Collections.Generic; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Datasets -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Reads a csv file and loads it into a Tensor primitive.")] - [Input("path", "The path to the csv file. If using a relative path, the root will be C:/ProgramData/BHoM")] - [Input("separator", "The separator character of the csv, e,g, a tsv. Use \\t for tabs.")] - [Input("hasHeaders", "True if the first line of the csv is a headers line, false otherwise.")] - [MultiOutput(0, "headers", "A list of headers as string if headers are present in the csv. An empty list otherswise.")] - [MultiOutput(1, "tensor", "A 2D tensor with dimensions (numberOfRow, numberOfColumns)")] - public static Output, Tensor> LoadCsv(string path, string separator = ",", bool hasHeaders = true) - { - if (!Path.IsPathRooted(path)) - path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "BHoM", path); - - List headers = new List(); - if (!File.Exists(path)) - { - Engine.Reflection.Compute.RecordError((new FileNotFoundException("", path)).Message); - return Engine.Reflection.Create.Output, Tensor>(headers, null); - } - - char sep = separator.ToCharArray().First(); - using (StreamReader reader = new StreamReader(path)) - { - List matrix = new List(); - // strip headers - if (hasHeaders) - headers = reader.ReadLine().Split(sep).ToList(); - - while (!reader.EndOfStream) - { - string line = reader.ReadLine(); - string[] values = line.Split(sep); - matrix.Add(values); - } - return Engine.Reflection.Create.Output(headers, Create.Tensor(matrix)); - } - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/InstallMachineLearningToolkit.cs b/MachineLearning_Engine/Compute/InstallMachineLearningToolkit.cs deleted file mode 100644 index 02ad09f..0000000 --- a/MachineLearning_Engine/Compute/InstallMachineLearningToolkit.cs +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; - -namespace BH.Engine.MachineLearning.Base -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Install the python bindings of the Machine Learning Toolkit. This includes standard machine learning packages \n" + - "as the BHoM methods developed in python. Note that this depends on the Python_Toolkit.")] - [Input("run", "Starts the installation of the toolkit if true. Stays idle otherwise.")] - [Input("force", "If the toolkit is already installed it forces a reinstall of all the packages. It does not force a reinstall of Python.")] - [MultiOutput(0, "success", "True if installation is successful, false otherwise.")] - [MultiOutput(1, "packages", "The list of succesfully installed packages")] - public static Output> InstallMachineLearningToolkit(bool run = false, bool force = false) - { - bool success = false; - List installedPackages = new List(); - - if (!run) - return new Output> { Item1 = success, Item2 = installedPackages }; - - // install the python toolkit if necessary - if (!BH.Engine.Python.Query.IsPythonInstalled()) - BH.Engine.Python.Compute.InstallPythonToolkit(run, force); - - // the requirements.txt file is copied to the python home in the postbuil events - we only pick it up now at runtime to install the toolkit lazily - string requirementsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "BHoM", "Extensions", "Python", "src", "requirements.txt"); - - // install from requirements.txt file - Console.WriteLine("Installing requiremented packages..."); - Python.Compute.PipInstall($"-r {requirementsPath} -f https://download.pytorch.org/whl/torch_stable.html"); - - // check if installed correctly - string[] packages = File.ReadAllLines(requirementsPath); - installedPackages = packages.Where(x => Python.Query.IsModuleInstalled(x)).ToList(); - - // install pyBHoM - Console.WriteLine("Installing MachineLearning_Toolkit..."); - string module = "MachineLearning_Toolkit"; - string mlPath = Path.Combine(Python.Query.EmbeddedPythonHome(), "src", module); - Engine.Python.Compute.PipInstall($"-e {mlPath}", force: force); - if (Python.Query.IsModuleInstalled(module)) - installedPackages.Add(module); - - success = true; - return new Output>() { Item1 = success, Item2 = installedPackages }; - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Invoke.cs b/MachineLearning_Engine/Compute/Invoke.cs deleted file mode 100644 index d7d9d37..0000000 --- a/MachineLearning_Engine/Compute/Invoke.cs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using Python.Runtime; -using System.Collections.Generic; -using System.Linq; - -namespace BH.Engine.MachineLearning.Base -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static PyObject Invoke(string nameSpace, string method, params object[] args) - { - PyObject mlComputeModule = Query.Import("MachineLearning_Engine.Compute." + nameSpace.Split('.').Last()); - - PyObject[] pyargs = new PyObject[args.Length]; - for (int i = 0; i < args.Length; i++) - pyargs[i] = Engine.MachineLearning.Convert.IToPython(args[i]); - - return Python.Compute.Invoke(mlComputeModule, method, pyargs, null); - } - - /*************************************/ - - public static PyObject Invoke(string nameSpace, string method, Dictionary kwargs) - { - PyObject mlComputeModule = Query.Import("MachineLearning_Engine.Compute." + nameSpace.Split('.').Last()); - return BH.Engine.Python.Compute.Invoke(mlComputeModule, method, null, kwargs); - } - - /***************************************************/ - - public static PyObject InvokeNumpy(string method, IEnumerable args = null, Dictionary kwargs = null) - { - PyObject numpyModule = Query.Import("numpy"); - return BH.Engine.Python.Compute.Invoke(numpyModule, method, args, kwargs); - } - - /***************************************************/ - - public static PyObject InvokeNumpy(string method, params object[] args) - { - PyObject numpyModule = Query.Import("numpy"); - return BH.Engine.Python.Compute.Invoke(numpyModule, method, args, null); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Structured/Score.cs b/MachineLearning_Engine/Compute/MachineLearningPythonToolkit.cs similarity index 61% rename from MachineLearning_Engine/Compute/Structured/Score.cs rename to MachineLearning_Engine/Compute/MachineLearningPythonToolkit.cs index b7f9e27..1f05d75 100644 --- a/MachineLearning_Engine/Compute/Structured/Score.cs +++ b/MachineLearning_Engine/Compute/MachineLearningPythonToolkit.cs @@ -20,31 +20,35 @@ * along with this code. If not, see . */ -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using BH.Engine.MachineLearning; using System; -using System.Linq; using System.Collections.Generic; +using BH.Engine.Python; +using BH.oM.Python; using System.ComponentModel; +using System.IO; +using System.Linq; -namespace BH.Engine.MachineLearning.Structured +using BH.oM.Base.Attributes; + +namespace BH.Engine.CFD { public static partial class Compute { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - [Description("Finds the The coefficient of determination R^2 of the given regression model.")] - [Input("model", "The regression model used for inference.")] - [Input("x", "Training data as a list of 2-elements list.")] - [Input("y", "Target values as a list of 2-elements list.")] - [Output("r2", "The coefficient of determination R^2 of the prediction.")] - public static Tensor Score(IRegressionModel model, Tensor x, Tensor y) + [Description("MachineLearning_Toolkit\nMethod used to create the Python environment used to run all Python scripts within this toolkit.")] + [Input("run", "Starts the installation of the toolkit if true. Stays idle otherwise.")] + [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] + public static PythonEnvironment MachineLearningToolkitPythonEnvironment(bool run = false) { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, model.GetType().Name.ToString() + ".score", model, x, y)); + if (run) + { + return BH.Engine.Python.Compute.InstallVirtualenv( + name: Query.ToolkitName(), + BH.oM.Python.Enums.PythonVersion.v3_7_9, + localPackage: $@"C:\ProgramData\BHoM\Extensions\PythonCode\{Query.ToolkitName()}", + run: run + ); + } + return null; } } } diff --git a/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.cs b/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.cs deleted file mode 100644 index 777068e..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Preprocessing -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Rescale the data to a given range between 0 and 1.")] - [Input("x", "Data to be rescaled.")] - [Output("scaler", "The estimated scaler for the min-max scale transformation.")] - public static MinMaxScaler MinMaxScaler(Tensor x) - { - PyObject scaler = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "MinMaxScaler.fit", x); - return new MinMaxScaler(scaler); - } - - /*************************************/ - - [Description("Rescale the data with a given min-max scaler.")] - [Input("scaler", "The given scaler for the min-max scale transformation.")] - [Input("x", "Data to be rescaled.")] - [Output("rescaledX", "The rescaled data with a range between o and 1.")] - public static Tensor Infer(MinMaxScaler scaler, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "MinMaxScaler.infer", scaler, x)); - } - - /*************************************/ - [Description("Inverse transformation of data with the given scaler.")] - [Input("scaler", "The min-max scaler used for inverse transformation.")] - [Input("x", "Data to be inverse-transformed.")] - [Output("inversedX", "The inverse transformed data using the min-max scaler.")] - public static Tensor InferInverse(MinMaxScaler scaler, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "MinMaxScaler.infer_inverse", scaler, x)); - } - - /*************************************/ - - } -} - - diff --git a/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.py b/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.py deleted file mode 100644 index dc0b441..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/MinMaxScaler.py +++ /dev/null @@ -1,46 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.preprocessing import MinMaxScaler -import numpy as np - - -def fit(x: np.ndarray): - # instantiace a min-max scaler - scaler = MinMaxScaler() - - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.fit(x) - -def infer(scaler: MinMaxScaler, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.transform(x) - -def infer_inverse(scaler: MinMaxScaler, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.inverse_transform(x) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.cs b/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.cs deleted file mode 100644 index 593cc8a..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Preprocessing -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Create a trnasformer for polynomial and interaction features of the data.")] - [Input("degree", "The degree of the polynomial features. Default as 2.")] - [Input("interactionOnly", "The option to generate only interaction features. Default as false.")] - [Output("transformer", "The transformer for the polynomial and interaction features of the data.")] - public static PolynomialFeatures PolynomialFeatures(int degree = 2, bool interaction_only = false) - { - PyObject transformer = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "PolynomialFeatures.fit", degree, interaction_only); - return new PolynomialFeatures(transformer); - } - - /*************************************/ - - [Description("Generate polynomial and interaction features of the data.")] - [Input("transformer", "The transformer for the polynomial and interaction features of the given data.")] - [Input("x", "Data to be transformed.")] - [Output("transformedX", "The polynomial and interaction features of the data.")] - public static Tensor Infer(PolynomialFeatures transformer, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "PolynomialFeatures.infer", transformer, x)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.py b/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.py deleted file mode 100644 index 678db99..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/PolynomialFeatures.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.preprocessing import PolynomialFeatures -import numpy as np - - -def fit(deg: int, interaction: bool): - # instantiace a polynomial features transformer - transformer = PolynomialFeatures(degree = deg, interaction_only = interaction) - - return transformer - -def infer(transformer: PolynomialFeatures, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - - return transformer.fit_transform(x) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.cs b/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.cs deleted file mode 100644 index 92e5219..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Preprocessing -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Rescale the data with standard scaler.")] - [Input("x", "Data to be rescaled.")] - [Output("scaler", "The estimated scaler for the standard scale transformation.")] - public static StandardScaler StandardScaler(Tensor x) - { - PyObject scaler = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "StandardScaler.fit", x); - return new StandardScaler(scaler); - } - - /*************************************/ - - [Description("Rescale the data with a given standard scaler.")] - [Input("scaler", "The given scaler for the standard scale transformation.")] - [Input("x", "Data to be rescaled.")] - [Output("rescaledX", "The rescaled data after the given standard scale transformation.")] - public static Tensor Infer(StandardScaler scaler, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "StandardScaler.infer", scaler, x)); - } - - /*************************************/ - [Description("Inverse transformation of data with the given scaler.")] - [Input("scaler", "The standard scaler used for inverse transformation.")] - [Input("x", "Data to be inverse-transformed.")] - [Output("inversedX", "The inverse transformed data using the standard scaler.")] - public static Tensor InferInverse(StandardScaler scaler, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "StandardScaler.infer_inverse", scaler, x)); - } - - /*************************************/ - - } -} - - diff --git a/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.py b/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.py deleted file mode 100644 index 3440f33..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/StandardScaler.py +++ /dev/null @@ -1,46 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.preprocessing import StandardScaler -import numpy as np - - -def fit(x: np.ndarray): - # instantiace a min-max scaler - scaler = StandardScaler() - - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.fit(x) - -def infer(scaler: StandardScaler, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.transform(x) - -def infer_inverse(scaler: StandardScaler, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return scaler.inverse_transform(x) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Preprocessing/__init__.py b/MachineLearning_Engine/Compute/Preprocessing/__init__.py deleted file mode 100644 index ef40907..0000000 --- a/MachineLearning_Engine/Compute/Preprocessing/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import MinMaxScaler -from . import PolynomialFeatures -from . import StandardScaler diff --git a/MachineLearning_Engine/Compute/Structured/Coefficients.cs b/MachineLearning_Engine/Compute/Structured/Coefficients.cs deleted file mode 100644 index d61ff7c..0000000 --- a/MachineLearning_Engine/Compute/Structured/Coefficients.cs +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using BH.Engine.MachineLearning; -using System; -using System.Linq; -using System.Collections.Generic; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Structured -{ - public static partial class Compute - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - [Description("Expose the attributes for the given regression model.")] - [Input("model", "The regression model used for inference.")] - [MultiOutput(0, "coefficients", "Estimated coefficients for the regression model. This is a 1D array of double.")] - [MultiOutput(1, "intercept", "The independent term in the model.")] - public static Output Coefficients(IRegressionModel model) - { - Tensor coefficients = new Tensor(model.SkLearnModel.GetAttr("coef_")); - Tensor intercept = new Tensor(model.SkLearnModel.GetAttr("intercept_")); - return new Output { Item1 = coefficients, Item2 = intercept }; - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Structured/LinearRegression.cs b/MachineLearning_Engine/Compute/Structured/LinearRegression.cs deleted file mode 100644 index c710b7d..0000000 --- a/MachineLearning_Engine/Compute/Structured/LinearRegression.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.MachineLearning; -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System; -using System.Linq; -using System.Collections.Generic; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Structured -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Finds the slope and the intercept of a linear function that best fits the given set of bidimensional data.")] - [Input("x", "Training data as a list of 2-elements list.")] - [Input("y", "Target values as a list of 2-elements list.")] - [Output("model", "The ordinary least squares linear regression with the given data.")] - public static LinearRegression LinearRegression(Tensor x, Tensor y) - { - PyObject model = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "LinearRegression.fit", x, y); - return new LinearRegression(model); - } - - /*************************************/ - - [Description("Projects the given input using a linear regression model.")] - [Input("model", "The linear regressor model used for inference.")] - [Input("x", "Data to project on.")] - [Output("y", "The projected output for the given data using the linear model.")] - public static Tensor Infer(LinearRegression model, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "LinearRegression.infer", model, x)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Structured/LinearRegression.py b/MachineLearning_Engine/Compute/Structured/LinearRegression.py deleted file mode 100644 index 2907804..0000000 --- a/MachineLearning_Engine/Compute/Structured/LinearRegression.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.linear_model import LinearRegression -import numpy as np - - -def fit(x: np.ndarray, y: np.ndarray): - assert len(x) == len(y), "Input data and target data have different length {} and {}".format( - len(x), len(y)) - - # instantiace linear regression model - model = LinearRegression() - - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - - # fit the training data - model.fit(x, y) - return model - -def infer(model: LinearRegression, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return model.predict(x) - -def score(model: LinearRegression, x: np.ndarray, y: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - return model.score(x, y) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Structured/LogisticRegression.cs b/MachineLearning_Engine/Compute/Structured/LogisticRegression.cs deleted file mode 100644 index 3cc5730..0000000 --- a/MachineLearning_Engine/Compute/Structured/LogisticRegression.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.MachineLearning; -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System; -using System.Linq; -using System.Collections.Generic; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Structured -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Finds the slope and the intercept of a linear function that best fits the given set of bidimensional data.")] - [Input("x", "Training data as a list of 2-elements list.")] - [Input("y", "Target values as a list of 2-elements list.")] - [Output("model", "The ordinary least squares linear regression with the given data.")] - public static LogisticRegression LogisticRegression(Tensor x, Tensor y) - { - PyObject model = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "LogisticRegression.fit", x, y); - return new LogisticRegression(model); - } - - /*************************************/ - - [Description("Projects the given input using a linear regression model.")] - [Input("model", "The linear regressor model used for inference.")] - [Input("x", "Data to project on.")] - [Output("y", "The projected output for the given data using the linear model.")] - public static Tensor Infer(LogisticRegression model, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "LogisticRegression.infer", model, x)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Structured/LogisticRegression.py b/MachineLearning_Engine/Compute/Structured/LogisticRegression.py deleted file mode 100644 index 974ac4a..0000000 --- a/MachineLearning_Engine/Compute/Structured/LogisticRegression.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.linear_model import LogisticRegression -import numpy as np - - -def fit(x: np.ndarray, y: np.ndarray): - assert len(x) == len(y), "Input data and target data have different length {} and {}".format( - len(x), len(y)) - - # instantiace logistic regression model - model = LogisticRegression() - - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - - # fit the training data - model.fit(x, y) - return model - -def infer(model: LogisticRegression, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return model.predict(x) - -def score(model: LogisticRegression, x: np.ndarray, y: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - return model.score(x, y) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.cs b/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.cs deleted file mode 100644 index 0ae4189..0000000 --- a/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.MachineLearning; -using BH.oM.MachineLearning; -using BH.oM.Reflection; -using BH.oM.Reflection.Attributes; -using Python.Runtime; -using System; -using System.Linq; -using System.Collections.Generic; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Structured -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static SupportVectorRegression SupportVectorRegression(Tensor x, Tensor y, string kernel = "rbf", int degree = 3, double regularisation = 1.0) - { - PyObject model = BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "SupportVectorRegression.fit", x, y, kernel, degree, regularisation); - return new SupportVectorRegression(model); - } - - /*************************************/ - - public static Tensor Infer(SupportVectorRegression model, Tensor x) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "SupportVectorRegression.infer", model, x)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.py b/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.py deleted file mode 100644 index 8920f21..0000000 --- a/MachineLearning_Engine/Compute/Structured/SupportVectorRegression.py +++ /dev/null @@ -1,57 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from sklearn.svm import SVR -import numpy as np - - -def fit(x: np.ndarray, y: np.ndarray, kernel: str, degree: int, regularisation: float): - assert len(x) == len(y), "Input data and target data have different length {} and {}".format( - len(x), len(y)) - - # instantiace linear regression model - model = SVR(kernel=kernel, degree=degree, C=regularisation) - - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - - # fit the training data - model.fit(x, y) - return model - -def infer(model: SVR, x: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - return model.predict(x) - - -def score(model: SVR, x: np.ndarray, y: np.ndarray): - # make sure the input is at least bidimensinal - if x.ndim == 1: - x = x.reshape(-1, 1) - if y.ndim == 1: - y = y.reshape(-1, 1) - return model.score(x, y) \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Structured/__init__.py b/MachineLearning_Engine/Compute/Structured/__init__.py deleted file mode 100644 index c6d664e..0000000 --- a/MachineLearning_Engine/Compute/Structured/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import LinearRegression -from . import SupportVectorRegression -from . import LogisticRegression diff --git a/MachineLearning_Engine/Compute/Text/Answer.cs b/MachineLearning_Engine/Compute/Text/Answer.cs deleted file mode 100644 index 1bc269d..0000000 --- a/MachineLearning_Engine/Compute/Text/Answer.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.Engine.MachineLearning.Text -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string Answer(string question, string context = "") - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "Answer.infer", question, context).As(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Text/Answer.py b/MachineLearning_Engine/Compute/Text/Answer.py deleted file mode 100644 index 811e8b1..0000000 --- a/MachineLearning_Engine/Compute/Text/Answer.py +++ /dev/null @@ -1,45 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import torch -from transformers import pipeline - - -def infer(question: str, context: str): - # load model - global Q_A_PIPELINE - if Q_A_PIPELINE is None: - Q_A_PIPELINE = pipeline('question-answering') - - output = Q_A_PIPELINE({ - "question": question, - "context": context - })[0] - - start = output.get("start") - end = output.get("end") - score = output.get("score") - answer = output.get("answer") - - return answer - -Q_A_PIPELINE = None diff --git a/MachineLearning_Engine/Compute/Text/SentimentAnalysis.cs b/MachineLearning_Engine/Compute/Text/SentimentAnalysis.cs deleted file mode 100644 index c2e55eb..0000000 --- a/MachineLearning_Engine/Compute/Text/SentimentAnalysis.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.Engine.MachineLearning.Text -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static double SentimentAnalysis(string text) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "SentimentAnalysis.infer", text).As(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Text/SentimentAnalysis.py b/MachineLearning_Engine/Compute/Text/SentimentAnalysis.py deleted file mode 100644 index 5063aab..0000000 --- a/MachineLearning_Engine/Compute/Text/SentimentAnalysis.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import torch -from transformers import pipeline - - -def infer(text: str): - global SENTIMENT_ANALYSIS_PIPELINE - if SENTIMENT_ANALYSIS_PIPELINE is None: - SENTIMENT_ANALYSIS_PIPELINE = pipeline('sentiment-analysis') - - output = SENTIMENT_ANALYSIS_PIPELINE(text)[0] - sentiment = 1 if output.get("label") == "POSITIVE" else -1 - score = output.get("score") - - return score * sentiment - -SENTIMENT_ANALYSIS_PIPELINE = None diff --git a/MachineLearning_Engine/Compute/Text/Summarise.cs b/MachineLearning_Engine/Compute/Text/Summarise.cs deleted file mode 100644 index 916a586..0000000 --- a/MachineLearning_Engine/Compute/Text/Summarise.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.Engine.MachineLearning.Text -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static string Summarise(string text) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "Summarise.infer", text).As(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Text/Summarise.py b/MachineLearning_Engine/Compute/Text/Summarise.py deleted file mode 100644 index bda7429..0000000 --- a/MachineLearning_Engine/Compute/Text/Summarise.py +++ /dev/null @@ -1,36 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from transformers import pipeline - - -def infer(text: str): - global summarisation_pipeline - if summarisation_pipeline is None: - summarisation_pipeline = pipeline('summarization') - - output = summarisation_pipeline(text)[0] - summary_text = output.get("summary_text") - - return summary_text - -summarisation_pipeline = None diff --git a/MachineLearning_Engine/Compute/Text/__init__.py b/MachineLearning_Engine/Compute/Text/__init__.py deleted file mode 100644 index 0734382..0000000 --- a/MachineLearning_Engine/Compute/Text/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import Answer -from . import SentimentAnalysis -from . import Summarise \ No newline at end of file diff --git a/MachineLearning_Engine/Compute/Vision/DetectObjects.cs b/MachineLearning_Engine/Compute/Vision/DetectObjects.cs deleted file mode 100644 index 723f512..0000000 --- a/MachineLearning_Engine/Compute/Vision/DetectObjects.cs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.Engine.MachineLearning.Vision -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static object DetectObjects(string imagePath, bool gpu = false, double scoreThreshold = 0.9) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "DetectObjects.infer", imagePath, gpu, scoreThreshold); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Vision/DetectObjects.py b/MachineLearning_Engine/Compute/Vision/DetectObjects.py deleted file mode 100644 index e9014aa..0000000 --- a/MachineLearning_Engine/Compute/Vision/DetectObjects.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import PIL -import torch -import torchvision - - -def infer(image_path: str, gpu: bool, score_threshold: float): - if not (os.path.isfile(image_path)): - raise FileNotFoundError(image_path) - - global model - if model is None: - model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True, pretrained_backbone=True) - model.eval() - - pil_image: PIL.Image.Image = PIL.Image.open(image_path) - tensor_image: torch.Tensor = torchvision.transforms.functional.to_tensor(pil_image) - - if gpu: - tensor_image = tensor_image.cuda() - model = model.cuda() - - with torch.no_grad(): - detection: List[Dict[str, torch.Tensor]] = model(tensor_image.unsqueeze(0)) - return detection[0] - -model = None diff --git a/MachineLearning_Engine/Compute/Vision/DrawDetection.cs b/MachineLearning_Engine/Compute/Vision/DrawDetection.cs deleted file mode 100644 index 9905092..0000000 --- a/MachineLearning_Engine/Compute/Vision/DrawDetection.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using Python.Runtime; - -namespace BH.Engine.MachineLearning.Vision -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static Tensor DrawDetection(string imagePath, PyObject detection, double minAccuracy=0.8) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "DrawDetection.draw_detection", imagePath, detection, minAccuracy)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Vision/DrawDetection.py b/MachineLearning_Engine/Compute/Vision/DrawDetection.py deleted file mode 100644 index 5893d92..0000000 --- a/MachineLearning_Engine/Compute/Vision/DrawDetection.py +++ /dev/null @@ -1,226 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import PIL -import PIL.ImageDraw -import PIL.ImageFont -import torch -import torchvision - - -def draw_detection(image_path: str, detection, category: str=None, min_accuracy: float=0.9): - image = PIL.Image.open(image_path) - draw = PIL.ImageDraw.Draw(image) - for i, rect in enumerate(detection["boxes"]): - if detection["scores"][i] < min_accuracy: - continue - draw.rectangle(((rect[0], rect[1]), (rect[2], rect[3])), outline="red") - draw.text((rect[0], rect[1]), coco_labels[int( - detection["labels"][i])], font=PIL.ImageFont.truetype("arial", 20), fill="red") - return torchvision.transforms.functional.to_tensor(image) - - -coco_labels = { - 0: "unlabeled", - 1: "person", - 2: "bicycle", - 3: "car", - 4: "motorcycle", - 5: "airplane", - 6: "bus", - 7: "train", - 8: "truck", - 9: "boat", - 10: "traffic light", - 11: "fire hydrant", - 12: "street sign", - 13: "stop sign", - 14: "parking meter", - 15: "bench", - 16: "bird", - 17: "cat", - 18: "dog", - 19: "horse", - 20: "sheep", - 21: "cow", - 22: "elephant", - 23: "bear", - 24: "zebra", - 25: "giraffe", - 26: "hat", - 27: "backpack", - 28: "umbrella", - 29: "shoe", - 30: "eye glasses", - 31: "handbag", - 32: "tie", - 33: "suitcase", - 34: "frisbee", - 35: "skis", - 36: "snowboard", - 37: "sports ball", - 38: "kite", - 39: "baseball bat", - 40: "baseball glove", - 41: "skateboard", - 42: "surfboard", - 43: "tennis racket", - 44: "bottle", - 45: "plate", - 46: "wine glass", - 47: "cup", - 48: "fork", - 49: "knife", - 50: "spoon", - 51: "bowl", - 52: "banana", - 53: "apple", - 54: "sandwich", - 55: "orange", - 56: "broccoli", - 57: "carrot", - 58: "hot dog", - 59: "pizza", - 60: "donut", - 61: "cake", - 62: "chair", - 63: "couch", - 64: "potted plant", - 65: "bed", - 66: "mirror", - 67: "dining table", - 68: "window", - 69: "desk", - 70: "toilet", - 71: "door", - 72: "tv", - 73: "laptop", - 74: "mouse", - 75: "remote", - 76: "keyboard", - 77: "cell phone", - 78: "microwave", - 79: "oven", - 80: "toaster", - 81: "sink", - 82: "refrigerator", - 83: "blender", - 84: "book", - 85: "clock", - 86: "vase", - 87: "scissors", - 88: "teddy bear", - 89: "hair drier", - 90: "toothbrush", - 91: "hair brush", - 92: "banner", - 93: "blanket", - 94: "branch", - 95: "bridge", - 96: "building-other", - 97: "bush", - 98: "cabinet", - 99: "cage", - 100: "cardboard", - 101: "carpet", - 102: "ceiling-other", - 103: "ceiling-tile", - 104: "cloth", - 105: "clothes", - 106: "clouds", - 107: "counter", - 108: "cupboard", - 109: "curtain", - 110: "desk-stuff", - 111: "dirt", - 112: "door-stuff", - 113: "fence", - 114: "floor-marble", - 115: "floor-other", - 116: "floor-stone", - 117: "floor-tile", - 118: "floor-wood", - 119: "flower", - 120: "fog", - 121: "food-other", - 122: "fruit", - 123: "furniture-other", - 124: "grass", - 125: "gravel", - 126: "ground-other", - 127: "hill", - 128: "house", - 129: "leaves", - 130: "light", - 131: "mat", - 132: "metal", - 133: "mirror-stuff", - 134: "moss", - 135: "mountain", - 136: "mud", - 137: "napkin", - 138: "net", - 139: "paper", - 140: "pavement", - 141: "pillow", - 142: "plant-other", - 143: "plastic", - 144: "platform", - 145: "playingfield", - 146: "railing", - 147: "railroad", - 148: "river", - 149: "road", - 150: "rock", - 151: "roof", - 152: "rug", - 153: "salad", - 154: "sand", - 155: "sea", - 156: "shelf", - 157: "sky-other", - 158: "skyscraper", - 159: "snow", - 160: "solid-other", - 161: "stairs", - 162: "stone", - 163: "straw", - 164: "structural-other", - 165: "table", - 166: "tent", - 167: "textile-other", - 168: "towel", - 169: "tree", - 170: "vegetable", - 171: "wall-brick", - 172: "wall-concrete", - 173: "wall-other", - 174: "wall-panel", - 175: "wall-stone", - 176: "wall-tile", - 177: "wall-wood", - 178: "water-other", - 179: "waterdrops", - 180: "window-blind", - 181: "window-other", - 182: "wood", - } diff --git a/MachineLearning_Engine/Compute/Vision/FindContours.cs b/MachineLearning_Engine/Compute/Vision/FindContours.cs deleted file mode 100644 index 2cf6d70..0000000 --- a/MachineLearning_Engine/Compute/Vision/FindContours.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.Python; -using BH.oM.Geometry; -using BH.oM.MachineLearning; -using Python.Runtime; -using System.Collections.Generic; - -namespace BH.Engine.MachineLearning.Vision -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static List FindContours(Tensor image, int level) - { - List polylines = new List(); - // returns a list of points as numpy arrays - List contours = (BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "FindContours.infer", image, level).IFromPython()) as List; - foreach (List> polyline in contours) - { - Polyline bhomPolyline = new Polyline(); - foreach(List point in polyline) - { - Point bhomPoint = new Point { X = point[0], Y = point[1] }; - bhomPolyline.ControlPoints.Add(bhomPoint); - } - polylines.Add(bhomPolyline); - } - return polylines; - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Vision/FindContours.py b/MachineLearning_Engine/Compute/Vision/FindContours.py deleted file mode 100644 index 25699cf..0000000 --- a/MachineLearning_Engine/Compute/Vision/FindContours.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import numpy as np -import matplotlib.pyplot as plt -import skimage.measure -import skimage.color -import torch - - -def infer(im: np.ndarray, level: int): - if torch.is_tensor(im): - im = im.detach().cpu().numpy() - - im = im.squeeze() - ndim = im.ndim - - if ndim == 2: - return skimage.measure.find_contours(im, level) - - if ndim == 3: - # case: RGB image, channel first - if im.size(0) == 3: - im = np.transpose(im, (2, 1, 0)) - return skimage.measure.find_contours(im, level) - # case: RGB image, channel last - elif im.size(2) == 3: - mask = skimage.color.rgb2gray(im) - return skimage.measure.find_contours(im, level) - # case: list of grayscale images - elif 3 not in im.shape: - return [infer(x, level) for x in im] - - if ndim == 4: - # the only case is a list of images, rgb or grayscale with channels 1 - return [infer(x, level) for x in im] - - raise ValueError("I really don't know what you want to do with a tensor {}".format(im.shape)) - return diff --git a/MachineLearning_Engine/Compute/Vision/RecogniseObject.cs b/MachineLearning_Engine/Compute/Vision/RecogniseObject.cs deleted file mode 100644 index 404712a..0000000 --- a/MachineLearning_Engine/Compute/Vision/RecogniseObject.cs +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Reflection.Attributes; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning.Vision -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - [Description("Returns the type of object in the image, e.g. an apple")] - [Input("Image path", "The absolute path to the image to analyse")] - [Input("Gpu", "If true, computation is accelarated using a capable gpu")] - [Output("Object", "The probabilities (score) for each class. Use the Query.ImageClasses() method to match ")] - public static string RecogniseObject(string imagePath, bool gpu = false) - { - return BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "RecogniseObject.infer", imagePath, gpu).As(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Vision/RecogniseObject.py b/MachineLearning_Engine/Compute/Vision/RecogniseObject.py deleted file mode 100644 index 60559b7..0000000 --- a/MachineLearning_Engine/Compute/Vision/RecogniseObject.py +++ /dev/null @@ -1,1058 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import PIL -import torch -import torchvision - - -def infer(image_path: str, gpu: bool=False): - if not (os.path.isfile(image_path)): - raise FileNotFoundError(image_path) - - global model - if model is None: - model = torchvision.models.inception_v3(pretrained=True) - model.eval() - - pil_image: PIL.Image.Image = PIL.Image.open(image_path) - tensor_image: torch.Tensor = torchvision.transforms.functional.to_tensor(pil_image) - - if gpu: - tensor_image = tensor_image.cuda() - model = model.cuda() - else: - tensor_image = tensor_image.cpu() - model = model.cpu() - - with torch.no_grad(): - detection: List[Dict[str, torch.Tensor]] = model(tensor_image.unsqueeze(0)) - - label = torch.argmax(detection, dim=1).squeeze().item() - return labels.get(label, None) - - -model = None - -labels = { - 0: 'tench, Tinca tinca', - 1: 'goldfish, Carassius auratus', - 2: 'great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias', - 3: 'tiger shark, Galeocerdo cuvieri', - 4: 'hammerhead, hammerhead shark', - 5: 'electric ray, crampfish, numbfish, torpedo', - 6: 'stingray', - 7: 'cock', - 8: 'hen', - 9: 'ostrich, Struthio camelus', - 10: 'brambling, Fringilla montifringilla', - 11: 'goldfinch, Carduelis carduelis', - 12: 'house finch, linnet, Carpodacus mexicanus', - 13: 'junco, snowbird', - 14: 'indigo bunting, indigo finch, indigo bird, Passerina cyanea', - 15: 'robin, American robin, Turdus migratorius', - 16: 'bulbul', - 17: 'jay', - 18: 'magpie', - 19: 'chickadee', - 20: 'water ouzel, dipper', - 21: 'kite', - 22: 'bald eagle, American eagle, Haliaeetus leucocephalus', - 23: 'vulture', - 24: 'great grey owl, great gray owl, Strix nebulosa', - 25: 'European fire salamander, Salamandra salamandra', - 26: 'common newt, Triturus vulgaris', - 27: 'eft', - 28: 'spotted salamander, Ambystoma maculatum', - 29: 'axolotl, mud puppy, Ambystoma mexicanum', - 30: 'bullfrog, Rana catesbeiana', - 31: 'tree frog, tree-frog', - 32: 'tailed frog, bell toad, ribbed toad, tailed toad, Ascaphus trui', - 33: 'loggerhead, loggerhead turtle, Caretta caretta', - 34: 'leatherback turtle, leatherback, leathery turtle, Dermochelys coriacea', - 35: 'mud turtle', - 36: 'terrapin', - 37: 'box turtle, box tortoise', - 38: 'banded gecko', - 39: 'common iguana, iguana, Iguana iguana', - 40: 'American chameleon, anole, Anolis carolinensis', - 41: 'whiptail, whiptail lizard', - 42: 'agama', - 43: 'frilled lizard, Chlamydosaurus kingi', - 44: 'alligator lizard', - 45: 'Gila monster, Heloderma suspectum', - 46: 'green lizard, Lacerta viridis', - 47: 'African chameleon, Chamaeleo chamaeleon', - 48: 'Komodo dragon, Komodo lizard, dragon lizard, giant lizard, Varanus komodoensis', - 49: 'African crocodile, Nile crocodile, Crocodylus niloticus', - 50: 'American alligator, Alligator mississipiensis', - 51: 'triceratops', - 52: 'thunder snake, worm snake, Carphophis amoenus', - 53: 'ringneck snake, ring-necked snake, ring snake', - 54: 'hognose snake, puff adder, sand viper', - 55: 'green snake, grass snake', - 56: 'king snake, kingsnake', - 57: 'garter snake, grass snake', - 58: 'water snake', - 59: 'vine snake', - 60: 'night snake, Hypsiglena torquata', - 61: 'boa constrictor, Constrictor constrictor', - 62: 'rock python, rock snake, Python sebae', - 63: 'Indian cobra, Naja naja', - 64: 'green mamba', - 65: 'sea snake', - 66: 'horned viper, cerastes, sand viper, horned asp, Cerastes cornutus', - 67: 'diamondback, diamondback rattlesnake, Crotalus adamanteus', - 68: 'sidewinder, horned rattlesnake, Crotalus cerastes', - 69: 'trilobite', - 70: 'harvestman, daddy longlegs, Phalangium opilio', - 71: 'scorpion', - 72: 'black and gold garden spider, Argiope aurantia', - 73: 'barn spider, Araneus cavaticus', - 74: 'garden spider, Aranea diademata', - 75: 'black widow, Latrodectus mactans', - 76: 'tarantula', - 77: 'wolf spider, hunting spider', - 78: 'tick', - 79: 'centipede', - 80: 'black grouse', - 81: 'ptarmigan', - 82: 'ruffed grouse, partridge, Bonasa umbellus', - 83: 'prairie chicken, prairie grouse, prairie fowl', - 84: 'peacock', - 85: 'quail', - 86: 'partridge', - 87: 'African grey, African gray, Psittacus erithacus', - 88: 'macaw', - 89: 'sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita', - 90: 'lorikeet', - 91: 'coucal', - 92: 'bee eater', - 93: 'hornbill', - 94: 'hummingbird', - 95: 'jacamar', - 96: 'toucan', - 97: 'drake', - 98: 'red-breasted merganser, Mergus serrator', - 99: 'goose', - 100: 'black swan, Cygnus atratus', - 101: 'tusker', - 102: 'echidna, spiny anteater, anteater', - 103: 'platypus, duckbill, duckbilled platypus, duck-billed platypus, Ornithorhynchus anatinus', - 104: 'wallaby, brush kangaroo', - 105: 'koala, koala bear, kangaroo bear, native bear, Phascolarctos cinereus', - 106: 'wombat', - 107: 'jellyfish', - 108: 'sea anemone, anemone', - 109: 'brain coral', - 110: 'flatworm, platyhelminth', - 111: 'nematode, nematode worm, roundworm', - 112: 'conch', - 113: 'snail', - 114: 'slug', - 115: 'sea slug, nudibranch', - 116: 'chiton, coat-of-mail shell, sea cradle, polyplacophore', - 117: 'chambered nautilus, pearly nautilus, nautilus', - 118: 'Dungeness crab, Cancer magister', - 119: 'rock crab, Cancer irroratus', - 120: 'fiddler crab', - 121: 'king crab, Alaska crab, Alaskan king crab, Alaska king crab, Paralithodes camtschatica', - 122: 'American lobster, Northern lobster, Maine lobster, Homarus americanus', - 123: 'spiny lobster, langouste, rock lobster, crawfish, crayfish, sea crawfish', - 124: 'crayfish, crawfish, crawdad, crawdaddy', - 125: 'hermit crab', - 126: 'isopod', - 127: 'white stork, Ciconia ciconia', - 128: 'black stork, Ciconia nigra', - 129: 'spoonbill', - 130: 'flamingo', - 131: 'little blue heron, Egretta caerulea', - 132: 'American egret, great white heron, Egretta albus', - 133: 'bittern', - 134: 'crane', - 135: 'limpkin, Aramus pictus', - 136: 'European gallinule, Porphyrio porphyrio', - 137: 'American coot, marsh hen, mud hen, water hen, Fulica americana', - 138: 'bustard', - 139: 'ruddy turnstone, Arenaria interpres', - 140: 'red-backed sandpiper, dunlin, Erolia alpina', - 141: 'redshank, Tringa totanus', - 142: 'dowitcher', - 143: 'oystercatcher, oyster catcher', - 144: 'pelican', - 145: 'king penguin, Aptenodytes patagonica', - 146: 'albatross, mollymawk', - 147: 'grey whale, gray whale, devilfish, Eschrichtius gibbosus, Eschrichtius robustus', - 148: 'killer whale, killer, orca, grampus, sea wolf, Orcinus orca', - 149: 'dugong, Dugong dugon', - 150: 'sea lion', - 151: 'Chihuahua', - 152: 'Japanese spaniel', - 153: 'Maltese dog, Maltese terrier, Maltese', - 154: 'Pekinese, Pekingese, Peke', - 155: 'Shih-Tzu', - 156: 'Blenheim spaniel', - 157: 'papillon', - 158: 'toy terrier', - 159: 'Rhodesian ridgeback', - 160: 'Afghan hound, Afghan', - 161: 'basset, basset hound', - 162: 'beagle', - 163: 'bloodhound, sleuthhound', - 164: 'bluetick', - 165: 'black-and-tan coonhound', - 166: 'Walker hound, Walker foxhound', - 167: 'English foxhound', - 168: 'redbone', - 169: 'borzoi, Russian wolfhound', - 170: 'Irish wolfhound', - 171: 'Italian greyhound', - 172: 'whippet', - 173: 'Ibizan hound, Ibizan Podenco', - 174: 'Norwegian elkhound, elkhound', - 175: 'otterhound, otter hound', - 176: 'Saluki, gazelle hound', - 177: 'Scottish deerhound, deerhound', - 178: 'Weimaraner', - 179: 'Staffordshire bullterrier, Staffordshire bull terrier', - 180: 'American Staffordshire terrier, Staffordshire terrier, American pit bull terrier, pit bull terrier', - 181: 'Bedlington terrier', - 182: 'Border terrier', - 183: 'Kerry blue terrier', - 184: 'Irish terrier', - 185: 'Norfolk terrier', - 186: 'Norwich terrier', - 187: 'Yorkshire terrier', - 188: 'wire-haired fox terrier', - 189: 'Lakeland terrier', - 190: 'Sealyham terrier, Sealyham', - 191: 'Airedale, Airedale terrier', - 192: 'cairn, cairn terrier', - 193: 'Australian terrier', - 194: 'Dandie Dinmont, Dandie Dinmont terrier', - 195: 'Boston bull, Boston terrier', - 196: 'miniature schnauzer', - 197: 'giant schnauzer', - 198: 'standard schnauzer', - 199: 'Scotch terrier, Scottish terrier, Scottie', - 200: 'Tibetan terrier, chrysanthemum dog', - 201: 'silky terrier, Sydney silky', - 202: 'soft-coated wheaten terrier', - 203: 'West Highland white terrier', - 204: 'Lhasa, Lhasa apso', - 205: 'flat-coated retriever', - 206: 'curly-coated retriever', - 207: 'golden retriever', - 208: 'Labrador retriever', - 209: 'Chesapeake Bay retriever', - 210: 'German short-haired pointer', - 211: 'vizsla, Hungarian pointer', - 212: 'English setter', - 213: 'Irish setter, red setter', - 214: 'Gordon setter', - 215: 'Brittany spaniel', - 216: 'clumber, clumber spaniel', - 217: 'English springer, English springer spaniel', - 218: 'Welsh springer spaniel', - 219: 'cocker spaniel, English cocker spaniel, cocker', - 220: 'Sussex spaniel', - 221: 'Irish water spaniel', - 222: 'kuvasz', - 223: 'schipperke', - 224: 'groenendael', - 225: 'malinois', - 226: 'briard', - 227: 'kelpie', - 228: 'komondor', - 229: 'Old English sheepdog, bobtail', - 230: 'Shetland sheepdog, Shetland sheep dog, Shetland', - 231: 'collie', - 232: 'Border collie', - 233: 'Bouvier des Flandres, Bouviers des Flandres', - 234: 'Rottweiler', - 235: 'German shepherd, German shepherd dog, German police dog, alsatian', - 236: 'Doberman, Doberman pinscher', - 237: 'miniature pinscher', - 238: 'Greater Swiss Mountain dog', - 239: 'Bernese mountain dog', - 240: 'Appenzeller', - 241: 'EntleBucher', - 242: 'boxer', - 243: 'bull mastiff', - 244: 'Tibetan mastiff', - 245: 'French bulldog', - 246: 'Great Dane', - 247: 'Saint Bernard, St Bernard', - 248: 'Eskimo dog, husky', - 249: 'malamute, malemute, Alaskan malamute', - 250: 'Siberian husky', - 251: 'dalmatian, coach dog, carriage dog', - 252: 'affenpinscher, monkey pinscher, monkey dog', - 253: 'basenji', - 254: 'pug, pug-dog', - 255: 'Leonberg', - 256: 'Newfoundland, Newfoundland dog', - 257: 'Great Pyrenees', - 258: 'Samoyed, Samoyede', - 259: 'Pomeranian', - 260: 'chow, chow chow', - 261: 'keeshond', - 262: 'Brabancon griffon', - 263: 'Pembroke, Pembroke Welsh corgi', - 264: 'Cardigan, Cardigan Welsh corgi', - 265: 'toy poodle', - 266: 'miniature poodle', - 267: 'standard poodle', - 268: 'Mexican hairless', - 269: 'timber wolf, grey wolf, gray wolf, Canis lupus', - 270: 'white wolf, Arctic wolf, Canis lupus tundrarum', - 271: 'red wolf, maned wolf, Canis rufus, Canis niger', - 272: 'coyote, prairie wolf, brush wolf, Canis latrans', - 273: 'dingo, warrigal, warragal, Canis dingo', - 274: 'dhole, Cuon alpinus', - 275: 'African hunting dog, hyena dog, Cape hunting dog, Lycaon pictus', - 276: 'hyena, hyaena', - 277: 'red fox, Vulpes vulpes', - 278: 'kit fox, Vulpes macrotis', - 279: 'Arctic fox, white fox, Alopex lagopus', - 280: 'grey fox, gray fox, Urocyon cinereoargenteus', - 281: 'tabby, tabby cat', - 282: 'tiger cat', - 283: 'Persian cat', - 284: 'Siamese cat, Siamese', - 285: 'Egyptian cat', - 286: 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor', - 287: 'lynx, catamount', - 288: 'leopard, Panthera pardus', - 289: 'snow leopard, ounce, Panthera uncia', - 290: 'jaguar, panther, Panthera onca, Felis onca', - 291: 'lion, king of beasts, Panthera leo', - 292: 'tiger, Panthera tigris', - 293: 'cheetah, chetah, Acinonyx jubatus', - 294: 'brown bear, bruin, Ursus arctos', - 295: 'American black bear, black bear, Ursus americanus, Euarctos americanus', - 296: 'ice bear, polar bear, Ursus Maritimus, Thalarctos maritimus', - 297: 'sloth bear, Melursus ursinus, Ursus ursinus', - 298: 'mongoose', - 299: 'meerkat, mierkat', - 300: 'tiger beetle', - 301: 'ladybug, ladybeetle, lady beetle, ladybird, ladybird beetle', - 302: 'ground beetle, carabid beetle', - 303: 'long-horned beetle, longicorn, longicorn beetle', - 304: 'leaf beetle, chrysomelid', - 305: 'dung beetle', - 306: 'rhinoceros beetle', - 307: 'weevil', - 308: 'fly', - 309: 'bee', - 310: 'ant, emmet, pismire', - 311: 'grasshopper, hopper', - 312: 'cricket', - 313: 'walking stick, walkingstick, stick insect', - 314: 'cockroach, roach', - 315: 'mantis, mantid', - 316: 'cicada, cicala', - 317: 'leafhopper', - 318: 'lacewing, lacewing fly', - 319: "dragonfly, darning needle, devil's darning needle, sewing needle, snake feeder, snake doctor, mosquito hawk, skeeter hawk", - 320: 'damselfly', - 321: 'admiral', - 322: 'ringlet, ringlet butterfly', - 323: 'monarch, monarch butterfly, milkweed butterfly, Danaus plexippus', - 324: 'cabbage butterfly', - 325: 'sulphur butterfly, sulfur butterfly', - 326: 'lycaenid, lycaenid butterfly', - 327: 'starfish, sea star', - 328: 'sea urchin', - 329: 'sea cucumber, holothurian', - 330: 'wood rabbit, cottontail, cottontail rabbit', - 331: 'hare', - 332: 'Angora, Angora rabbit', - 333: 'hamster', - 334: 'porcupine, hedgehog', - 335: 'fox squirrel, eastern fox squirrel, Sciurus niger', - 336: 'marmot', - 337: 'beaver', - 338: 'guinea pig, Cavia cobaya', - 339: 'sorrel', - 340: 'zebra', - 341: 'hog, pig, grunter, squealer, Sus scrofa', - 342: 'wild boar, boar, Sus scrofa', - 343: 'warthog', - 344: 'hippopotamus, hippo, river horse, Hippopotamus amphibius', - 345: 'ox', - 346: 'water buffalo, water ox, Asiatic buffalo, Bubalus bubalis', - 347: 'bison', - 348: 'ram, tup', - 349: 'bighorn, bighorn sheep, cimarron, Rocky Mountain bighorn, Rocky Mountain sheep, Ovis canadensis', - 350: 'ibex, Capra ibex', - 351: 'hartebeest', - 352: 'impala, Aepyceros melampus', - 353: 'gazelle', - 354: 'Arabian camel, dromedary, Camelus dromedarius', - 355: 'llama', - 356: 'weasel', - 357: 'mink', - 358: 'polecat, fitch, foulmart, foumart, Mustela putorius', - 359: 'black-footed ferret, ferret, Mustela nigripes', - 360: 'otter', - 361: 'skunk, polecat, wood pussy', - 362: 'badger', - 363: 'armadillo', - 364: 'three-toed sloth, ai, Bradypus tridactylus', - 365: 'orangutan, orang, orangutang, Pongo pygmaeus', - 366: 'gorilla, Gorilla gorilla', - 367: 'chimpanzee, chimp, Pan troglodytes', - 368: 'gibbon, Hylobates lar', - 369: 'siamang, Hylobates syndactylus, Symphalangus syndactylus', - 370: 'guenon, guenon monkey', - 371: 'patas, hussar monkey, Erythrocebus patas', - 372: 'baboon', - 373: 'macaque', - 374: 'langur', - 375: 'colobus, colobus monkey', - 376: 'proboscis monkey, Nasalis larvatus', - 377: 'marmoset', - 378: 'capuchin, ringtail, Cebus capucinus', - 379: 'howler monkey, howler', - 380: 'titi, titi monkey', - 381: 'spider monkey, Ateles geoffroyi', - 382: 'squirrel monkey, Saimiri sciureus', - 383: 'Madagascar cat, ring-tailed lemur, Lemur catta', - 384: 'indri, indris, Indri indri, Indri brevicaudatus', - 385: 'Indian elephant, Elephas maximus', - 386: 'African elephant, Loxodonta africana', - 387: 'lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens', - 388: 'giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca', - 389: 'barracouta, snoek', - 390: 'eel', - 391: 'coho, cohoe, coho salmon, blue jack, silver salmon, Oncorhynchus kisutch', - 392: 'rock beauty, Holocanthus tricolor', - 393: 'anemone fish', - 394: 'sturgeon', - 395: 'gar, garfish, garpike, billfish, Lepisosteus osseus', - 396: 'lionfish', - 397: 'puffer, pufferfish, blowfish, globefish', - 398: 'abacus', - 399: 'abaya', - 400: "academic gown, academic robe, judge's robe", - 401: 'accordion, piano accordion, squeeze box', - 402: 'acoustic guitar', - 403: 'aircraft carrier, carrier, flattop, attack aircraft carrier', - 404: 'airliner', - 405: 'airship, dirigible', - 406: 'altar', - 407: 'ambulance', - 408: 'amphibian, amphibious vehicle', - 409: 'analog clock', - 410: 'apiary, bee house', - 411: 'apron', - 412: 'ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin', - 413: 'assault rifle, assault gun', - 414: 'backpack, back pack, knapsack, packsack, rucksack, haversack', - 415: 'bakery, bakeshop, bakehouse', - 416: 'balance beam, beam', - 417: 'balloon', - 418: 'ballpoint, ballpoint pen, ballpen, Biro', - 419: 'Band Aid', - 420: 'banjo', - 421: 'bannister, banister, balustrade, balusters, handrail', - 422: 'barbell', - 423: 'barber chair', - 424: 'barbershop', - 425: 'barn', - 426: 'barometer', - 427: 'barrel, cask', - 428: 'barrow, garden cart, lawn cart, wheelbarrow', - 429: 'baseball', - 430: 'basketball', - 431: 'bassinet', - 432: 'bassoon', - 433: 'bathing cap, swimming cap', - 434: 'bath towel', - 435: 'bathtub, bathing tub, bath, tub', - 436: 'beach wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon', - 437: 'beacon, lighthouse, beacon light, pharos', - 438: 'beaker', - 439: 'bearskin, busby, shako', - 440: 'beer bottle', - 441: 'beer glass', - 442: 'bell cote, bell cot', - 443: 'bib', - 444: 'bicycle-built-for-two, tandem bicycle, tandem', - 445: 'bikini, two-piece', - 446: 'binder, ring-binder', - 447: 'binoculars, field glasses, opera glasses', - 448: 'birdhouse', - 449: 'boathouse', - 450: 'bobsled, bobsleigh, bob', - 451: 'bolo tie, bolo, bola tie, bola', - 452: 'bonnet, poke bonnet', - 453: 'bookcase', - 454: 'bookshop, bookstore, bookstall', - 455: 'bottlecap', - 456: 'bow', - 457: 'bow tie, bow-tie, bowtie', - 458: 'brass, memorial tablet, plaque', - 459: 'brassiere, bra, bandeau', - 460: 'breakwater, groin, groyne, mole, bulwark, seawall, jetty', - 461: 'breastplate, aegis, egis', - 462: 'broom', - 463: 'bucket, pail', - 464: 'buckle', - 465: 'bulletproof vest', - 466: 'bullet train, bullet', - 467: 'butcher shop, meat market', - 468: 'cab, hack, taxi, taxicab', - 469: 'caldron, cauldron', - 470: 'candle, taper, wax light', - 471: 'cannon', - 472: 'canoe', - 473: 'can opener, tin opener', - 474: 'cardigan', - 475: 'car mirror', - 476: 'carousel, carrousel, merry-go-round, roundabout, whirligig', - 477: "carpenter's kit, tool kit", - 478: 'carton', - 479: 'car wheel', - 480: 'cash machine, cash dispenser, automated teller machine, automatic teller machine, automated teller, automatic teller, ATM', - 481: 'cassette', - 482: 'cassette player', - 483: 'castle', - 484: 'catamaran', - 485: 'CD player', - 486: 'cello, violoncello', - 487: 'cellular telephone, cellular phone, cellphone, cell, mobile phone', - 488: 'chain', - 489: 'chainlink fence', - 490: 'chain mail, ring mail, mail, chain armor, chain armour, ring armor, ring armour', - 491: 'chain saw, chainsaw', - 492: 'chest', - 493: 'chiffonier, commode', - 494: 'chime, bell, gong', - 495: 'china cabinet, china closet', - 496: 'Christmas stocking', - 497: 'church, church building', - 498: 'cinema, movie theater, movie theatre, movie house, picture palace', - 499: 'cleaver, meat cleaver, chopper', - 500: 'cliff dwelling', - 501: 'cloak', - 502: 'clog, geta, patten, sabot', - 503: 'cocktail shaker', - 504: 'coffee mug', - 505: 'coffeepot', - 506: 'coil, spiral, volute, whorl, helix', - 507: 'combination lock', - 508: 'computer keyboard, keypad', - 509: 'confectionery, confectionary, candy store', - 510: 'container ship, containership, container vessel', - 511: 'convertible', - 512: 'corkscrew, bottle screw', - 513: 'cornet, horn, trumpet, trump', - 514: 'cowboy boot', - 515: 'cowboy hat, ten-gallon hat', - 516: 'cradle', - 517: 'crane', - 518: 'crash helmet', - 519: 'crate', - 520: 'crib, cot', - 521: 'Crock Pot', - 522: 'croquet ball', - 523: 'crutch', - 524: 'cuirass', - 525: 'dam, dike, dyke', - 526: 'desk', - 527: 'desktop computer', - 528: 'dial telephone, dial phone', - 529: 'diaper, nappy, napkin', - 530: 'digital clock', - 531: 'digital watch', - 532: 'dining table, board', - 533: 'dishrag, dishcloth', - 534: 'dishwasher, dish washer, dishwashing machine', - 535: 'disk brake, disc brake', - 536: 'dock, dockage, docking facility', - 537: 'dogsled, dog sled, dog sleigh', - 538: 'dome', - 539: 'doormat, welcome mat', - 540: 'drilling platform, offshore rig', - 541: 'drum, membranophone, tympan', - 542: 'drumstick', - 543: 'dumbbell', - 544: 'Dutch oven', - 545: 'electric fan, blower', - 546: 'electric guitar', - 547: 'electric locomotive', - 548: 'entertainment center', - 549: 'envelope', - 550: 'espresso maker', - 551: 'face powder', - 552: 'feather boa, boa', - 553: 'file, file cabinet, filing cabinet', - 554: 'fireboat', - 555: 'fire engine, fire truck', - 556: 'fire screen, fireguard', - 557: 'flagpole, flagstaff', - 558: 'flute, transverse flute', - 559: 'folding chair', - 560: 'football helmet', - 561: 'forklift', - 562: 'fountain', - 563: 'fountain pen', - 564: 'four-poster', - 565: 'freight car', - 566: 'French horn, horn', - 567: 'frying pan, frypan, skillet', - 568: 'fur coat', - 569: 'garbage truck, dustcart', - 570: 'gasmask, respirator, gas helmet', - 571: 'gas pump, gasoline pump, petrol pump, island dispenser', - 572: 'goblet', - 573: 'go-kart', - 574: 'golf ball', - 575: 'golfcart, golf cart', - 576: 'gondola', - 577: 'gong, tam-tam', - 578: 'gown', - 579: 'grand piano, grand', - 580: 'greenhouse, nursery, glasshouse', - 581: 'grille, radiator grille', - 582: 'grocery store, grocery, food market, market', - 583: 'guillotine', - 584: 'hair slide', - 585: 'hair spray', - 586: 'half track', - 587: 'hammer', - 588: 'hamper', - 589: 'hand blower, blow dryer, blow drier, hair dryer, hair drier', - 590: 'hand-held computer, hand-held microcomputer', - 591: 'handkerchief, hankie, hanky, hankey', - 592: 'hard disc, hard disk, fixed disk', - 593: 'harmonica, mouth organ, harp, mouth harp', - 594: 'harp', - 595: 'harvester, reaper', - 596: 'hatchet', - 597: 'holster', - 598: 'home theater, home theatre', - 599: 'honeycomb', - 600: 'hook, claw', - 601: 'hoopskirt, crinoline', - 602: 'horizontal bar, high bar', - 603: 'horse cart, horse-cart', - 604: 'hourglass', - 605: 'iPod', - 606: 'iron, smoothing iron', - 607: "jack-o'-lantern", - 608: 'jean, blue jean, denim', - 609: 'jeep, landrover', - 610: 'jersey, T-shirt, tee shirt', - 611: 'jigsaw puzzle', - 612: 'jinrikisha, ricksha, rickshaw', - 613: 'joystick', - 614: 'kimono', - 615: 'knee pad', - 616: 'knot', - 617: 'lab coat, laboratory coat', - 618: 'ladle', - 619: 'lampshade, lamp shade', - 620: 'laptop, laptop computer', - 621: 'lawn mower, mower', - 622: 'lens cap, lens cover', - 623: 'letter opener, paper knife, paperknife', - 624: 'library', - 625: 'lifeboat', - 626: 'lighter, light, igniter, ignitor', - 627: 'limousine, limo', - 628: 'liner, ocean liner', - 629: 'lipstick, lip rouge', - 630: 'Loafer', - 631: 'lotion', - 632: 'loudspeaker, speaker, speaker unit, loudspeaker system, speaker system', - 633: "loupe, jeweler's loupe", - 634: 'lumbermill, sawmill', - 635: 'magnetic compass', - 636: 'mailbag, postbag', - 637: 'mailbox, letter box', - 638: 'maillot', - 639: 'maillot, tank suit', - 640: 'manhole cover', - 641: 'maraca', - 642: 'marimba, xylophone', - 643: 'mask', - 644: 'matchstick', - 645: 'maypole', - 646: 'maze, labyrinth', - 647: 'measuring cup', - 648: 'medicine chest, medicine cabinet', - 649: 'megalith, megalithic structure', - 650: 'microphone, mike', - 651: 'microwave, microwave oven', - 652: 'military uniform', - 653: 'milk can', - 654: 'minibus', - 655: 'miniskirt, mini', - 656: 'minivan', - 657: 'missile', - 658: 'mitten', - 659: 'mixing bowl', - 660: 'mobile home, manufactured home', - 661: 'Model T', - 662: 'modem', - 663: 'monastery', - 664: 'monitor', - 665: 'moped', - 666: 'mortar', - 667: 'mortarboard', - 668: 'mosque', - 669: 'mosquito net', - 670: 'motor scooter, scooter', - 671: 'mountain bike, all-terrain bike, off-roader', - 672: 'mountain tent', - 673: 'mouse, computer mouse', - 674: 'mousetrap', - 675: 'moving van', - 676: 'muzzle', - 677: 'nail', - 678: 'neck brace', - 679: 'necklace', - 680: 'nipple', - 681: 'notebook, notebook computer', - 682: 'obelisk', - 683: 'oboe, hautboy, hautbois', - 684: 'ocarina, sweet potato', - 685: 'odometer, hodometer, mileometer, milometer', - 686: 'oil filter', - 687: 'organ, pipe organ', - 688: 'oscilloscope, scope, cathode-ray oscilloscope, CRO', - 689: 'overskirt', - 690: 'oxcart', - 691: 'oxygen mask', - 692: 'packet', - 693: 'paddle, boat paddle', - 694: 'paddlewheel, paddle wheel', - 695: 'padlock', - 696: 'paintbrush', - 697: "pajama, pyjama, pj's, jammies", - 698: 'palace', - 699: 'panpipe, pandean pipe, syrinx', - 700: 'paper towel', - 701: 'parachute, chute', - 702: 'parallel bars, bars', - 703: 'park bench', - 704: 'parking meter', - 705: 'passenger car, coach, carriage', - 706: 'patio, terrace', - 707: 'pay-phone, pay-station', - 708: 'pedestal, plinth, footstall', - 709: 'pencil box, pencil case', - 710: 'pencil sharpener', - 711: 'perfume, essence', - 712: 'Petri dish', - 713: 'photocopier', - 714: 'pick, plectrum, plectron', - 715: 'pickelhaube', - 716: 'picket fence, paling', - 717: 'pickup, pickup truck', - 718: 'pier', - 719: 'piggy bank, penny bank', - 720: 'pill bottle', - 721: 'pillow', - 722: 'ping-pong ball', - 723: 'pinwheel', - 724: 'pirate, pirate ship', - 725: 'pitcher, ewer', - 726: "plane, carpenter's plane, woodworking plane", - 727: 'planetarium', - 728: 'plastic bag', - 729: 'plate rack', - 730: 'plow, plough', - 731: "plunger, plumber's helper", - 732: 'Polaroid camera, Polaroid Land camera', - 733: 'pole', - 734: 'police van, police wagon, paddy wagon, patrol wagon, wagon, black Maria', - 735: 'poncho', - 736: 'pool table, billiard table, snooker table', - 737: 'pop bottle, soda bottle', - 738: 'pot, flowerpot', - 739: "potter's wheel", - 740: 'power drill', - 741: 'prayer rug, prayer mat', - 742: 'printer', - 743: 'prison, prison house', - 744: 'projectile, missile', - 745: 'projector', - 746: 'puck, hockey puck', - 747: 'punching bag, punch bag, punching ball, punchball', - 748: 'purse', - 749: 'quill, quill pen', - 750: 'quilt, comforter, comfort, puff', - 751: 'racer, race car, racing car', - 752: 'racket, racquet', - 753: 'radiator', - 754: 'radio, wireless', - 755: 'radio telescope, radio reflector', - 756: 'rain barrel', - 757: 'recreational vehicle, RV, R.V.', - 758: 'reel', - 759: 'reflex camera', - 760: 'refrigerator, icebox', - 761: 'remote control, remote', - 762: 'restaurant, eating house, eating place, eatery', - 763: 'revolver, six-gun, six-shooter', - 764: 'rifle', - 765: 'rocking chair, rocker', - 766: 'rotisserie', - 767: 'rubber eraser, rubber, pencil eraser', - 768: 'rugby ball', - 769: 'rule, ruler', - 770: 'running shoe', - 771: 'safe', - 772: 'safety pin', - 773: 'saltshaker, salt shaker', - 774: 'sandal', - 775: 'sarong', - 776: 'sax, saxophone', - 777: 'scabbard', - 778: 'scale, weighing machine', - 779: 'school bus', - 780: 'schooner', - 781: 'scoreboard', - 782: 'screen, CRT screen', - 783: 'screw', - 784: 'screwdriver', - 785: 'seat belt, seatbelt', - 786: 'sewing machine', - 787: 'shield, buckler', - 788: 'shoe shop, shoe-shop, shoe store', - 789: 'shoji', - 790: 'shopping basket', - 791: 'shopping cart', - 792: 'shovel', - 793: 'shower cap', - 794: 'shower curtain', - 795: 'ski', - 796: 'ski mask', - 797: 'sleeping bag', - 798: 'slide rule, slipstick', - 799: 'sliding door', - 800: 'slot, one-armed bandit', - 801: 'snorkel', - 802: 'snowmobile', - 803: 'snowplow, snowplough', - 804: 'soap dispenser', - 805: 'soccer ball', - 806: 'sock', - 807: 'solar dish, solar collector, solar furnace', - 808: 'sombrero', - 809: 'soup bowl', - 810: 'space bar', - 811: 'space heater', - 812: 'space shuttle', - 813: 'spatula', - 814: 'speedboat', - 815: "spider web, spider's web", - 816: 'spindle', - 817: 'sports car, sport car', - 818: 'spotlight, spot', - 819: 'stage', - 820: 'steam locomotive', - 821: 'steel arch bridge', - 822: 'steel drum', - 823: 'stethoscope', - 824: 'stole', - 825: 'stone wall', - 826: 'stopwatch, stop watch', - 827: 'stove', - 828: 'strainer', - 829: 'streetcar, tram, tramcar, trolley, trolley car', - 830: 'stretcher', - 831: 'studio couch, day bed', - 832: 'stupa, tope', - 833: 'submarine, pigboat, sub, U-boat', - 834: 'suit, suit of clothes', - 835: 'sundial', - 836: 'sunglass', - 837: 'sunglasses, dark glasses, shades', - 838: 'sunscreen, sunblock, sun blocker', - 839: 'suspension bridge', - 840: 'swab, swob, mop', - 841: 'sweatshirt', - 842: 'swimming trunks, bathing trunks', - 843: 'swing', - 844: 'switch, electric switch, electrical switch', - 845: 'syringe', - 846: 'table lamp', - 847: 'tank, army tank, armored combat vehicle, armoured combat vehicle', - 848: 'tape player', - 849: 'teapot', - 850: 'teddy, teddy bear', - 851: 'television, television system', - 852: 'tennis ball', - 853: 'thatch, thatched roof', - 854: 'theater curtain, theatre curtain', - 855: 'thimble', - 856: 'thresher, thrasher, threshing machine', - 857: 'throne', - 858: 'tile roof', - 859: 'toaster', - 860: 'tobacco shop, tobacconist shop, tobacconist', - 861: 'toilet seat', - 862: 'torch', - 863: 'totem pole', - 864: 'tow truck, tow car, wrecker', - 865: 'toyshop', - 866: 'tractor', - 867: 'trailer truck, tractor trailer, trucking rig, rig, articulated lorry, semi', - 868: 'tray', - 869: 'trench coat', - 870: 'tricycle, trike, velocipede', - 871: 'trimaran', - 872: 'tripod', - 873: 'triumphal arch', - 874: 'trolleybus, trolley coach, trackless trolley', - 875: 'trombone', - 876: 'tub, vat', - 877: 'turnstile', - 878: 'typewriter keyboard', - 879: 'umbrella', - 880: 'unicycle, monocycle', - 881: 'upright, upright piano', - 882: 'vacuum, vacuum cleaner', - 883: 'vase', - 884: 'vault', - 885: 'velvet', - 886: 'vending machine', - 887: 'vestment', - 888: 'viaduct', - 889: 'violin, fiddle', - 890: 'volleyball', - 891: 'waffle iron', - 892: 'wall clock', - 893: 'wallet, billfold, notecase, pocketbook', - 894: 'wardrobe, closet, press', - 895: 'warplane, military plane', - 896: 'washbasin, handbasin, washbowl, lavabo, wash-hand basin', - 897: 'washer, automatic washer, washing machine', - 898: 'water bottle', - 899: 'water jug', - 900: 'water tower', - 901: 'whiskey jug', - 902: 'whistle', - 903: 'wig', - 904: 'window screen', - 905: 'window shade', - 906: 'Windsor tie', - 907: 'wine bottle', - 908: 'wing', - 909: 'wok', - 910: 'wooden spoon', - 911: 'wool, woolen, woollen', - 912: 'worm fence, snake fence, snake-rail fence, Virginia fence', - 913: 'wreck', - 914: 'yawl', - 915: 'yurt', - 916: 'web site, website, internet site, site', - 917: 'comic book', - 918: 'crossword puzzle, crossword', - 919: 'street sign', - 920: 'traffic light, traffic signal, stoplight', - 921: 'book jacket, dust cover, dust jacket, dust wrapper', - 922: 'menu', - 923: 'plate', - 924: 'guacamole', - 925: 'consomme', - 926: 'hot pot, hotpot', - 927: 'trifle', - 928: 'ice cream, icecream', - 929: 'ice lolly, lolly, lollipop, popsicle', - 930: 'French loaf', - 931: 'bagel, beigel', - 932: 'pretzel', - 933: 'cheeseburger', - 934: 'hotdog, hot dog, red hot', - 935: 'mashed potato', - 936: 'head cabbage', - 937: 'broccoli', - 938: 'cauliflower', - 939: 'zucchini, courgette', - 940: 'spaghetti squash', - 941: 'acorn squash', - 942: 'butternut squash', - 943: 'cucumber, cuke', - 944: 'artichoke, globe artichoke', - 945: 'bell pepper', - 946: 'cardoon', - 947: 'mushroom', - 948: 'Granny Smith', - 949: 'strawberry', - 950: 'orange', - 951: 'lemon', - 952: 'fig', - 953: 'pineapple, ananas', - 954: 'banana', - 955: 'jackfruit, jak, jack', - 956: 'custard apple', - 957: 'pomegranate', - 958: 'hay', - 959: 'carbonara', - 960: 'chocolate sauce, chocolate syrup', - 961: 'dough', - 962: 'meat loaf, meatloaf', - 963: 'pizza, pizza pie', - 964: 'potpie', - 965: 'burrito', - 966: 'red wine', - 967: 'espresso', - 968: 'cup', - 969: 'eggnog', - 970: 'alp', - 971: 'bubble', - 972: 'cliff, drop, drop-off', - 973: 'coral reef', - 974: 'geyser', - 975: 'lakeside, lakeshore', - 976: 'promontory, headland, head, foreland', - 977: 'sandbar, sand bar', - 978: 'seashore, coast, seacoast, sea-coast', - 979: 'valley, vale', - 980: 'volcano', - 981: 'ballplayer, baseball player', - 982: 'groom, bridegroom', - 983: 'scuba diver', - 984: 'rapeseed', - 985: 'daisy', - 986: "yellow lady's slipper, yellow lady-slipper, Cypripedium calceolus, Cypripedium parviflorum", - 987: 'corn', - 988: 'acorn', - 989: 'hip, rose hip, rosehip', - 990: 'buckeye, horse chestnut, conker', - 991: 'coral fungus', - 992: 'agaric', - 993: 'gyromitra', - 994: 'stinkhorn, carrion fungus', - 995: 'earthstar', - 996: 'hen-of-the-woods, hen of the woods, Polyporus frondosus, Grifola frondosa', - 997: 'bolete', - 998: 'ear, spike, capitulum', - 999: 'toilet tissue, toilet paper, bathroom tissue' -} diff --git a/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.cs b/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.cs deleted file mode 100644 index ebfc336..0000000 --- a/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; - -namespace BH.Engine.MachineLearning.Vision -{ - public static partial class Compute - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static Tensor SegmentImage(string imagePath, bool gpu = false) - { - return new Tensor(BH.Engine.MachineLearning.Base.Compute.Invoke(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace, "SemanticSegmentation.infer", imagePath, gpu)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.py b/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.py deleted file mode 100644 index 6f63a8b..0000000 --- a/MachineLearning_Engine/Compute/Vision/SemanticSegmentation.py +++ /dev/null @@ -1,62 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -import os -import PIL -import numpy as np -import torch -import torchvision - - -@torch.no_grad() -def infer(image_path: str, gpu: bool=False): - if not (os.path.isfile(image_path)): - raise FileNotFoundError(image_path) - - # intantiace the model - global model - if model is None: - model = torch.hub.load('pytorch/vision:v0.6.0', 'deeplabv3_resnet101', pretrained=True) - model.eval() - - # preprocess image and transform into tensor - pil_image: PIL.Image.Image = PIL.Image.open(image_path) - preprocess = torchvision.transforms.Compose([ - torchvision.transforms.ToTensor(), - torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), - ]) - tensor_image: torch.Tensor = preprocess(pil_image).unsqueeze(0) - - # set accelerators - if gpu: - tensor_image = tensor_image.cuda() - model = model.cuda() - else: - tensor_image = tensor_image.cpu() - model = model.cpu() - - # run prediction - output = model(tensor_image).get("out") - return torch.argmax(output, dim=1).squeeze() - - -model = None diff --git a/MachineLearning_Engine/Compute/Vision/__init__.py b/MachineLearning_Engine/Compute/Vision/__init__.py deleted file mode 100644 index a1b068b..0000000 --- a/MachineLearning_Engine/Compute/Vision/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# - -from . import DetectObjects -from . import DrawDetection -from . import FindContours -from . import RecogniseObject -from . import SemanticSegmentation diff --git a/MachineLearning_Engine/Compute/__init__.py b/MachineLearning_Engine/Compute/__init__.py deleted file mode 100644 index 7824ba2..0000000 --- a/MachineLearning_Engine/Compute/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# diff --git a/MachineLearning_Engine/Convert/FromDType.cs b/MachineLearning_Engine/Convert/FromDType.cs deleted file mode 100644 index 4fb669f..0000000 --- a/MachineLearning_Engine/Convert/FromDType.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using Python.Runtime; -using System; - -namespace BH.Engine.MachineLearning -{ - public static partial class Convert - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static Type FromDType(this string type) - { - switch (type.ToString()) - { - case "int16": - return typeof(short); - case "int32": - return typeof(int); - case "int64": - return typeof(long); - case "float16": - return typeof(float); - case "float32": - return typeof(double); - case "float128": - return typeof(decimal); - default: - return typeof(double); - } - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Convert/ToDType.cs b/MachineLearning_Engine/Convert/ToDType.cs deleted file mode 100644 index 8f3b90c..0000000 --- a/MachineLearning_Engine/Convert/ToDType.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using Python.Runtime; -using System; - -namespace BH.Engine.MachineLearning -{ - public static partial class Convert - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static string ToDType(this Type type) - { - switch (type.ToString()) - { - case "System.Int16": - return "int16"; - case "System.Int32": - return "int32"; - case "System.Int64": - return "int64"; - case "System.Single": - return "float16"; - case "System.Double": - return "float32"; - case "System.Decimal": - return "float128"; - default: - return "float32"; - } - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Convert/ToList.cs b/MachineLearning_Engine/Convert/ToList.cs deleted file mode 100644 index a28ff4d..0000000 --- a/MachineLearning_Engine/Convert/ToList.cs +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.oM.Reflection.Attributes; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.ComponentModel; - -namespace BH.Engine.MachineLearning -{ - public static partial class Convert - { - /***************************************************/ - /**** Public Methods ****/ - /***************************************************/ - - [Description("Convert a Tensor to a list of data.")] - [Input("tensor", "A Tensor to be converted.")] - [Output("data", "A list of data contained in the Tensor.")] - public static List ToList(this Tensor tensor) - { - // TODO: For the moment we only provide data as double or int back to C# - // It would be good to find a way to return different types - // The obstacle is that Marshal.Copy does not work on generic types - if (tensor.NumpyArray.IsIterable()) - { - if (Query.DType(tensor) == typeof(int)) - return ToListInt(tensor).Cast().ToList(); - if (Query.DType(tensor) == typeof(double)) - return ToListDouble(tensor).Cast().ToList(); - } - else - { - if (Query.DType(tensor) == typeof(int)) - return new List { ToInt(tensor) }; - if (Query.DType(tensor) == typeof(double)) - return new List { ToDouble(tensor) }; - } - return null; - } - /***************************************************/ - /***************************************************/ - /**** Private Methods ****/ - /***************************************************/ - - [Description("Convert a Tensor to a list of data.")] - [Input("tensor", "A Tensor to be converted.")] - [Output("data", "A list of data contained in the Tensor.")] - private static List ToListDouble(this Tensor tensor) - { - long ptr = tensor.NumpyArray.GetAttr("ctypes").GetAttr("data").As(); - int size = tensor.Size(); - - double[] array = new double[size]; - Marshal.Copy(new IntPtr(ptr), array, 0, array.Length); - - return array.ToList(); - } - - [Description("Convert a Tensor to a list of data.")] - [Input("tensor", "A Tensor to be converted.")] - [Output("data", "A list of data contained in the Tensor.")] - private static List ToListInt(this Tensor tensor) - { - long ptr = tensor.NumpyArray.GetAttr("ctypes").GetAttr("data").As(); - int size = tensor.Size(); - - int[] array = new int[size]; - Marshal.Copy(new IntPtr(ptr), array, 0, array.Length); - - return array.ToList(); - } - - [Description("Convert a Tensor to a list of data.")] - [Input("tensor", "A Tensor to be converted.")] - [Output("data", "A list of data contained in the Tensor.")] - private static int ToInt(this Tensor tensor) - { - return System.Convert.ToInt32(tensor.NumpyArray.ToString()); - } - - [Description("Convert a Tensor to a list of data.")] - [Input("tensor", "A Tensor to be converted.")] - [Output("data", "A list of data contained in the Tensor.")] - private static double ToDouble(this Tensor tensor) - { - return System.Convert.ToDouble(tensor.NumpyArray.ToString()); - } - /***************************************************/ - } -} - - diff --git a/MachineLearning_Engine/Convert/ToPython.cs b/MachineLearning_Engine/Convert/ToPython.cs deleted file mode 100644 index 9a4a1a4..0000000 --- a/MachineLearning_Engine/Convert/ToPython.cs +++ /dev/null @@ -1,144 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using Python.Runtime; -using System; -using System.Collections.Generic; - - -namespace BH.Engine.MachineLearning -{ - public static partial class Convert - { - /***************************************************/ - /**** Public Methods ****/ - /***************************************************/ - - public static PyObject IToPython(dynamic obj) - { - if (obj == null) - return Runtime.GetPyNone(); - - if (obj is PyObject) - return obj; - - return ToPython(obj as dynamic); - } - - /***************************************************/ - - public static PyObject ToPython(this Tensor tensor) - { - return tensor.NumpyArray; - } - - /***************************************************/ - - public static PyObject ToPython(this IEnumerable list, Type dtype = null) - { - return ToNumpyArray(list, dtype); - } - - /***************************************************/ - - public static PyObject ToPython(this IEnumerable> listOfLists, Type dtype = null) - { - return ToNumpyArray(listOfLists, dtype); - } - - /***************************************************/ - - public static PyObject ToPython(this LinearRegression model) - { - return model.SkLearnModel; - } - - /***************************************************/ - - public static PyObject ToPython(this MinMaxScaler scaler) - { - return scaler.SkLearnScaler; - } - - /***************************************************/ - - public static PyObject ToPython(this StandardScaler scaler) - { - return scaler.SkLearnScaler; - } - - /***************************************************/ - - public static PyObject ToPython(this PolynomialFeatures transformer) - { - return transformer.SkLearnTransformer; - } - - /***************************************************/ - - public static PyObject ToPython(this SupportVectorRegression regressor) - { - return regressor.SkLearnModel; - } - - /***************************************************/ - - public static PyObject ToPython(this LogisticRegression regressor) - { - return regressor.SkLearnModel; - } - - - /***************************************************/ - /**** Private Methods ****/ - /***************************************************/ - - private static PyObject ToNumpyArray(this object collection, Type dtype) - { - if (dtype == null) - dtype = typeof(double); - List args = new List { collection }; - Dictionary kwargs = new Dictionary - { - { "dtype", dtype.ToDType() } - }; - return Engine.MachineLearning.Base.Compute.InvokeNumpy("array", args, kwargs); - } - - - /***************************************************/ - /**** Fallback case ****/ - /***************************************************/ - - private static PyObject ToPython(this object obj) - { - // If no method has been found in the MachineLearning_Engine, - // Try to see if there is any convert in the Python_Engine that works - return Engine.Python.Convert.IToPython(obj); - } - - /***************************************************/ - } -} - - diff --git a/MachineLearning_Engine/Create/Tensor.cs b/MachineLearning_Engine/Create/Tensor.cs deleted file mode 100644 index c532811..0000000 --- a/MachineLearning_Engine/Create/Tensor.cs +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - - -using BH.oM.MachineLearning; -using System; -using System.Collections.Generic; - -namespace BH.Engine.MachineLearning -{ - public static partial class Create - { - /*************************************/ - /**** Public Methods ****/ - /*************************************/ - - public static Tensor Tensor(IEnumerable collection, Type dtype = null) - { - return new Tensor(collection.ToPython(dtype)); - } - - /*************************************/ - - public static Tensor Tensor(IEnumerable> collection, Type dtype = null) - { - return new Tensor(collection.ToPython(dtype)); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Extensions/script.py b/MachineLearning_Engine/Extensions/script.py deleted file mode 100644 index cd5cfb7..0000000 --- a/MachineLearning_Engine/Extensions/script.py +++ /dev/null @@ -1 +0,0 @@ -#Empty script to start the extensions folder till we get more items \ No newline at end of file diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 0cb8899..49139e1 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -51,14 +51,13 @@ C:\ProgramData\BHoM\Assemblies\Python_Engine.dll False + + ..\..\..\..\..\..\..\ProgramData\BHoM\Assemblies\Python_oM.dll + C:\ProgramData\BHoM\Assemblies\Reflection_Engine.dll False - - C:\ProgramData\BHoM\Assemblies\Reflection_oM.dll - False - @@ -71,45 +70,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - + @@ -118,50 +81,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + - + + + - - xcopy "$(TargetDir)$(TargetFileName)" "C:\\ProgramData\\BHoM\\Assemblies" /Y -xcopy "$(SolutionDir)*.py" "C:\\ProgramData\\BHoM\\Extensions\\Python\\src\\$(SolutionName)\" /Y /I /S /F -xcopy "$(SolutionDir)requirements.txt" "C:\\ProgramData\\BHoM\\Extensions\\Python\\src\\" /Y /I /S /F -xcopy /E /Y /I "$(ProjectDir)Extensions" "C:\\ProgramData\\BHoM\\Extensions\MachineLearning" + xcopy "$(TargetDir)$(TargetFileName)" "C:\\ProgramData\\BHoM\\Assemblies" /Y +xcopy "$(TargetDir)Python.Runtime.dll" "C:\\ProgramData\\BHoM\\Assemblies" /Y + +:: create infrastructure necessary to support Python environments +if not exist "C:\ProgramData\BHoM\Extensions\PythonEnvironments" mkdir "C:\ProgramData\BHoM\Extensions\PythonEnvironments" +if not exist "C:\ProgramData\BHoM\Extensions\PythonCode" mkdir "C:\ProgramData\BHoM\Extensions\PythonCode" + +:: remove any old versions within target directory for current toolkits Python code +if exist "C:\ProgramData\BHoM\Extensions\PythonCode\$(SolutionName)" rmdir "C:\ProgramData\BHoM\Extensions\PythonCode\$(SolutionName)" /S /Q + +:: move Python code over to toolkit extensions folder, redirecting output to temp log file to silence it +robocopy "$(ProjectDir)Python" "C:\ProgramData\BHoM\Extensions\PythonCode\$(SolutionName)" /s /purge /xf "*.pyc" "*.ipynb" /xd "\__pycache__\" > output.log + +:: remove temporary log file +del output.log \ No newline at end of file diff --git a/MachineLearning_Engine/Modify/AsType.cs b/MachineLearning_Engine/Modify/AsType.cs deleted file mode 100644 index 08db8c4..0000000 --- a/MachineLearning_Engine/Modify/AsType.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using Python.Runtime; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace BH.Engine.MachineLearning -{ - public static partial class Modify - { - /***************************************************/ - /**** Public Methods ****/ - /***************************************************/ - - public static Tensor AsType(this Tensor tensor, string dtype) - { - return new Tensor(Base.Compute.InvokeNumpy("astype", tensor.ToPython(), dtype)); - } - - /***************************************************/ - - public static Tensor AsType(this Tensor tensor, Type dtype) - { - return new Tensor(Base.Compute.InvokeNumpy("astype", tensor.ToPython(), dtype.ToDType())); - } - - /***************************************************/ - } -} - - diff --git a/MachineLearning_Engine/Python/README.md b/MachineLearning_Engine/Python/README.md new file mode 100644 index 0000000..8b28368 --- /dev/null +++ b/MachineLearning_Engine/Python/README.md @@ -0,0 +1,3 @@ +# MeachineLearning_Toolkit + +The code contained here is intended to be used in conjunction with the MachineLEarning_Toolkit, as part of a wider [BHoM](https://bhom.xyz/) installation. \ No newline at end of file diff --git a/MachineLearning_Engine/Python/requirements.txt b/MachineLearning_Engine/Python/requirements.txt new file mode 100644 index 0000000..2ab0c91 --- /dev/null +++ b/MachineLearning_Engine/Python/requirements.txt @@ -0,0 +1,6 @@ +keras==2.9.0 +pandas==1.3.5 +scikit-learn==1.0.2 +scipy==1.7.3 +tensorflow==2.9.1 +torch==1.12.0 \ No newline at end of file diff --git a/MachineLearning_Engine/Python/setup.py b/MachineLearning_Engine/Python/setup.py new file mode 100644 index 0000000..81d185e --- /dev/null +++ b/MachineLearning_Engine/Python/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages +import pathlib + +here = pathlib.Path(__file__).parent.resolve() +long_description = (here / "README.md").read_text(encoding="utf-8") +requirements = [i.strip() for i in (here / "requirements.txt").read_text(encoding="utf-8-sig").splitlines()] + +# TODO - populate values here with values from global config instead +setup( + name="machinelearning_toolkit", + author="BHoM", + author_email="bhombot@burohappold.com", + description="A Python library that enables Python to be used within BHoM workflows", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/BHoM/MachineLearning_Toolkit", + package_dir={"": "src"}, + packages=find_packages(where="src", exclude=['tests']), + install_requires=requirements, +) diff --git a/MachineLearning_Engine/Python/src/__init__.py b/MachineLearning_Engine/Python/src/__init__.py new file mode 100644 index 0000000..83b87df --- /dev/null +++ b/MachineLearning_Engine/Python/src/__init__.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages +import pathlib + +here = pathlib.Path(__file__).parent.resolve() +long_description = (here / "README.md").read_text(encoding="utf-8") +requirements = [i.strip() for i in (here / "requirements.txt").read_text(encoding="utf-8-sig").splitlines()] + +# TODO - populate values here with values from global config instead +setup( + name="cfd_toolkit", + author="BHoM", + author_email="bhombot@burohappold.com", + description="A Python library that enables Python to be used within BHoM workflows", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/BuroHappoldEngineering/CFD_Toolkit", + package_dir={"": "src"}, + packages=find_packages(where="src", exclude=['tests']), + install_requires=requirements, +) diff --git a/MachineLearning_Engine/Python/src/machinelearning_toolkit/__init__.py b/MachineLearning_Engine/Python/src/machinelearning_toolkit/__init__.py new file mode 100644 index 0000000..83b87df --- /dev/null +++ b/MachineLearning_Engine/Python/src/machinelearning_toolkit/__init__.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages +import pathlib + +here = pathlib.Path(__file__).parent.resolve() +long_description = (here / "README.md").read_text(encoding="utf-8") +requirements = [i.strip() for i in (here / "requirements.txt").read_text(encoding="utf-8-sig").splitlines()] + +# TODO - populate values here with values from global config instead +setup( + name="cfd_toolkit", + author="BHoM", + author_email="bhombot@burohappold.com", + description="A Python library that enables Python to be used within BHoM workflows", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/BuroHappoldEngineering/CFD_Toolkit", + package_dir={"": "src"}, + packages=find_packages(where="src", exclude=['tests']), + install_requires=requirements, +) diff --git a/MachineLearning_Engine/Query/DType.cs b/MachineLearning_Engine/Query/DType.cs deleted file mode 100644 index 39f12ed..0000000 --- a/MachineLearning_Engine/Query/DType.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.Engine.Python; -using BH.oM.MachineLearning; -using Python.Runtime; -using System; - -namespace BH.Engine.MachineLearning -{ - public static partial class Query - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static Type DType(this Tensor tensor) - { - string dtype = tensor.NumpyArray?.GetAttr("dtype")?.GetAttr("name")?.FromPython(); - return dtype?.FromDType(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Query/GetAttribute.cs b/MachineLearning_Engine/Query/GetAttribute.cs deleted file mode 100644 index 2990c12..0000000 --- a/MachineLearning_Engine/Query/GetAttribute.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.Engine.Python; -using System.Collections.Generic; - -namespace BH.Engine.MachineLearning -{ - public static partial class Query - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static object GetAttribute(this Tensor tensor, string attribute) - { - return tensor.NumpyArray.GetAttr(attribute).IFromPython(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Query/Import.cs b/MachineLearning_Engine/Query/Import.cs deleted file mode 100644 index 46f2703..0000000 --- a/MachineLearning_Engine/Query/Import.cs +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using Python.Runtime; -using System.Windows.Forms; -using System; -using System.Diagnostics; - -namespace BH.Engine.MachineLearning -{ - public static partial class Query - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static PyObject Import(string module) - { - bool moduleInstalled = Python.Query.IsModuleInstalled(module); - if (moduleInstalled) - return Python.Query.Import(module); - - // if module is not installed ask for automatic installation - string installMessage = $"Cannot import module {module}, because the MachineLearning_Toolkit is not installed. Do you want to install the module?"; - DialogResult confirmResult = MessageBox.Show(installMessage, "BHoM package manager", MessageBoxButtons.YesNoCancel); - - if (confirmResult == DialogResult.Yes) - { - if (!Python.Query.IsModuleInstalled("MachineLearning_Engine")) - { - // InstallMachineLearningToolkit also installs python if it is not found - bool mlToolkitSuccess = Base.Compute.InstallMachineLearningToolkit(true).Item1; - } - } - else - { - string errorMessage = $"Cannot import module {module} because no valid version of Python for the BHoM has been found.\n" + - "Try installing Python and the MachineLearning_Toolkit using the Compute.InstallMachineLearningToolkit component.\n" + - "If the installation process fails, pleae consider reporting a bug at " + - "https://github.com/BHoM/MachineLearning_Toolkit/issues/new?labels=type%3Abug&template=00_bug.md"; - throw new Exception(errorMessage); - } - - return Python.Query.Import(module); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Query/Shape.cs b/MachineLearning_Engine/Query/Shape.cs deleted file mode 100644 index 462f729..0000000 --- a/MachineLearning_Engine/Query/Shape.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.Engine.Python; -using System.Collections.Generic; - -namespace BH.Engine.MachineLearning -{ - public static partial class Query - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static List Shape(this Tensor tensor) - { - return tensor.NumpyArray.GetAttr("shape").IFromPython() as List; - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Query/Size.cs b/MachineLearning_Engine/Query/Size.cs deleted file mode 100644 index bc633e3..0000000 --- a/MachineLearning_Engine/Query/Size.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.MachineLearning; -using BH.Engine.Python; - -namespace BH.Engine.MachineLearning -{ - public static partial class Query - { - /*************************************/ - /**** Public Fields ****/ - /*************************************/ - - public static int Size(this Tensor tensor) - { - return (Base.Compute.InvokeNumpy("size", tensor.ToPython())).FromPython(); - } - - /*************************************/ - } -} - - diff --git a/MachineLearning_Engine/Query/ToolkitName.cs b/MachineLearning_Engine/Query/ToolkitName.cs new file mode 100644 index 0000000..6a51294 --- /dev/null +++ b/MachineLearning_Engine/Query/ToolkitName.cs @@ -0,0 +1,16 @@ +using BH.oM.Base.Attributes; + +using System.ComponentModel; + +namespace BH.Engine.MachineLearning +{ + public static partial class Query + { + [Description("Get the name of the current toolkit.")] + [Output("name", "The name of the current toolkit.")] + public static string ToolkitName() + { + return "MachineLearning_Toolkit"; + } + } +} diff --git a/MachineLearning_Engine/__init__.py b/MachineLearning_Engine/__init__.py deleted file mode 100644 index 7824ba2..0000000 --- a/MachineLearning_Engine/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -# -# This file is part of the Buildings and Habitats object Model (BHoM) -# Copyright (c) 2015 - 2020, the respective contributors. All rights reserved. -# -# Each contributor holds copyright over their respective contributions. -# The project versioning (Git) records all such contribution source information. -# -# -# The BHoM is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3.0 of the License, or -# (at your option) any later version. -# -# The BHoM is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this code. If not, see . -# diff --git a/MachineLearning_Toolkit.sln b/MachineLearning_Toolkit.sln index fa286b0..5a93455 100644 --- a/MachineLearning_Toolkit.sln +++ b/MachineLearning_Toolkit.sln @@ -1,18 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30523.141 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32014.148 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineLearning_Engine", "MachineLearning_Engine\MachineLearning_Engine.csproj", "{61DCF1F4-D6DD-4512-8905-58D1868DA9DB}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MachineLearning_oM", "MachineLearning_oM\MachineLearning_oM.csproj", "{C3F87EBB-3F93-4069-A17F-D55868056ED2}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{82F38474-BA80-4CAA-991C-B787A8D9186E}" - ProjectSection(SolutionItems) = preProject - requirements.txt = requirements.txt - setup.py = setup.py - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/MachineLearning_oM/IRegressionModel.cs b/MachineLearning_oM/IRegressionModel.cs deleted file mode 100644 index 65bcc84..0000000 --- a/MachineLearning_oM/IRegressionModel.cs +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public interface IRegressionModel - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - PyObject SkLearnModel { get; } - } -} - - diff --git a/MachineLearning_oM/IScaler.cs b/MachineLearning_oM/IScaler.cs deleted file mode 100644 index 05dc577..0000000 --- a/MachineLearning_oM/IScaler.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.oM.MachineLearning -{ - public interface IScaler - { - } -} - - diff --git a/MachineLearning_oM/ITransformer.cs b/MachineLearning_oM/ITransformer.cs deleted file mode 100644 index ee2015b..0000000 --- a/MachineLearning_oM/ITransformer.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -namespace BH.oM.MachineLearning -{ - public interface ITransformer - { - } -} - - diff --git a/MachineLearning_oM/LinearRegression.cs b/MachineLearning_oM/LinearRegression.cs deleted file mode 100644 index ed80210..0000000 --- a/MachineLearning_oM/LinearRegression.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class LinearRegression : BHoMObject, IRegressionModel, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnModel { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public LinearRegression(PyObject skLearnModel) - { - SkLearnModel = skLearnModel; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/LogisticRegression.cs b/MachineLearning_oM/LogisticRegression.cs deleted file mode 100644 index 64026df..0000000 --- a/MachineLearning_oM/LogisticRegression.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class LogisticRegression : BHoMObject, IRegressionModel, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnModel { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public LogisticRegression(PyObject skLearnModel) - { - SkLearnModel = skLearnModel; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/MachineLearning_oM.csproj b/MachineLearning_oM/MachineLearning_oM.csproj index caf8094..9a3175e 100644 --- a/MachineLearning_oM/MachineLearning_oM.csproj +++ b/MachineLearning_oM/MachineLearning_oM.csproj @@ -42,9 +42,6 @@ False ..\libs\Python.Runtime.dll - - C:\ProgramData\BHoM\Assemblies\Reflection_oM.dll - @@ -55,19 +52,7 @@ - - - - - - - - - - - - diff --git a/MachineLearning_oM/MinMaxScaler.cs b/MachineLearning_oM/MinMaxScaler.cs deleted file mode 100644 index 6644b28..0000000 --- a/MachineLearning_oM/MinMaxScaler.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class MinMaxScaler : BHoMObject, IScaler, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnScaler { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public MinMaxScaler(PyObject skLearnModel) - { - SkLearnScaler = skLearnModel; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/PolynomialFeatures.cs b/MachineLearning_oM/PolynomialFeatures.cs deleted file mode 100644 index ecddd3c..0000000 --- a/MachineLearning_oM/PolynomialFeatures.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class PolynomialFeatures : BHoMObject, ITransformer, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnTransformer { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public PolynomialFeatures(PyObject skLearnTransformer) - { - SkLearnTransformer = skLearnTransformer; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/StandardScaler.cs b/MachineLearning_oM/StandardScaler.cs deleted file mode 100644 index 345096d..0000000 --- a/MachineLearning_oM/StandardScaler.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class StandardScaler : BHoMObject, IScaler, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnScaler { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public StandardScaler(PyObject skLearnScaler) - { - SkLearnScaler = skLearnScaler; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/SupportVectorRegression.cs b/MachineLearning_oM/SupportVectorRegression.cs deleted file mode 100644 index 09a47a3..0000000 --- a/MachineLearning_oM/SupportVectorRegression.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; - -namespace BH.oM.MachineLearning -{ - public class SupportVectorRegression : BHoMObject, IRegressionModel, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject SkLearnModel { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public SupportVectorRegression(PyObject skLearnModel) - { - SkLearnModel = skLearnModel; - } - - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/Tensor.cs b/MachineLearning_oM/Tensor.cs deleted file mode 100644 index 9a1b94b..0000000 --- a/MachineLearning_oM/Tensor.cs +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using Python.Runtime; -using System; - -namespace BH.oM.MachineLearning -{ - public class Tensor : BHoMObject, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject NumpyArray { get; } = null; - - - /***************************************************/ - /**** Constructor ****/ - /***************************************************/ - - public Tensor(PyObject numpyArray) - { - NumpyArray = numpyArray; - } - - - /***************************************************/ - /**** Constructor ****/ - /***************************************************/ - - public override string ToString() - { - return NumpyArray.ToString(); - } - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/Vision/DetectionResults.cs b/MachineLearning_oM/Vision/DetectionResults.cs deleted file mode 100644 index 65176c6..0000000 --- a/MachineLearning_oM/Vision/DetectionResults.cs +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Geometry; -using System.Collections.Generic; - -namespace BH.oM.MachineLearning.Vision -{ - public class DetectionResults - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual List Boxes { get; set; } = new List(); - - public virtual List Categories { get; set; } = new List(); - - public virtual List Scores { get; set; } = new List(); - - /***************************************************/ - } -} - - diff --git a/MachineLearning_oM/Vision/Image.cs b/MachineLearning_oM/Vision/Image.cs deleted file mode 100644 index a40d1ef..0000000 --- a/MachineLearning_oM/Vision/Image.cs +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of the Buildings and Habitats object Model (BHoM) - * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. - * - * Each contributor holds copyright over their respective contributions. - * The project versioning (Git) records all such contribution source information. - * - * - * The BHoM is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3.0 of the License, or - * (at your option) any later version. - * - * The BHoM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this code. If not, see . - */ - -using BH.oM.Base; -using BH.oM.Geometry; -using Python.Runtime; -using System.Collections.Generic; - -namespace BH.oM.MachineLearning.Vision -{ - public class Image : BHoMObject, IImmutable - { - /***************************************************/ - /**** Properties ****/ - /***************************************************/ - - public virtual PyObject Data { get; } = null; - - - /***************************************************/ - /**** Constructors ****/ - /***************************************************/ - - public Image(PyObject data) - { - Data = data; - } - - - /***************************************************/ - } -} - - From e41284ede3cd21a3a75aa5ee9848a2724fb6b4d7 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Wed, 17 Aug 2022 11:05:36 +0100 Subject: [PATCH 02/12] Updated versioning --- .ci/unit_tests/python/__init_.py | 0 .../MachineLearning_Engine.csproj | 12 +--- MachineLearning_Engine/Versioning_53.json | 60 +++++++++++++++++ MachineLearning_oM/MachineLearning_oM.csproj | 8 +-- MachineLearning_oM/Versioning_53.json | 29 +++++++++ README.md | 64 +------------------ 6 files changed, 95 insertions(+), 78 deletions(-) create mode 100644 .ci/unit_tests/python/__init_.py create mode 100644 MachineLearning_Engine/Versioning_53.json create mode 100644 MachineLearning_oM/Versioning_53.json diff --git a/.ci/unit_tests/python/__init_.py b/.ci/unit_tests/python/__init_.py new file mode 100644 index 0000000..e69de29 diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 49139e1..0586431 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -34,25 +34,17 @@ C:\ProgramData\BHoM\Assemblies\BHoM.dll False - - C:\ProgramData\BHoM\Assemblies\DeepLearning_oM.dll - False - C:\ProgramData\BHoM\Assemblies\Geometry_oM.dll False False - - False - ..\libs\Python.Runtime.dll - C:\ProgramData\BHoM\Assemblies\Python_Engine.dll False - ..\..\..\..\..\..\..\ProgramData\BHoM\Assemblies\Python_oM.dll + C:\ProgramData\BHoM\Assemblies\Python_oM.dll C:\ProgramData\BHoM\Assemblies\Reflection_Engine.dll @@ -82,6 +74,7 @@ + @@ -97,7 +90,6 @@ xcopy "$(TargetDir)$(TargetFileName)" "C:\\ProgramData\\BHoM\\Assemblies" /Y -xcopy "$(TargetDir)Python.Runtime.dll" "C:\\ProgramData\\BHoM\\Assemblies" /Y :: create infrastructure necessary to support Python environments if not exist "C:\ProgramData\BHoM\Extensions\PythonEnvironments" mkdir "C:\ProgramData\BHoM\Extensions\PythonEnvironments" diff --git a/MachineLearning_Engine/Versioning_53.json b/MachineLearning_Engine/Versioning_53.json new file mode 100644 index 0000000..35a0887 --- /dev/null +++ b/MachineLearning_Engine/Versioning_53.json @@ -0,0 +1,60 @@ +{ + "Namespace": { + "ToNew": { + "BH.Engine.Compute.InstallMachineLearningToolkit": "BH.Engine.Compute.MachineLearningPythonToolkit" + }, + "ToOld": { + "BH.Engine.Compute.MachineLearningPythonToolkit": "BH.Engine.Compute.InstallMachineLearningToolkit" + } + }, + "Type": { + "ToNew": {}, + "ToOld": {} + }, + "Property": { + "ToNew": {}, + "ToOld": {} + }, + "MessageForDeleted": { + "BH.Engine.Compute.Audio.PlayAudio": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Audio.RecogniseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Audio.SynthesiseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Charts.Diurnal": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Charts.Frequency": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Charts.Heatmap": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Charts.PlotImage": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Charts.UTCI": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Datasets.LoadCsv": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Invoke": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.InvokeNumpy": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Preprocessing.MinMaxScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Preprocessing.PolynomialFeatures": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Preprocessing.StandardScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Structured.Coefficients": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Structured.LinearRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Structured.LogisticRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Structured.Score": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Structured.SupportVectorRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Text.Answer": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Text.SentimentAnalysis": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Text.Summarise": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Vision.DetectObjects": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Vision.DrawDetection": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Vision.FindContours": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Vision.RecogniseObject": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Compute.Vision.SemanticSegmentation": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Convert.FromDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Convert.ToDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Convert.ToList": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Convert.ToPython": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Create.Tensor": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Modify.AsType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Properties.AssemblyInfo": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Query.DType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Query.GetAttribute": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Query.Import": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Query.Shape": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.Query.Size": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." + }, + "MessageForNoUpgrade": {} +} diff --git a/MachineLearning_oM/MachineLearning_oM.csproj b/MachineLearning_oM/MachineLearning_oM.csproj index 9a3175e..dde614f 100644 --- a/MachineLearning_oM/MachineLearning_oM.csproj +++ b/MachineLearning_oM/MachineLearning_oM.csproj @@ -37,11 +37,6 @@ C:\ProgramData\BHoM\Assemblies\Geometry_oM.dll - - - False - ..\libs\Python.Runtime.dll - @@ -54,6 +49,9 @@ + + + xcopy "$(TargetDir)$(TargetFileName)" "C:\\ProgramData\\BHoM\\Assemblies" /Y diff --git a/MachineLearning_oM/Versioning_53.json b/MachineLearning_oM/Versioning_53.json new file mode 100644 index 0000000..b331b87 --- /dev/null +++ b/MachineLearning_oM/Versioning_53.json @@ -0,0 +1,29 @@ +{ + "Namespace": { + "ToNew": {}, + "ToOld": {} + }, + "Type": { + "ToNew": {}, + "ToOld": {} + }, + "Property": { + "ToNew": {}, + "ToOld": {} + }, + "MessageForDeleted": { + "BH.oM.MachineLearning.IRegressionModel": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.IScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.ITransformer": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.LinearRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.LogisticRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.MinMaxScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.PolynomialFeatures": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.StandardScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.SupportVectorRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.Tensor": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.Vision.DetectionResults": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.oM.MachineLearning.Vision.Image": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." + }, + "MessageForNoUpgrade": {} +} diff --git a/README.md b/README.md index 6330f96..9bfbd91 100644 --- a/README.md +++ b/README.md @@ -1,63 +1 @@ -[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) -## Install me -To install the MachineLearning_Toolkit: -1. Compile: - 1. [BHoM](https://github.com/BHoM/BHoM) - 1. [BHoM_Engine](https://github.com/BHoM/BHoM_Engine) - 1. [BHoM_Adapter](https://github.com/BHoM/BHoM_Adapter) - 1. [BHoM_UI](https://github.com/BHoM/BHoM_UI) - 1. [Rhinoceros_Toolkit](https://github.com/BHoM/Rhinoceros_Toolkit) - 1. [Grasshopper_Toolkit](https://github.com/BHoM/Grasshopper_Toolkit) - 1. [Python_Toolkit](https://github.com/BHoM/Python_Toolkit) - 1. MachineLearning_Toolkit (this repo) -1. Open a UI of your choice (e.g. Grasshopper) -1. Run the `BH.Engine.Python.Compute.InstallPythonToolkit` component and wait for the installation to finish. -1. The installation has succeeded if the install packages include: - - Python 3.7 - - jupyter - - matplotlib - - Python_Toolkit -1. Restart your UI - if using Grasshopper, restart Rhinoceros and Grasshopper -1. Reopen the UI and now install the python bindings of the MachineLearning_Toolkit by running - the `BH.Engine.MachineLearning.Compute.InstallMachineLearningToolkit` component -1. Restart your UI - -Note that the installation will take a while - around 15 minutes. - -## Notes for developers -- The python source files used by Python are stored in `C:\ProgramData\BHoM\Extensions\Python\src`. This folder is populated by the Visual Studio post-build events, which copy all the `*.py` files in the Toolkit into the destination folder. -- If you update a python file in your repo, to update the BHoM you just need to recompile the solution - this will copy the relevant files as described above. -- If you update a `.cs` file, you need to recompile the solution as usual. -- The component `InstallMachineLearningToolkit` installs the additional packages required by the python bindings of the BHoM. You will seldom use this method - usually only the first time. - -Also, take a look at the [Python_Toolkit](https://github.com/BHoM/Python_Toolkit) for additional information: - - -## Adding a new algorithm using python -If you want to add a new algorithm (e.g. KMeans) that requires python, below are the required steps to enable automatic deployment of the mehtod. -1. Add an oM object that stores the model - usually ML algorithms are parameterised functions, whose parameters are stored in a _model_. - The object must be `IImmutable` and usually contains only one field that is a `PyObject`. -1. Add a `Engine.Convert.ToPython` method that takes the new object in and returns a `PyObject` -1. Add your algorithm in the `Engine.Compute` class. The algorithm usually contains three main methods: `Create`, which creates or loads the model; `Fit` that runs the learning routine; and `Infer`, which allows inference on a learnt model. -1. Note that all the python files must be contained into a `youralgorithmname.py` file, in the `Compute` folder, in order for it to work. - - -## Building the BHoM and the Toolkits from Source ## -You will need the following to build BHoM: - -- Microsoft Visual Studio 2013 or higher -- Microsoft .NET Framework 4.0 and above (included with Visual Studio 2013) -- Note that there are no software - specific dependencies (only operating system relevant), this is specific: BHoM is a software agnostic object model. - - -## Want to contribute? ## - -BHoM is an open-source project and would be nothing without its community. Take a look at our contributing guidelines and tips [here](https://github.com/BHoM/BHoM/blob/master/CONTRIBUTING.md). - - -## Licence ## - -BHoM is free software licenced under GNU Lesser General Public Licence - [https://www.gnu.org/licenses/lgpl-3.0.html](https://www.gnu.org/licenses/lgpl-3.0.html) -Each contributor holds copyright over their respective contributions. -The project versioning (Git) records all such contribution source information. -See [LICENSE](https://github.com/BHoM/BHoM/blob/master/LICENSE) and [COPYRIGHT_HEADER](https://github.com/BHoM/BHoM/blob/master/COPYRIGHT_HEADER.txt). +# MachineLearning_Toolkit From 110a94a0f9926d3a32d5be9c61b3826f321c336e Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Wed, 17 Aug 2022 11:07:27 +0100 Subject: [PATCH 03/12] updated gitignore --- .gitignore | 91 ++++++++++++++++++++++++---------------- libs/Python.Runtime.dll | Bin 171520 -> 0 bytes 2 files changed, 56 insertions(+), 35 deletions(-) delete mode 100644 libs/Python.Runtime.dll diff --git a/.gitignore b/.gitignore index 1d90766..0d58204 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,3 @@ -# Python # -########## -__pycache__/ -*.py[cod] -*$py.class -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - - # Compiled source # ################### *.com @@ -31,6 +5,7 @@ MANIFEST *.exe *.o *.so +*.dll # Packages # ############ @@ -82,12 +57,58 @@ bld/ *.suo *.user .vs/ -Alligator/Alligator.csproj.orig -Alligator/Alligator_BACKUP_9848.csproj -Alligator/Alligator_BASE_9848.csproj -Alligator/Alligator_LOCAL_9848.csproj -Alligator/Alligator_REMOTE_9848.csproj - -# Exceptions # -############## -!/lib/*.dll +/BHoM/Acoustic/Database + +# VScode environment files # +############################ +.vscode/ + +# Pycharm environment files # +############################# +.idea/ + +# Python related files # +######################## +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ \ No newline at end of file diff --git a/libs/Python.Runtime.dll b/libs/Python.Runtime.dll deleted file mode 100644 index cb7184e5b4c152bb6be25c902903420fb53e49d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171520 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 I|92etABicFSpWb4 From d9037a44db6e4ef6def435ad56483ee2190af444 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Wed, 17 Aug 2022 12:45:26 +0100 Subject: [PATCH 04/12] fixed compliance error where possible --- ...oolkit.cs => MachineLearningToolkitPythonEnvironment.cs} | 0 MachineLearning_Engine/MachineLearning_Engine.csproj | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename MachineLearning_Engine/Compute/{MachineLearningPythonToolkit.cs => MachineLearningToolkitPythonEnvironment.cs} (100%) diff --git a/MachineLearning_Engine/Compute/MachineLearningPythonToolkit.cs b/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs similarity index 100% rename from MachineLearning_Engine/Compute/MachineLearningPythonToolkit.cs rename to MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 0286dc3..ae2ea53 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -1,4 +1,4 @@ - + @@ -70,7 +70,7 @@ - + @@ -114,4 +114,4 @@ del output.log - + \ No newline at end of file From f941384313cadc8569b0b1a23f1cbcb3c40ec7d7 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Wed, 17 Aug 2022 13:02:46 +0100 Subject: [PATCH 05/12] typo fix --- MachineLearning_Engine/Versioning_53.json | 82 +++++++++++------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/MachineLearning_Engine/Versioning_53.json b/MachineLearning_Engine/Versioning_53.json index 35a0887..e41407d 100644 --- a/MachineLearning_Engine/Versioning_53.json +++ b/MachineLearning_Engine/Versioning_53.json @@ -1,10 +1,10 @@ { "Namespace": { "ToNew": { - "BH.Engine.Compute.InstallMachineLearningToolkit": "BH.Engine.Compute.MachineLearningPythonToolkit" + "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit": "BH.Engine.MachineLearning.Compute.MachineLearningPythonToolkit" }, "ToOld": { - "BH.Engine.Compute.MachineLearningPythonToolkit": "BH.Engine.Compute.InstallMachineLearningToolkit" + "BH.Engine.MachineLearning.Compute.MachineLearningPythonToolkit": "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit" } }, "Type": { @@ -16,45 +16,45 @@ "ToOld": {} }, "MessageForDeleted": { - "BH.Engine.Compute.Audio.PlayAudio": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Audio.RecogniseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Audio.SynthesiseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Charts.Diurnal": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Charts.Frequency": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Charts.Heatmap": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Charts.PlotImage": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Charts.UTCI": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Datasets.LoadCsv": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Invoke": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.InvokeNumpy": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Preprocessing.MinMaxScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Preprocessing.PolynomialFeatures": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Preprocessing.StandardScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Structured.Coefficients": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Structured.LinearRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Structured.LogisticRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Structured.Score": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Structured.SupportVectorRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Text.Answer": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Text.SentimentAnalysis": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Text.Summarise": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Vision.DetectObjects": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Vision.DrawDetection": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Vision.FindContours": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Vision.RecogniseObject": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Compute.Vision.SemanticSegmentation": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Convert.FromDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Convert.ToDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Convert.ToList": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Convert.ToPython": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Create.Tensor": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Modify.AsType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Properties.AssemblyInfo": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Query.DType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Query.GetAttribute": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Query.Import": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Query.Shape": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.Query.Size": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." + "BH.Engine.MachineLearning.Compute.Audio.PlayAudio": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Audio.RecogniseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Audio.SynthesiseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Charts.Diurnal": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Charts.Frequency": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Charts.Heatmap": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Charts.PlotImage": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Charts.UTCI": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Datasets.LoadCsv": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Invoke": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.InvokeNumpy": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Preprocessing.MinMaxScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Preprocessing.PolynomialFeatures": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Preprocessing.StandardScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Structured.Coefficients": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Structured.LinearRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Structured.LogisticRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Structured.Score": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Structured.SupportVectorRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Text.Answer": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Text.SentimentAnalysis": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Text.Summarise": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Vision.DetectObjects": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Vision.DrawDetection": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Vision.FindContours": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Vision.RecogniseObject": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Compute.Vision.SemanticSegmentation": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.FromDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToList": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Create.Tensor": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Modify.AsType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Properties.AssemblyInfo": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.DType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.GetAttribute": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Import": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Shape": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Size": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." }, "MessageForNoUpgrade": {} } From 939c923196cc56db294785b29da422682a63e50f Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Fri, 19 Aug 2022 14:19:00 +0100 Subject: [PATCH 06/12] fixed formatting --- .../MachineLearningToolkitPythonEnvironment.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs b/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs index 4f8b8b8..b9faa28 100644 --- a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs +++ b/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs @@ -35,16 +35,18 @@ public static partial class Compute [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] public static PythonEnvironment MachineLearningToolkitPythonEnvironment(bool run = false) { - if (run) + if (!run) { - return BH.Engine.Python.Compute.InstallVirtualenv( - name: Query.ToolkitName(), - BH.oM.Python.Enums.PythonVersion.v3_7_9, - localPackage: $@"C:\ProgramData\BHoM\Extensions\PythonCode\{Query.ToolkitName()}", - run: run - ); + BH.Engine.Base.Compute.RecordWarning($"Please toggle `{nameof(run)}` to true."); + return null; } - return null; + + return BH.Engine.Python.Compute.InstallVirtualenv( + name: Query.ToolkitName(), + BH.oM.Python.Enums.PythonVersion.v3_7_9, + localPackage: $@"C:\ProgramData\BHoM\Extensions\PythonCode\{Query.ToolkitName()}", + run: run + ); } } } From 74b9befdd94bcb554631c7517ca3d3288bc1b2e4 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Fri, 19 Aug 2022 14:22:15 +0100 Subject: [PATCH 07/12] reverted change due to effect happening upstream in Python_Toolkit --- .../Compute/MachineLearningToolkitPythonEnvironment.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs b/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs index b9faa28..fb5fe10 100644 --- a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs +++ b/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs @@ -35,12 +35,6 @@ public static partial class Compute [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] public static PythonEnvironment MachineLearningToolkitPythonEnvironment(bool run = false) { - if (!run) - { - BH.Engine.Base.Compute.RecordWarning($"Please toggle `{nameof(run)}` to true."); - return null; - } - return BH.Engine.Python.Compute.InstallVirtualenv( name: Query.ToolkitName(), BH.oM.Python.Enums.PythonVersion.v3_7_9, From 26e55c22f3e80e2a0b4ff016d9182fb76b4e48fa Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Thu, 25 Aug 2022 19:53:15 +0100 Subject: [PATCH 08/12] updated installer method name --- ...neLearningToolkitPythonEnvironment.cs => InstallPythonML.cs} | 2 +- MachineLearning_Engine/MachineLearning_Engine.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename MachineLearning_Engine/Compute/{MachineLearningToolkitPythonEnvironment.cs => InstallPythonML.cs} (95%) diff --git a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs b/MachineLearning_Engine/Compute/InstallPythonML.cs similarity index 95% rename from MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs rename to MachineLearning_Engine/Compute/InstallPythonML.cs index fb5fe10..b02c7aa 100644 --- a/MachineLearning_Engine/Compute/MachineLearningToolkitPythonEnvironment.cs +++ b/MachineLearning_Engine/Compute/InstallPythonML.cs @@ -33,7 +33,7 @@ public static partial class Compute [Description("MachineLearning_Toolkit\nMethod used to create the Python environment used to run all Python scripts within this toolkit.")] [Input("run", "Starts the installation of the toolkit if true. Stays idle otherwise.")] [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] - public static PythonEnvironment MachineLearningToolkitPythonEnvironment(bool run = false) + public static PythonEnvironment InstallPythonML(bool run = false) { return BH.Engine.Python.Compute.InstallVirtualenv( name: Query.ToolkitName(), diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index ae2ea53..4d9aacd 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -70,7 +70,7 @@ - + From 002d422e605f9698f8218aa3e2e961821805ec3d Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Fri, 26 Aug 2022 15:02:05 +0100 Subject: [PATCH 09/12] updated versioning and install method name --- .../Compute/{InstallPythonML.cs => InstallPythonEnv_ML.cs} | 2 +- MachineLearning_Engine/MachineLearning_Engine.csproj | 2 +- MachineLearning_Engine/Versioning_53.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename MachineLearning_Engine/Compute/{InstallPythonML.cs => InstallPythonEnv_ML.cs} (96%) diff --git a/MachineLearning_Engine/Compute/InstallPythonML.cs b/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs similarity index 96% rename from MachineLearning_Engine/Compute/InstallPythonML.cs rename to MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs index b02c7aa..bf4fc87 100644 --- a/MachineLearning_Engine/Compute/InstallPythonML.cs +++ b/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs @@ -33,7 +33,7 @@ public static partial class Compute [Description("MachineLearning_Toolkit\nMethod used to create the Python environment used to run all Python scripts within this toolkit.")] [Input("run", "Starts the installation of the toolkit if true. Stays idle otherwise.")] [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] - public static PythonEnvironment InstallPythonML(bool run = false) + public static PythonEnvironment InstallPythonEnv_ML(bool run = false) { return BH.Engine.Python.Compute.InstallVirtualenv( name: Query.ToolkitName(), diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 4d9aacd..61e1797 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -70,7 +70,7 @@ - + diff --git a/MachineLearning_Engine/Versioning_53.json b/MachineLearning_Engine/Versioning_53.json index e41407d..bec909e 100644 --- a/MachineLearning_Engine/Versioning_53.json +++ b/MachineLearning_Engine/Versioning_53.json @@ -1,10 +1,10 @@ { "Namespace": { "ToNew": { - "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit": "BH.Engine.MachineLearning.Compute.MachineLearningPythonToolkit" + "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit": "BH.Engine.MachineLearning.Compute.InstallPythonEnv_ML" }, "ToOld": { - "BH.Engine.MachineLearning.Compute.MachineLearningPythonToolkit": "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit" + "BH.Engine.MachineLearning.Compute.InstallPythonEnv_ML": "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit" } }, "Type": { From 96c170d86a5a8efb0a73a317bfddc3d89d16f8ad Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Thu, 8 Sep 2022 16:54:51 +0100 Subject: [PATCH 10/12] more verisoning fun --- .../Compute/InstallPythonEnv_ML.cs | 1 + MachineLearning_Engine/Versioning_53.json | 140 +++++++++++------- 2 files changed, 84 insertions(+), 57 deletions(-) diff --git a/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs b/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs index bf4fc87..9a894d6 100644 --- a/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs +++ b/MachineLearning_Engine/Compute/InstallPythonEnv_ML.cs @@ -33,6 +33,7 @@ public static partial class Compute [Description("MachineLearning_Toolkit\nMethod used to create the Python environment used to run all Python scripts within this toolkit.")] [Input("run", "Starts the installation of the toolkit if true. Stays idle otherwise.")] [Output("pythonEnvironment", "The MachineLearning_Toolkit Python environment.")] + [PreviousVersion("5.3", "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit(System.Boolean, System.Boolean)")] public static PythonEnvironment InstallPythonEnv_ML(bool run = false) { return BH.Engine.Python.Compute.InstallVirtualenv( diff --git a/MachineLearning_Engine/Versioning_53.json b/MachineLearning_Engine/Versioning_53.json index bec909e..b857e30 100644 --- a/MachineLearning_Engine/Versioning_53.json +++ b/MachineLearning_Engine/Versioning_53.json @@ -1,60 +1,86 @@ { - "Namespace": { - "ToNew": { - "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit": "BH.Engine.MachineLearning.Compute.InstallPythonEnv_ML" + "Namespace": { + "ToNew": { + }, + "ToOld": { + } }, - "ToOld": { - "BH.Engine.MachineLearning.Compute.InstallPythonEnv_ML": "BH.Engine.MachineLearning.Base.Compute.InstallMachineLearningToolkit" + "Type": { + "ToNew": { + + }, + "ToOld": { + } + }, + "Property": { + "ToNew": { + }, + "ToOld": { + } + }, + "MessageForDeleted": { + "BH.Engine.MachineLearning.Audio.Compute.PlayAudio(BH.oM.MachineLearning.Tensor, System.Int32, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Audio.Compute.RecogniseSpeech(System.String, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Audio.Compute.SynthesiseSpeech(System.String, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Base.Compute.Invoke(System.String, System.String, System.Collections.Generic.Dictionary)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Base.Compute.Invoke(System.String, System.String, System.Object[])": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Base.Compute.InvokeNumpy(System.String, System.Collections.Generic.IEnumerable, System.Collections.Generic.Dictionary)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Base.Compute.InvokeNumpy(System.String, System.Object[])": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotDiurnal(System.Collections.Generic.List, System.String, System.String, System.Collections.Generic.List, System.String, System.String, System.String, System.String, System.Boolean, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotFrequency(System.Collections.Generic.List, System.String, System.String, System.String, System.Collections.Generic.List, System.Int32, System.String, System.String, System.Boolean, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotHeatmap(System.Collections.Generic.List, System.String, System.String, System.String, System.Collections.Generic.List, System.String, System.String, System.Boolean, System.Boolean, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotImage(BH.oM.MachineLearning.Tensor, System.Int32, System.Int32, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotImage(BH.oM.MachineLearning.Vision.Image, System.Int32, System.Int32, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Charts.Compute.PlotUTCI(System.Collections.Generic.List, System.String, System.Boolean, System.String, System.String, System.Boolean, System.Boolean, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.FromDType(System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.IToPython(System.Object)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToDType(System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToList(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.LinearRegression)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(System.Collections.Generic.IEnumerable, System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(System.Collections.Generic.IEnumerable>, System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.LogisticRegression)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.MinMaxScaler)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.PolynomialFeatures)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.StandardScaler)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.SupportVectorRegression)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Convert.ToPython(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Create.Tensor(System.Collections.Generic.IEnumerable>, System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Create.Tensor(System.Collections.Generic.IEnumerable, System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Datasets.Compute.LoadCsv(System.String, System.String, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Modify.AsType(BH.oM.MachineLearning.Tensor, System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Modify.AsType(BH.oM.MachineLearning.Tensor, System.Type)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.Infer(BH.oM.MachineLearning.MinMaxScaler, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.Infer(BH.oM.MachineLearning.PolynomialFeatures, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.Infer(BH.oM.MachineLearning.StandardScaler, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.InferInverse(BH.oM.MachineLearning.MinMaxScaler, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.InferInverse(BH.oM.MachineLearning.StandardScaler, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.MinMaxScaler(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.PolynomialFeatures(System.Int32, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Preprocessing.Compute.StandardScaler(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.DType(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.GetAttribute(BH.oM.MachineLearning.Tensor, System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Import(System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Shape(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Query.Size(BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.Coefficients(BH.oM.MachineLearning.IRegressionModel)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.Infer(BH.oM.MachineLearning.LinearRegression, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.Infer(BH.oM.MachineLearning.LogisticRegression, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.Infer(BH.oM.MachineLearning.SupportVectorRegression, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.LinearRegression(BH.oM.MachineLearning.Tensor, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.LogisticRegression(BH.oM.MachineLearning.Tensor, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.Score(BH.oM.MachineLearning.IRegressionModel, BH.oM.MachineLearning.Tensor, BH.oM.MachineLearning.Tensor)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Structured.Compute.SupportVectorRegression(BH.oM.MachineLearning.Tensor, BH.oM.MachineLearning.Tensor, System.String, System.Int32, System.Double)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Text.Compute.Answer(System.String, System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Text.Compute.SentimentAnalysis(System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Text.Compute.Summarise(System.String)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Vision.Compute.DetectObjects(System.String, System.Boolean, System.Double)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Vision.Compute.DrawDetection(System.String, Python.Runtime.PyObject, System.Double)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Vision.Compute.FindContours(BH.oM.MachineLearning.Tensor, System.Int32)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Vision.Compute.RecogniseObject(System.String, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", + "BH.Engine.MachineLearning.Vision.Compute.SegmentImage(System.String, System.Boolean)": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." + + }, + "MessageForNoUpgrade": { } - }, - "Type": { - "ToNew": {}, - "ToOld": {} - }, - "Property": { - "ToNew": {}, - "ToOld": {} - }, - "MessageForDeleted": { - "BH.Engine.MachineLearning.Compute.Audio.PlayAudio": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Audio.RecogniseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Audio.SynthesiseSpeech": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Charts.Diurnal": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Charts.Frequency": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Charts.Heatmap": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Charts.PlotImage": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Charts.UTCI": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Datasets.LoadCsv": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Invoke": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.InvokeNumpy": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Preprocessing.MinMaxScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Preprocessing.PolynomialFeatures": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Preprocessing.StandardScaler": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Structured.Coefficients": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Structured.LinearRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Structured.LogisticRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Structured.Score": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Structured.SupportVectorRegression": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Text.Answer": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Text.SentimentAnalysis": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Text.Summarise": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Vision.DetectObjects": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Vision.DrawDetection": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Vision.FindContours": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Vision.RecogniseObject": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Compute.Vision.SemanticSegmentation": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Convert.FromDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Convert.ToDType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Convert.ToList": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Convert.ToPython": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Create.Tensor": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Modify.AsType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Properties.AssemblyInfo": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Query.DType": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Query.GetAttribute": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Query.Import": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Query.Shape": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues.", - "BH.Engine.MachineLearning.Query.Size": "This method was originally included in BHoM to enable the use of Python.NET. This workflow has been removed in favour of use of Python virtual environments managed via BHoM in order to simplify the passing of data between the two languages. If further assistance is needed, please raise an issue on https://github.com/BHoM/MachineLearning_Toolkit/issues." - }, - "MessageForNoUpgrade": {} -} +} \ No newline at end of file From c2abf9e430a237dfe7f4b416874d28f12971518d Mon Sep 17 00:00:00 2001 From: Tristan Gerrish Date: Fri, 9 Sep 2022 09:41:09 +0100 Subject: [PATCH 11/12] Fixed for copyright and project compliance --- .../MachineLearning_Engine.csproj | 4 ++- MachineLearning_Engine/Query/ToolkitName.cs | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 61e1797..26e42ce 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -50,8 +50,10 @@ False False - + C:\ProgramData\BHoM\Assemblies\Python_oM.dll + False + False C:\ProgramData\BHoM\Assemblies\Reflection_Engine.dll diff --git a/MachineLearning_Engine/Query/ToolkitName.cs b/MachineLearning_Engine/Query/ToolkitName.cs index 6a51294..8a4c1c8 100644 --- a/MachineLearning_Engine/Query/ToolkitName.cs +++ b/MachineLearning_Engine/Query/ToolkitName.cs @@ -1,4 +1,27 @@ -using BH.oM.Base.Attributes; +/* + * This file is part of the Buildings and Habitats object Model (BHoM) + * Copyright (c) 2015 - 2022, the respective contributors. All rights reserved. + * + * Each contributor holds copyright over their respective contributions. + * The project versioning (Git) records all such contribution source information. + * + * + * The BHoM is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3.0 of the License, or + * (at your option) any later version. + * + * The BHoM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this code. If not, see . + */ + + +using BH.oM.Base.Attributes; using System.ComponentModel; From 8c7635be4e318aa1f21d191eda26f6fbc6693ac1 Mon Sep 17 00:00:00 2001 From: Tristan Gerrish <10939984+tg359@users.noreply.github.com> Date: Fri, 9 Sep 2022 10:39:15 +0100 Subject: [PATCH 12/12] Update MachineLearning_Engine.csproj Fixed csproj for versioning --- MachineLearning_Engine/MachineLearning_Engine.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MachineLearning_Engine/MachineLearning_Engine.csproj b/MachineLearning_Engine/MachineLearning_Engine.csproj index 26e42ce..76fbe3d 100644 --- a/MachineLearning_Engine/MachineLearning_Engine.csproj +++ b/MachineLearning_Engine/MachineLearning_Engine.csproj @@ -50,7 +50,7 @@ False False - + C:\ProgramData\BHoM\Assemblies\Python_oM.dll False False @@ -116,4 +116,4 @@ del output.log - \ No newline at end of file +