From 755bcfd6f73fa0c6d92aa18c6bf4f23cf3b4f9d6 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 02:58:57 +0200 Subject: [PATCH 01/19] deleted --- simulation/opt_m.py | 101 --------------------------------------- simulation/smh2.png | Bin 47580 -> 0 bytes simulation/test_iris1.py | 89 ---------------------------------- simulation/test_wdbc1.py | 89 ---------------------------------- simulation/wdbc1.png | Bin 48508 -> 0 bytes 5 files changed, 279 deletions(-) delete mode 100644 simulation/opt_m.py delete mode 100644 simulation/smh2.png delete mode 100644 simulation/test_iris1.py delete mode 100644 simulation/test_wdbc1.py delete mode 100644 simulation/wdbc1.png diff --git a/simulation/opt_m.py b/simulation/opt_m.py deleted file mode 100644 index a84f5df..0000000 --- a/simulation/opt_m.py +++ /dev/null @@ -1,101 +0,0 @@ -from sklearn.datasets import load_iris -from sklearn.preprocessing import StandardScaler -from sklearn.model_selection import train_test_split -from prosemble import Hybrid -import matplotlib.pyplot as plt -import numpy as np - - -def simulate_m(x, y_): - """ - - :param x: Test set - :param y_:list : set of possible fuzzifiers - :return: classification label securities based on the fuzzifiers - """ - security_dat1 = [glvq.get_security(x, i) for i in y_] - security_dat2 = [gmlvq.get_security_m(x, i) for i in y_] - security_dat3 = [celvq.get_security(x, i) for i in y_] - return security_dat1, security_dat2, security_dat3 - - -def optimise_m(x): - """ - :param x: int: model evaluation performance measure(eg average accuracy from CV) - :return: returns optimized fuzzier for the classification label securities - """ - m = round((1 / (x * x)) + 1) - return round(m) - - -def sim_mlist(x, y_, z): - """ - - :param x: Test set - :param y_:List : set of possible fuzzifiers - :param z: index of sample data from the test set - :return: list: Classification label securities for a sample data based on the set list of fuzzifiers - """ - simulated_mlist = [i_[1][1] for i_ in simulate_m(x, y_)[z]] - return simulated_mlist - - -def sim_m(): - """ - - :return: List: Optimized fuzzifiers based on simulated list of model performance evaluation measure. - """ - r = np.arange(0.4, 1.1, 0.1) - m_list = [optimise_m(i) for i in r] - return m_list, r - - -if __name__ == '__main__': - # Data_set and scaling - scaler = StandardScaler() - X, y = load_iris(return_X_y=True) - X = X[:, 0:2] - - X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) - scaler.fit(X_train) - # X_train = scaler.fit_transform(X_train) - X_test = scaler.transform(X_test) - - # summary of input parameters - proto_classes = np.array([0, 1, 2]) - - # Transferred learned prototypes for glvq, gmlvq and celvq respectively - glvq_prototypes = np.array([[-1.092267, 0.9856019], [-0.29071018, -1.230379], [1.5310693, 0.08934504]]) - gmlvq_prototypes = np.array([[-0.97786397, 0.8252505], [-0.25761604, -0.49248296], [1.2729689, 0.05621301]]) - celvq_prototypes = np.array([[-1.654047, 1.1912421], [0.06487547, -1.4322541], [1.6647131, -0.4211262]]) - omega_matrix = np.array([[1.3414, -0.6254], [-0.5219, 0.2435]]) - - # object of the Hybrid class - glvq = Hybrid(model_prototypes=glvq_prototypes, proto_classes=proto_classes, mm=3, omega_matrix=None, matrix='n') - gmlvq = Hybrid(model_prototypes=gmlvq_prototypes, proto_classes=proto_classes, mm=3, omega_matrix=omega_matrix, matrix='y') - celvq = Hybrid(model_prototypes=celvq_prototypes,proto_classes=proto_classes, mm=3, omega_matrix=None, matrix='n') - - # simulate ensemble lvq based on transfer learning with glvq, gmlvq and celvq learned prototypes - ym = [2, 3, 4, 5, 6, 7, 8, 9, 10] - - a, b = sim_m() - glvq_sim_sec = sim_mlist(x=X_test, y_=ym, z=0) - gmlvq_sim_sec = sim_mlist(x=X_test, y_=ym, z=1) - celvq_sim_sec = sim_mlist(x=X_test, y_=ym, z=2) - - print(glvq_sim_sec) - print(a) - f = plt.figure(1) - plt.plot(ym, glvq_sim_sec, label='GLVQ') - plt.plot(ym, gmlvq_sim_sec, label='GMLVQ') - plt.plot(ym, celvq_sim_sec, label='CELVQ') - plt.xlabel('m') - plt.ylabel('classification label security') - plt.legend() - - p = plt.figure(2) - plt.plot(a, b) - plt.xlabel('optimised m') - plt.ylabel('Test accuracy') - - plt.show() diff --git a/simulation/smh2.png b/simulation/smh2.png deleted file mode 100644 index 134eb757503c9dc0f57990c6488e6bdf7dbfa131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47580 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 diff --git a/simulation/test_iris1.py b/simulation/test_iris1.py deleted file mode 100644 index 62eb994..0000000 --- a/simulation/test_iris1.py +++ /dev/null @@ -1,89 +0,0 @@ -from sklearn.datasets import load_iris -from sklearn.preprocessing import StandardScaler -from sklearn.model_selection import train_test_split -from prosemble import Hybrid -import matplotlib.pyplot as plt -import numpy as np - -# Data_set and scaling -scaler = StandardScaler() -X, y = load_iris(return_X_y=True) -X = X[:, 0:2] - - -# select test set for the simulation -def select_(x, i_): - X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=i_) - scaler.fit(X_train) - # X_train = scaler.fit_transform(X_train) - X_test = scaler.transform(X_test) - return X_test, y_test - - -# summary of input parameters -proto_classes = np.array([0, 1, 2]) - -# Transferred learned prototypes for glvq, gmlvq and celvq respectively -glvq_prototypes = np.array([[-1.092267, 0.9856019], [-0.29071018, -1.230379], [1.5310693, 0.08934504]]) -gmlvq_prototypes = np.array([[-0.97786397, 0.8252505], [-0.25761604, -0.49248296], [1.2729689, 0.05621301]]) -celvq_prototypes = np.array([[-1.654047, 1.1912421], [0.06487547, -1.4322541], [1.6647131, -0.4211262]]) -omega_matrix = np.array([[1.3414, -0.6254], [-0.5219, 0.2435]]) - -# object of the Hybrid class -glvq = Hybrid(model_prototypes=glvq_prototypes, proto_classes=proto_classes, mm=3, omega_matrix=None, matrix='n') -gmlvq = Hybrid(model_prototypes=gmlvq_prototypes, proto_classe=proto_classes,mm=3, omega_matrix=omega_matrix, matrix='y') -celvq = Hybrid(model_prototypes=celvq_prototypes, proto_classes=proto_classes, mm=3, omega_matrix=None, matrix='n') - - -# simulate ensemble lvq based on transfer learning with glvq, gmlvq and celvq learned prototypes -def simulation(x): - """ - :param x: x_test - :return: - Simulated accuracy for both hard and soft voting - """ - accuracy_list1 = [] - simu_list1 = [] - accuracy_list = [] - simu_list = [] - # test_ss = np.arange(0.2, 1, 0.1) - for i in range(20): - a, b = select_(x, i_=0.2) - pred1 = glvq.predict(x_test=a) - pred2 = gmlvq.predict(x_test=a) - pred3 = celvq.predict(x_test=a) - sec1 = glvq.get_security(x=a, y=2) - sec2 = gmlvq.get_security_m(x=a, y=2) - sec3 = celvq.get_security(x=a, y=2) - all_pred = [pred1, pred2, pred3] - all_sec = [sec1, sec2, sec3] - final_pred1 = glvq.pred_sprob(x=a, y=all_sec) - accuracy1 = glvq.accuracy(x=b, y=final_pred1) - final_pred = glvq.pred_prob(x=a, y=all_pred) - accuracy = glvq.accuracy(x=b, y=final_pred) - accuracy_list1.append(accuracy1) - simu_list1.append(i) - accuracy_list.append(accuracy) - simu_list.append(i) - return accuracy_list, simu_list, accuracy_list1, simu_list1 - - -# simulation results -p, r, s, t = simulation(x=X) - -# summary simulation results for soft voting -simulated_accuracy1 = s -simulated_list1 = t - -# summary simulation results for hard voting -simulated_accuracy = p -simulated_list = r - -# plot simulated results of transfer learning in ensemble lvq -plt.plot(simulated_list1, simulated_accuracy1, label='soft voting', marker='o') -plt.plot(simulated_list, simulated_accuracy, label='hard voting', marker='v') - -plt.xlabel('Simulations') -plt.ylabel('Accuracy(%)') -plt.legend() -plt.show() diff --git a/simulation/test_wdbc1.py b/simulation/test_wdbc1.py deleted file mode 100644 index ce011d6..0000000 --- a/simulation/test_wdbc1.py +++ /dev/null @@ -1,89 +0,0 @@ -from sklearn.datasets import load_breast_cancer -from sklearn.preprocessing import StandardScaler -from sklearn.model_selection import train_test_split -from prosemble import Hybrid -import matplotlib.pyplot as plt -import numpy as np - -# Data_set and scaling -scaler = StandardScaler() -X, y = load_breast_cancer(return_X_y=True) -X = X[:, 0:2] - - -# select test set for the simulation -def select_(x, i_): - X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=i_) - scaler.fit(X_train) - # X_train = scaler.fit_transform(X_train) - X_test = scaler.transform(X_test) - return X_test, y_test - - -# summary of input parameters -proto_classes = np.array([0, 1]) - -# Transferred learned prototypes for glvq, gmlvq and celvq respectively -glvq_prototypes = np.array([[1.8459078, 0.7657392], [-0.7304492, -0.5764439]]) -gmlvq_prototypes = np.array([[1.1675262, 0.9516143], [-0.6120413, -0.51750517]]) -celvq_prototypes = np.array([[2.766608, 0.9153884], [-1.994142, -0.9101994]]) -omega_matrix = np.array([[1.4325, 0.7964], [0.3552, 0.1990]]) - -# object of the Hybrid class -glvq = Hybrid(model_prototypes=glvq_prototypes, proto_classes=proto_classes, mm=2, omega_matrix=None, matrix='n') -gmlvq = Hybrid(model_prototypes=gmlvq_prototypes, proto_classes=proto_classes, mm=2, omega_matrix=omega_matrix, matrix='y') -celvq = Hybrid(model_prototypes=celvq_prototypes, proto_classes=proto_classes, mm=2, omega_matrix=None, matrix='n') - - -# simulate ensemble lvq based on transfer learning with glvq, gmlvq and celvq learned prototypes -def simulation(x): - """ - :param x: x_test - :return: - Simulated accuracy for both hard and soft voting - """ - accuracy_list1 = [] - simu_list1 = [] - accuracy_list = [] - simu_list = [] - # test_ss = np.arange(0.2, 1, 0.1) - for i in range(20): - a, b = select_(x, i_=0.2) - pred1 = glvq.predict(x_test=a) - pred2 = gmlvq.predict(x_test=a) - pred3 = celvq.predict(x_test=a) - sec1 = glvq.get_security(x=a, y=2) - sec2 = gmlvq.get_security_m(x=a, y=2) - sec3 = celvq.get_security(x=a, y=2) - all_pred = [pred1, pred2, pred3] - all_sec = [sec1, sec2, sec3] - final_pred1 = glvq.pred_sprob(x=a, y=all_sec) - accuracy1 = glvq.accuracy(x=b, y=final_pred1) - final_pred = glvq.pred_prob(x=a, y=all_pred) - accuracy = glvq.accuracy(x=b, y=final_pred) - accuracy_list1.append(accuracy1) - simu_list1.append(i) - accuracy_list.append(accuracy) - simu_list.append(i) - return accuracy_list, simu_list, accuracy_list1, simu_list1 - - -# simulation results -p, r, s, t = simulation(x=X) - -# summary simulation results for soft voting -simulated_accuracy1 = s -simulated_list1 = t - -# summary simulation results for hard voting -simulated_accuracy = p -simulated_list = r - -# plot simulated results of transfer learning in ensemble lvq -plt.plot(simulated_list1, simulated_accuracy1, label='soft voting', marker='o') -plt.plot(simulated_list, simulated_accuracy, label='hard voting', marker='v') - -plt.xlabel('Simulations') -plt.ylabel('Accuracy(%)') -plt.legend() -plt.show() diff --git a/simulation/wdbc1.png b/simulation/wdbc1.png deleted file mode 100644 index 473605ebbff1a256f2adf130202920c5c2a95b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48508 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 E1{-sNVgLXD From 385a4a0bf235c2897b95f5eb2e0094678672b054 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 02:59:11 +0200 Subject: [PATCH 02/19] deleted --- requiremenst.txt | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 requiremenst.txt diff --git a/requiremenst.txt b/requiremenst.txt deleted file mode 100644 index 0b13d78..0000000 --- a/requiremenst.txt +++ /dev/null @@ -1,4 +0,0 @@ -numpy -scikit-learn -scipy -matplotlib From 8f3e2beea0e0921d83b815a6fa3448af8f260377 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:03:38 +0200 Subject: [PATCH 03/19] updated package --- .editorconfig | 21 +++++ .github/ISSUE_TEMPLATE/bug_report.md | 25 +++++ .github/ISSUE_TEMPLATE/config.yml | 10 ++ .github/ISSUE_TEMPLATE/feature_request.md | 18 ++++ .github/workflows/docs-build.yml | 51 ++++++++++ .github/workflows/docs.yml | 28 ++++++ .github/workflows/macos.yml | 38 ++++++++ .github/workflows/pypi.yml | 30 ++++++ .github/workflows/ubuntu.yml | 46 +++++++++ .github/workflows/windows.yml | 31 +++++++ .gitignore | 106 +++++++++++++++++++++ LICENSE | 43 ++++----- MANIFEST.in | 7 ++ docs/changelog.md | 11 +++ docs/common.md | 3 + docs/contributing.md | 108 ++++++++++++++++++++++ docs/examples/intro.ipynb | 21 +++++ docs/faq.md | 1 + docs/index.md | 16 ++++ docs/installation.md | 21 +++++ docs/overrides/main.html | 11 +++ docs/prosemble.md | 4 + docs/usage.md | 7 ++ mkdocs.yml | 86 +++++++++++++++++ prosemble/__init__.py | 2 +- prosemble/models/__init__.py | 2 + prosemble/models/kipcm.py | 4 +- requirements.txt | 5 + requirements_dev.txt | 12 +++ requirements_docs.txt | 24 +++++ setup.cfg | 22 +++++ setup.py | 57 ++++++++++++ tests/__init__.py | 1 + tests/test_prosemble.py | 21 +++++ 34 files changed, 869 insertions(+), 24 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/docs-build.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/macos.yml create mode 100644 .github/workflows/pypi.yml create mode 100644 .github/workflows/ubuntu.yml create mode 100644 .github/workflows/windows.yml create mode 100644 .gitignore create mode 100644 MANIFEST.in create mode 100644 docs/changelog.md create mode 100644 docs/common.md create mode 100644 docs/contributing.md create mode 100644 docs/examples/intro.ipynb create mode 100644 docs/faq.md create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/overrides/main.html create mode 100644 docs/prosemble.md create mode 100644 docs/usage.md create mode 100644 mkdocs.yml create mode 100644 requirements.txt create mode 100644 requirements_dev.txt create mode 100644 requirements_docs.txt create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tests/__init__.py create mode 100644 tests/test_prosemble.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d4a2c44 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +end_of_line = lf + +[*.bat] +indent_style = tab +end_of_line = crlf + +[LICENSE] +insert_final_newline = false + +[Makefile] +indent_style = tab diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..c57446e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug Report +about: Create a bug report to help us improve +labels: bug +--- + + + +### Environment Information + +- prosemble version: +- Python version: +- Operating System: + +### Description + +Describe what you were trying to get done. +Tell us what happened, what went wrong, and what you expected to happen. + +### What I Did + +``` +Paste the command(s) you ran and the output. +If there was a crash, please include the traceback here. +``` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..15c9579 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,10 @@ +contact_links: + - name: Ask questions + url: https://github.com/naotoo1/prosemble/discussions/categories/q-a + about: Please ask and answer questions here. + - name: Ideas + url: https://github.com/naotoo1/prosemble/discussions/categories/ideas + about: Please share your ideas here. + - name: Ask questions from the GIS community + url: https://gis.stackexchange.com + about: To get answers from questions in the GIS community, please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..cf7acb9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature Request +about: Submit a feature request to help us improve +labels: Feature Request +--- + + + +### Description + +Describe the feature (e.g., new functions/tutorials) you would like to propose. +Tell us what can be achieved with this new feature and what's the expected outcome. + +### Source code + +``` +Paste your source code here if have sample code to share. +``` diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml new file mode 100644 index 0000000..57096bc --- /dev/null +++ b/.github/workflows/docs-build.yml @@ -0,0 +1,51 @@ +name: docs-build +on: + pull_request: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-python@v4 + with: + python-version: "3.10" + - name: Install GDAL + run: | + python -m pip install --upgrade pip + pip install --find-links=https://girder.github.io/large_image_wheels --no-cache GDAL pyproj + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + pip install --no-cache-dir Cython + pip install -r requirements.txt -r requirements_dev.txt -r requirements_docs.txt + pip install . + - name: Discover typos with codespell + run: codespell --skip="*.csv,*.geojson,*.json,*.js,*.html,*cff,*.pdf,./.git" --ignore-words-list="aci,acount,acounts,fallow,hart,hist,nd,ned,ois,wqs" + - name: PKG-TEST + run: | + python -m unittest discover tests/ + - name: Build docs + run: | + mkdocs build + # - name: Deploy to Netlify + # uses: nwtgck/actions-netlify@v2.0 + # with: + # publish-dir: "./site" + # production-branch: master + # github-token: ${{ secrets.GITHUB_TOKEN }} + # deploy-message: "Deploy from GitHub Actions" + # enable-pull-request-comment: true + # enable-commit-comment: false + # overwrites-pull-request-comment: true + # env: + # NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} + # NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} + # timeout-minutes: 10 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..7262e05 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,28 @@ +name: docs +on: + push: + branches: + - main +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: 3.9 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --user --no-cache-dir Cython + pip install --user -r requirements.txt + pip install . + - name: Discover typos with codespell + run: | + pip install codespell + codespell --skip="*.csv,*.geojson,*.json,*.js,*.html,*cff,./.git" --ignore-words-list="aci,acount,acounts,fallow,hart,hist,nd,ned,ois,wqs,watermask" + - name: PKG-TEST + run: | + python -m unittest discover tests/ + - run: pip install -r requirements_docs.txt + - run: mkdocs gh-deploy --force diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 0000000..3bb390c --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,38 @@ +on: + push: + branches: + - main + pull_request: + branches: + - main + +name: macOS build +jobs: + test-macOS: + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} (${{ matrix.python-version}}) + strategy: + fail-fast: false + matrix: + os: ["macOS-latest"] + python-version: ["3.10"] + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version}} + - name: Install GDAL + run: | + brew install gdal + - name: Test GDAL installation + run: | + gdalinfo --version + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install -r requirements.txt + pip install . diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..2bbb0c0 --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,30 @@ +# This workflows will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: pypi + +on: + release: + types: [created] + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.x" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERS }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml new file mode 100644 index 0000000..dd78cdd --- /dev/null +++ b/.github/workflows/ubuntu.yml @@ -0,0 +1,46 @@ +on: + push: + branches: + - main + pull_request: + branches: + - main + +name: Linux build +jobs: + py-check: + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.os }} (${{ matrix.config.py }}) + strategy: + fail-fast: false + matrix: + config: + - { os: ubuntu-latest, py: "3.8" } + - { os: ubuntu-latest, py: "3.9" } + - { os: ubuntu-latest, py: "3.10" } + - { os: ubuntu-latest, py: "3.11" } + steps: + - name: Checkout Code + uses: actions/checkout@v3 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.config.py }} + - name: Install GDAL + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install --find-links=https://girder.github.io/large_image_wheels --no-cache GDAL + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + pip install --user -r requirements.txt + pip install --user -r requirements_dev.txt + pip install . + - name: PKG-TEST + run: | + python -m unittest discover tests/ + diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000..84c0b02 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,31 @@ +on: + push: + branches: + - main + pull_request: + branches: + - main + +name: Windows build +jobs: + test-windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v3 + - name: Install miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + auto-activate-base: true + python-version: "3.10" + - name: Install GDAL + run: conda install -c conda-forge gdal --yes + - name: Test GDAL installation + run: | + python -c "from osgeo import gdal" + gdalinfo --version + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install -r requirements.txt + pip install . diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..631004a --- /dev/null +++ b/.gitignore @@ -0,0 +1,106 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +private/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +# IDE settings +.vscode/ \ No newline at end of file diff --git a/LICENSE b/LICENSE index 1ba6805..05bd06a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,22 @@ -MIT License - -Copyright (c) [2022] [Nana Abeka Otoo] - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +MIT License + +Copyright (c) 2023, Nana Abeka Otoo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..89411aa --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,7 @@ +include LICENSE +include README.md +include requirements.txt + +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..289e2c5 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,11 @@ +# Changelog + +## v0.0.1 - Date + +**Improvement**: + +- TBD + +**New Features**: + +- TBD diff --git a/docs/common.md b/docs/common.md new file mode 100644 index 0000000..66f1dc8 --- /dev/null +++ b/docs/common.md @@ -0,0 +1,3 @@ +# common module + +::: prosemble.common \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..2e04954 --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,108 @@ +# Contributing + +Contributions are welcome, and they are greatly appreciated! Every +little bit helps, and credit will always be given. + +You can contribute in many ways: + +## Types of Contributions + +### Report Bugs + +Report bugs at . + +If you are reporting a bug, please include: + +- Your operating system name and version. +- Any details about your local setup that might be helpful in troubleshooting. +- Detailed steps to reproduce the bug. + +### Fix Bugs + +Look through the GitHub issues for bugs. Anything tagged with `bug` and +`help wanted` is open to whoever wants to implement it. + +### Implement Features + +Look through the GitHub issues for features. Anything tagged with +`enhancement` and `help wanted` is open to whoever wants to implement it. + +### Write Documentation + +prosemble could always use more documentation, +whether as part of the official prosemble docs, +in docstrings, or even on the web in blog posts, articles, and such. + +### Submit Feedback + +The best way to send feedback is to file an issue at +. + +If you are proposing a feature: + +- Explain in detail how it would work. +- Keep the scope as narrow as possible, to make it easier to implement. +- Remember that this is a volunteer-driven project, and that contributions are welcome :) + +## Get Started! + +Ready to contribute? Here's how to set up prosemble for local development. + +1. Fork the prosemble repo on GitHub. + +2. Clone your fork locally: + + ```shell + $ git clone git@github.com:your_name_here/prosemble.git + ``` + +3. Install your local copy into a virtualenv. Assuming you have + virtualenvwrapper installed, this is how you set up your fork for + local development: + + ```shell + $ mkvirtualenv prosemble + $ cd prosemble/ + $ python setup.py develop + ``` + +4. Create a branch for local development: + + ```shell + $ git checkout -b name-of-your-bugfix-or-feature + ``` + + Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass flake8 + and the tests, including testing other Python versions with tox: + + ```shell + $ flake8 prosemble tests + $ python setup.py test or pytest + $ tox + ``` + + To get flake8 and tox, just pip install them into your virtualenv. + +6. Commit your changes and push your branch to GitHub: + + ```shell + $ git add . + $ git commit -m "Your detailed description of your changes." + $ git push origin name-of-your-bugfix-or-feature + ``` + +7. Submit a pull request through the GitHub website. + +## Pull Request Guidelines + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests. +2. If the pull request adds functionality, the docs should be updated. + Put your new functionality into a function with a docstring, and add + the feature to the list in README.rst. +3. The pull request should work for Python 3.5, 3.6, 3.7 and 3.8, and + for PyPy. Check and make sure that the tests pass for all + supported Python versions. diff --git a/docs/examples/intro.ipynb b/docs/examples/intro.ipynb new file mode 100644 index 0000000..ebd171a --- /dev/null +++ b/docs/examples/intro.ipynb @@ -0,0 +1,21 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('Hello World!')" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 0000000..4514b4c --- /dev/null +++ b/docs/faq.md @@ -0,0 +1 @@ +# FAQ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..aae28b4 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,16 @@ +# Welcome to prosemble + + +[![image](https://img.shields.io/pypi/v/prosemble.svg)](https://pypi.python.org/pypi/prosemble) + + +**A python project for prototype-based machine learning models** + + +- Free software: MIT license +- Documentation: + + +## Features + +- TODO diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..68b1f1d --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,21 @@ +# Installation + +## Stable release + +To install prosemble, run this command in your terminal: + +``` +pip install prosemble +``` + +This is the preferred method to install prosemble, as it will always install the most recent stable release. + +If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process. + +## From sources + +To install prosemble from sources, run this command in your terminal: + +``` +pip install git+https://github.com/naotoo1/prosemble +``` diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..702c96b --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block content %} +{% if page.nb_url %} + + {% include ".icons/material/download.svg" %} + +{% endif %} + +{{ super() }} +{% endblock content %} diff --git a/docs/prosemble.md b/docs/prosemble.md new file mode 100644 index 0000000..83eceb0 --- /dev/null +++ b/docs/prosemble.md @@ -0,0 +1,4 @@ + +# prosemble module + +::: prosemble.prosemble \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..cc7f29a --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,7 @@ +# Usage + +To use prosemble in a project: + +``` +import prosemble +``` diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..1195535 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,86 @@ +site_name: prosemble +site_description: A python project for prototype-based machine learning models +site_author: naotoo1 +site_url: https://naotoo1.github.io/prosemble +repo_url: https://github.com/naotoo1/prosemble + +copyright: "Copyright © 2023 - 2023 Nana Abeka Otoo" + +theme: + palette: + - scheme: default + # primary: blue + # accent: indigo + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - scheme: slate + primary: indigo + accent: indigo + toggle: + icon: material/toggle-switch + name: Switch to light mode + name: material + icon: + repo: fontawesome/brands/github + # logo: assets/logo.png + # favicon: assets/favicon.png + features: + - navigation.instant + - navigation.tracking + - navigation.top + - search.highlight + - search.share + custom_dir: "docs/overrides" + font: + text: Google Sans + code: Regular + +plugins: + - search + - mkdocstrings + - git-revision-date + - git-revision-date-localized: + enable_creation_date: true + type: timeago + # - pdf-export + - mkdocs-jupyter: + include_source: True + ignore_h1_titles: True + execute: True + allow_errors: false + ignore: ["conf.py"] + execute_ignore: ["*ignore.ipynb"] + +markdown_extensions: + - admonition + - abbr + - attr_list + - def_list + - footnotes + - meta + - md_in_html + - pymdownx.superfences + - pymdownx.highlight: + linenums: true + - toc: + permalink: true + +# extra: +# analytics: +# provider: google +# property: UA-XXXXXXXXX-X + +nav: + - Home: index.md + - Installation: installation.md + - Usage: usage.md + - Contributing: contributing.md + - FAQ: faq.md + - Changelog: changelog.md + - Report Issues: https://github.com/naotoo1/prosemble/issues + - Examples: + - examples/intro.ipynb + - API Reference: + - prosemble module: prosemble.md + - common module: common.md diff --git a/prosemble/__init__.py b/prosemble/__init__.py index b58546e..972e39c 100644 --- a/prosemble/__init__.py +++ b/prosemble/__init__.py @@ -4,5 +4,5 @@ from . import models from . import core -__version__ = "0.5.0" +__version__ = "0.7.0" __author__ = 'Nana Abeka Otoo' diff --git a/prosemble/models/__init__.py b/prosemble/models/__init__.py index 06039fa..4a44de9 100644 --- a/prosemble/models/__init__.py +++ b/prosemble/models/__init__.py @@ -18,6 +18,8 @@ from .kpcm import * from .kfpcm import * from .kpfcm import * +from .kipcm import * +from .kipcm2 import * from .npc import * from .som import * from .spectralclustering import * diff --git a/prosemble/models/kipcm.py b/prosemble/models/kipcm.py index be5eabf..1e5ebb6 100644 --- a/prosemble/models/kipcm.py +++ b/prosemble/models/kipcm.py @@ -19,7 +19,7 @@ ) -class KIPCM1: +class KIPCM: """ params: @@ -93,7 +93,7 @@ def __init__(self, self.model1 = FCM( data=self.data, c=self.num_clusters, - m=2, + m=self.fuzzifier, num_iter=self.num_iter, epsilon=self.epsilon, ord=self.ord diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d0ed1f1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy +scikit-learn +scipy +matplotlib +pandas diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..2a86222 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,12 @@ +black +black[jupyter] +pip +bump2version +wheel +watchdog +flake8 +tox +coverage +Sphinx +twine + diff --git a/requirements_docs.txt b/requirements_docs.txt new file mode 100644 index 0000000..bd75819 --- /dev/null +++ b/requirements_docs.txt @@ -0,0 +1,24 @@ +bump2version +coverage +flake8 +ipykernel +livereload +nbconvert +nbformat +pip +sphinx +tox +twine +watchdog +wheel +mkdocs +mkdocs-git-revision-date-plugin +mkdocs-git-revision-date-localized-plugin +mkdocs-jupyter>=0.24.0 +mkdocs-material>=9.1.3 +mkdocs-pdf-export-plugin +mkdocstrings +mkdocstrings-crystal +mkdocstrings-python-legacy +pygments +pymdown-extensions \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..732a2b1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,22 @@ +[bumpversion] +current_version = 0.0.1 +commit = True +tag = True + +[bumpversion:file:setup.py] +search = version='{current_version}' +replace = version='{new_version}' + +[bumpversion:file:prosemble/__init__.py] +search = __version__ = '{current_version}' +replace = __version__ = '{new_version}' + +[bdist_wheel] +universal = 1 + +[flake8] +exclude = docs + +[aliases] +# Define setup.py command aliases here + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f9cbfe0 --- /dev/null +++ b/setup.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +"""The setup script.""" + +import io +from os import path as op +from setuptools import setup, find_packages + +with open('README.md') as readme_file: + readme = readme_file.read() + +here = op.abspath(op.dirname(__file__)) + +# get the dependencies and installs +with io.open(op.join(here, "requirements.txt"), encoding="utf-8") as f: + all_reqs = f.read().split("\n") + +install_requires = [x.strip() for x in all_reqs if "git+" not in x] +dependency_links = [x.strip().replace("git+", "") for x in all_reqs if "git+" not in x] + +requirements = [ ] + +setup_requirements = [ ] + +test_requirements = [ ] + +setup( + author="Nana Abeka Otoo", + author_email='abekaotoo@gmail.com', + python_requires='>=3.8', + classifiers=[ + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + ], + description="A python project for prototype-based machine learning models", + install_requires=install_requires, + dependency_links=dependency_links, + license="MIT license", + long_description=readme, + long_description_content_type='text/markdown', + include_package_data=True, + keywords='prosemble', + name='prosemble', + packages=find_packages(include=['prosemble', 'prosemble.*']), + setup_requires=setup_requirements, + test_suite='tests', + tests_require=test_requirements, + url='https://github.com/naotoo1/prosemble', + version='0.0.1', + zip_safe=False, +) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..1bbcf9e --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +"""Unit test package for prosemble.""" diff --git a/tests/test_prosemble.py b/tests/test_prosemble.py new file mode 100644 index 0000000..91a4ee4 --- /dev/null +++ b/tests/test_prosemble.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +"""Tests for `prosemble` package.""" + + +import unittest + +from prosemble import prosemble + + +class TestProsemble(unittest.TestCase): + """Tests for `prosemble` package.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + def tearDown(self): + """Tear down test fixtures, if any.""" + + def test_000_something(self): + """Test something.""" From 049b7a6bc2ae79f97a7f38f402e640f8dc04cce1 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:23:38 +0200 Subject: [PATCH 04/19] Updated setup.py --- setup.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index f9cbfe0..d67a486 100644 --- a/setup.py +++ b/setup.py @@ -27,13 +27,11 @@ setup( author="Nana Abeka Otoo", author_email='abekaotoo@gmail.com', - python_requires='>=3.8', + python_requires='>=3.9', classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Natural Language :: English', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', @@ -52,6 +50,6 @@ test_suite='tests', tests_require=test_requirements, url='https://github.com/naotoo1/prosemble', - version='0.0.1', + version='0.7.0', zip_safe=False, ) From 1858a1883900fb87afa52f262211b3bb00208fc5 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:24:12 +0200 Subject: [PATCH 05/19] changed version --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 732a2b1..57ad539 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.1 +current_version = 0.7.0 commit = True tag = True From 658d6d060fc765f07881fc693f8f6c7a0a105fff Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:24:44 +0200 Subject: [PATCH 06/19] updated readme.md --- README.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 99190bb..788f0a6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # Prosemble [![python: 3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/) -[![github](https://img.shields.io/badge/version-0.0.2-yellow.svg)](https://github.com/naotoo1/Prosemble) -[![pypi](https://img.shields.io/badge/pypi-0.0.2-orange.svg)](https://pypi.org/project/prosemble) +[![github](https://img.shields.io/badge/version-0.7.0-yellow.svg)](https://github.com/naotoo1/Prosemble) +[![pypi](https://img.shields.io/badge/pypi-0.7.0-orange.svg)](https://pypi.org/project/prosemble) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) -ML package for both prototype and non-prototype-based models +A python project for prototype-based machine learning models @@ -16,9 +16,19 @@ pip install prosemble ``` +If you have installed Prosemble before and want to upgrade to the latest version, you can run the following command in your terminal: +Prosemble can be installed using pip. +```python +pip install -U prosemble +``` +To install the development version from GitHub using Git, run the following command in your terminal: +```python +pip install git+https://github.com/naotoo1/prosemble +``` + ## Bibtex If you would like to cite the package, please use this: From ff84b1d38e1a8371e70145874468f09a5143e3a2 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:25:11 +0200 Subject: [PATCH 07/19] added version --- prosemble/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/prosemble/__init__.py b/prosemble/__init__.py index 972e39c..6e14d06 100644 --- a/prosemble/__init__.py +++ b/prosemble/__init__.py @@ -4,5 +4,7 @@ from . import models from . import core -__version__ = "0.7.0" -__author__ = 'Nana Abeka Otoo' + +__author__ = """Nana Abeka Otoo""" +__email__ = 'nanaabekaotoo@gmail.com' +__version__ = '0.7.0' From c1c67bdb1806c137a5acb5d15b129b2392f9c659 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:26:49 +0200 Subject: [PATCH 08/19] removed python 3.8 from matrix job --- .github/workflows/ubuntu.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index dd78cdd..977bdae 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -15,7 +15,6 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, py: "3.8" } - { os: ubuntu-latest, py: "3.9" } - { os: ubuntu-latest, py: "3.10" } - { os: ubuntu-latest, py: "3.11" } From 4166c28dc4ad2af1453aeea9535e6a6a5a853db8 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:42:49 +0200 Subject: [PATCH 09/19] updated index.md --- docs/index.md | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index aae28b4..69f1d0e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,6 +2,10 @@ [![image](https://img.shields.io/pypi/v/prosemble.svg)](https://pypi.python.org/pypi/prosemble) +[![python: 3.9](https://img.shields.io/badge/python-3.9-blue.svg)](https://www.python.org/downloads/release/python-390/) +[![github](https://img.shields.io/badge/version-0.7.0-yellow.svg)](https://github.com/naotoo1/Prosemble) +[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) + **A python project for prototype-based machine learning models** @@ -11,6 +15,39 @@ - Documentation: -## Features +## Installation +Prosemble can be installed using pip. +```python +pip install prosemble +``` + + +If you have installed Prosemble before and want to upgrade to the latest version, you can run the following command in your terminal: +Prosemble can be installed using pip. +```python +pip install -U prosemble +``` + + + +To install the development version from GitHub using Git, run the following command in your terminal: +```python +pip install git+https://github.com/naotoo1/prosemble +``` + + +## Bibtex +If you would like to cite the package, please use this: +```python +@misc{Otoo_Prosemble_2022, +author = {Otoo, Nana Abeka}, +title = {Prosemble}, +year = {2022}, +publisher = {GitHub}, +journal = {GitHub repository}, +howpublished= {\url{https://github.com/naotoo1/Prosemble}}, +} +``` + + -- TODO From 67853f10043aec48dc58a52a544b1dc364020bd4 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 03:54:39 +0200 Subject: [PATCH 10/19] updated requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index d0ed1f1..83e6ee1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ scikit-learn scipy matplotlib pandas +neupy \ No newline at end of file From a1a831a2c5eba7c36b2ff369fa3ca01046ae26cf Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 04:20:07 +0200 Subject: [PATCH 11/19] updated requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 83e6ee1..77879df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy +numpy==1.23.1 scikit-learn scipy matplotlib From a730c7266a15504ad22fb692598a794f28f98588 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 04:33:06 +0200 Subject: [PATCH 12/19] updated requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 77879df..57d8e37 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -numpy==1.23.1 +numpy==1.20.3 scikit-learn scipy matplotlib From 58075cec3ccb144b3a32d30acd725ee619d55bfc Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 04:45:11 +0200 Subject: [PATCH 13/19] updated yml files --- .github/workflows/docs-build.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/ubuntu.yml | 4 +--- .github/workflows/windows.yml | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 57096bc..0f03a62 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -13,7 +13,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.8" - name: Install GDAL run: | python -m pip install --upgrade pip diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7262e05..f6d90e7 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -10,7 +10,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: 3.8 - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 977bdae..00fb526 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -15,9 +15,7 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, py: "3.9" } - - { os: ubuntu-latest, py: "3.10" } - - { os: ubuntu-latest, py: "3.11" } + - { os: ubuntu-latest, py: "3.8" } steps: - name: Checkout Code uses: actions/checkout@v3 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 84c0b02..84beb02 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -16,7 +16,7 @@ jobs: uses: conda-incubator/setup-miniconda@v2 with: auto-activate-base: true - python-version: "3.10" + python-version: "3.8" - name: Install GDAL run: conda install -c conda-forge gdal --yes - name: Test GDAL installation From cac84b41109e1baaea8f0774420acf07d1ca0705 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 04:50:10 +0200 Subject: [PATCH 14/19] downgraded to python 8 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d67a486..426af02 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( author="Nana Abeka Otoo", author_email='abekaotoo@gmail.com', - python_requires='>=3.9', + python_requires='>=3.8', classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', From 560b23fe8c98ca96a4e9297ff72970475ea32d22 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 05:05:07 +0200 Subject: [PATCH 15/19] updated package --- .github/workflows/macos.yml | 2 +- tests/test_prosemble.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 3bb390c..0edc1e6 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: ["macOS-latest"] - python-version: ["3.10"] + python-version: ["3.8"] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/tests/test_prosemble.py b/tests/test_prosemble.py index 91a4ee4..e76a56b 100644 --- a/tests/test_prosemble.py +++ b/tests/test_prosemble.py @@ -5,7 +5,7 @@ import unittest -from prosemble import prosemble +# from prosemble import prosemble class TestProsemble(unittest.TestCase): From 3d88dfae1f5b3840cff4de087b87ef346105cc77 Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 11:50:11 +0200 Subject: [PATCH 16/19] updated matrix jobs and python versions in CI yml --- .github/workflows/macos.yml | 8 ++++++-- .github/workflows/ubuntu.yml | 2 ++ setup.py | 8 ++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 0edc1e6..e48defd 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -14,8 +14,12 @@ jobs: strategy: fail-fast: false matrix: - os: ["macOS-latest"] - python-version: ["3.8"] + # os: ["macOS-latest"] + # python-version: ["3.8"] + config: + - { os: "macOS-latest", py: "3.6" } + - { os: "macOS-latest", py: "3.7" } + - { os: "macOS-latest", py: "3.8" } steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 00fb526..915e5f4 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -15,6 +15,8 @@ jobs: fail-fast: false matrix: config: + - { os: ubuntu-latest, py: "3.6" } + - { os: ubuntu-latest, py: "3.7" } - { os: ubuntu-latest, py: "3.8" } steps: - name: Checkout Code diff --git a/setup.py b/setup.py index 426af02..e3a7527 100644 --- a/setup.py +++ b/setup.py @@ -27,14 +27,14 @@ setup( author="Nana Abeka Otoo", author_email='abekaotoo@gmail.com', - python_requires='>=3.8', + python_requires='>=3.6', classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Natural Language :: English', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', ], description="A python project for prototype-based machine learning models", install_requires=install_requires, From d27b0d40c035ce03067f0d5e266778f51be1596b Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 12:07:06 +0200 Subject: [PATCH 17/19] updated matrix job --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e3a7527..439f135 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( author="Nana Abeka Otoo", author_email='abekaotoo@gmail.com', - python_requires='>=3.6', + python_requires='>=3.7', classifiers=[ 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', From 3843fdb0a88af5d647ee4ac198b6cbf15c92584a Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 12:07:32 +0200 Subject: [PATCH 18/19] updated matrix job --- .github/workflows/macos.yml | 8 ++------ .github/workflows/ubuntu.yml | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index e48defd..c78be81 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -14,12 +14,8 @@ jobs: strategy: fail-fast: false matrix: - # os: ["macOS-latest"] - # python-version: ["3.8"] - config: - - { os: "macOS-latest", py: "3.6" } - - { os: "macOS-latest", py: "3.7" } - - { os: "macOS-latest", py: "3.8" } + os: ["macOS-latest"] + python-version: ["3.7","3.8"] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 915e5f4..b077a50 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -15,7 +15,6 @@ jobs: fail-fast: false matrix: config: - - { os: ubuntu-latest, py: "3.6" } - { os: ubuntu-latest, py: "3.7" } - { os: ubuntu-latest, py: "3.8" } steps: From 384e4bd360b6ae1845c9e29fcba22a7e53bce29b Mon Sep 17 00:00:00 2001 From: Nana Abeka Otoo Date: Sun, 24 Sep 2023 12:26:52 +0200 Subject: [PATCH 19/19] updated windows.yml --- .github/workflows/windows.yml | 68 +++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 84beb02..91d629c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -7,25 +7,55 @@ on: - main name: Windows build +# jobs: +# test-windows: +# runs-on: windows-latest jobs: test-windows: - runs-on: windows-latest + runs-on: ${{ matrix.os }} + name: ${{ matrix.os }} (${{ matrix.python-version}}) + strategy: + fail-fast: false + matrix: + os: ["windows-latest"] + python-version: ["3.7","3.8"] steps: - - uses: actions/checkout@v3 - - name: Install miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - auto-activate-base: true - python-version: "3.8" - - name: Install GDAL - run: conda install -c conda-forge gdal --yes - - name: Test GDAL installation - run: | - python -c "from osgeo import gdal" - gdalinfo --version - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install --no-cache-dir Cython - pip install -r requirements.txt - pip install . + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version}} + - name: Install GDAL + run: | + brew install gdal + - name: Test GDAL installation + run: | + gdalinfo --version + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --no-cache-dir Cython + pip install -r requirements.txt + pip install . + + # steps: + # - uses: actions/checkout@v3 + # - name: Install miniconda + # uses: conda-incubator/setup-miniconda@v2 + # with: + # auto-activate-base: true + # python-version: "3.8" + # - name: Install GDAL + # run: conda install -c conda-forge gdal --yes + # - name: Test GDAL installation + # run: | + # python -c "from osgeo import gdal" + # gdalinfo --version + # - name: Install dependencies + # run: | + # python -m pip install --upgrade pip + # pip install --no-cache-dir Cython + # pip install -r requirements.txt + # pip install .