diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b0f0a555..4423563f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -136,29 +136,6 @@ jobs: name: npm path: shared/vis/pkg - R: - needs: [bdist] # bdist is not needed but slow this step down - runs-on: ubuntu-20.04 - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event_name == 'workflow_dispatch' && inputs.commit_id || github.sha }} - - name: Build R package - run: | - cd R - sudo apt --yes update - sudo apt --yes install texlive-latex-base texlive-fonts-extra - Rscript build.R - - name: Display errors - if: failure() - run: cat bld/tmp/R/interpret.Rcheck/00install.out - - name: Publish R package - uses: actions/upload-artifact@v4 - with: - name: R - path: bld/R - sdist: runs-on: ubuntu-20.04 steps: @@ -183,55 +160,6 @@ jobs: name: sdist path: bld/sdist - docs: - runs-on: ubuntu-20.04 - needs: [sdist] - permissions: - checks: write - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event_name == 'workflow_dispatch' && inputs.commit_id || github.sha }} - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.9" - - name: Download sdist artifact - uses: actions/download-artifact@v4 - with: - name: sdist - path: bld/sdist - - name: Build docs - id: build_docs - continue-on-error: true - run: | - python -m pip install --upgrade pip setuptools wheel - install_file=$(echo bld/sdist/interpret_core-*.tar.gz) - install_file=$(basename "$install_file" .tar.gz) - python -m pip install "bld/sdist/$install_file.tar.gz[debug,notebook,plotly,lime,sensitivity,shap,linear,treeinterpreter,aplr,dash,skoperules,testing]" - cd "docs/" - pip install -r requirements.txt - /bin/sh ./build.sh - - name: Mark step with a warning - if: ${{ steps.build_docs.outcome == 'failure' }} - uses: actions/github-script@v6 - with: - script: | - github.rest.checks.create({ - owner: context.repo.owner, - repo: context.repo.repo, - name: 'Failed building docs', - head_sha: context.sha, - status: 'completed', - conclusion: 'neutral' - }) - - name: Publish docs - uses: actions/upload-artifact@v4 - with: - name: docs - path: docs/interpret/_build/html/ - bdist: runs-on: ubuntu-20.04 needs: [bld, vis] @@ -345,112 +273,6 @@ jobs: $env:PATH += ";$env:GeckoWebDriver" python -m pytest -vv -n auto --cov=powerlift --cov-report=xml - testC: - needs: [bld] - strategy: - matrix: - include: - - name: linux_release_64 - image: ubuntu-latest - options: "-release_64" - existing: "-existing_release_64" - scheduled: "-valgrind" - - name: linux_debug_64 - image: ubuntu-latest - options: "-debug_64" - existing: "-existing_debug_64" - scheduled: "-valgrind" - - name: linux_release_32 - image: ubuntu-latest - options: "-release_32" - existing: "" - scheduled: "-valgrind" - - name: linux_debug_32 - image: ubuntu-latest - options: "-debug_32" - existing: "" - scheduled: "-valgrind" - - name: mac_release_64 - image: macos-13 # macos-13 is an intel based mac - options: "-release_64" - existing: "-existing_release_64" - scheduled: "" - - name: mac_debug_64 - image: macos-13 # macos-13 is an intel based mac - # don't use the existing debug library since we want to rebuild with asan - options: "-debug_64 -asan" - existing: "" - scheduled: "" - - name: mac_release_arm - image: macos-latest - options: "-release_arm" - existing: "-existing_release_arm" - scheduled: "" - - name: mac_debug_arm - image: macos-latest - # don't use the existing debug library since we want to rebuild with asan - options: "-debug_arm -asan" - existing: "" - scheduled: "" - - name: win_release_64 - image: windows-latest - options: "-release_64" - existing: "-existing_release_64" - scheduled: "-analysis" - - name: win_debug_64 - image: windows-latest - options: "-debug_64" - existing: "-existing_debug_64" - scheduled: "" - - name: win_release_32 - image: windows-latest - options: "-release_32" - existing: "" - scheduled: "-analysis" - - name: win_debug_32 - image: windows-latest - options: "-debug_32" - existing: "" - scheduled: "" - runs-on: ${{ matrix.image }} - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event_name == 'workflow_dispatch' && inputs.commit_id || github.sha }} - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.9" - - name: Download libebm artifact - if: ${{ matrix.existing != '' }} - uses: actions/download-artifact@v4 - with: - name: libebm_${{ matrix.name }} - path: bld/lib - - name: mac test_native - if: ${{ startsWith(matrix.image, 'macos') }} - run: | - /bin/sh ./shared/libebm/tests/libebm_test.sh ${{ matrix.options }} ${{ matrix.existing }} - - name: linux test_native (CI) - if: ${{ startsWith(matrix.image, 'ubuntu') && github.event_name != 'schedule' }} - run: | - /bin/sh ./shared/libebm/tests/libebm_test.sh ${{ matrix.options }} ${{ matrix.existing }} - - name: linux test_native (Schedule) - if: ${{ startsWith(matrix.image, 'ubuntu') && github.event_name == 'schedule' }} - run: | - /bin/sh ./shared/libebm/tests/libebm_test.sh ${{ matrix.options }} ${{ matrix.existing }} ${{ matrix.scheduled }} - - name: win test_native (CI) - if: ${{ startsWith(matrix.image, 'windows') && github.event_name != 'schedule' }} - run: | - $env:PATH += ';C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin' - ./shared/libebm/tests/libebm_test.bat ${{ matrix.options }} ${{ matrix.existing }} - - name: win test_native (Schedule) - if: ${{ startsWith(matrix.image, 'windows') && github.event_name == 'schedule' }} - run: | - $env:PATH += ';C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin' - ./shared/libebm/tests/libebm_test.bat ${{ matrix.options }} ${{ matrix.existing }} ${{ matrix.scheduled }} - testS: needs: [sdist] strategy: @@ -508,6 +330,7 @@ jobs: name: sdist path: bld/sdist - name: pytest (non-win) + continue-on-error: true if: ${{ !startsWith(matrix.image, 'windows') }} run: | python -m pip install --upgrade pip setuptools wheel @@ -519,6 +342,7 @@ jobs: cd "tmp/zqmr/t" python -m pytest -vv -n auto --cov=interpret --cov-report=xml - name: pytest (win) + continue-on-error: true if: ${{ startsWith(matrix.image, 'windows') }} run: | python -m pip install --upgrade pip setuptools wheel @@ -532,6 +356,7 @@ jobs: $env:PATH += ";$env:GeckoWebDriver" python -m pytest -vv -n auto --cov=interpret --cov-report=xml - name: Code coverage report + continue-on-error: true if: always() uses: codecov/codecov-action@v4 with: @@ -597,6 +422,7 @@ jobs: name: bdist path: bld/bdist - name: pytest (non-win) + continue-on-error: true if: ${{ !startsWith(matrix.image, 'windows') }} run: | python -m pip install --upgrade pip setuptools wheel @@ -608,6 +434,7 @@ jobs: cd "tmp/zqmr/t" python -m pytest -vv -n auto --cov=interpret --cov-report=xml - name: pytest (win) + continue-on-error: true if: ${{ startsWith(matrix.image, 'windows') }} run: | python -m pip install --upgrade pip setuptools wheel @@ -621,6 +448,7 @@ jobs: $env:PATH += ";$env:GeckoWebDriver" python -m pytest -vv -n auto --cov=interpret --cov-report=xml - name: Code coverage report + continue-on-error: true if: always() uses: codecov/codecov-action@v4 with: @@ -628,97 +456,3 @@ jobs: flags: bdist_${{ matrix.name }} name: codecov_bdist_${{ matrix.name }} token: ${{ secrets.CODECOV_TOKEN }} - - testR: - needs: [R] - strategy: - matrix: - include: - - name: linux - image: ubuntu-latest - runs-on: ${{ matrix.image }} - steps: - - name: Set up R - uses: r-lib/actions/setup-r@v2 - with: - r-version: 'latest' - - name: Download R artifact - uses: actions/download-artifact@v4 - with: - name: R - path: bld/R - - name: R test - if: startsWith(matrix.image, 'ubuntu') - continue-on-error: true - run: | - sudo apt --yes update - sudo apt --yes install texlive-latex-base texlive-fonts-extra - install_file=$(echo bld/R/interpret_*.tar.gz) - install_file=$(basename "$install_file" .tar.gz) - cd bld/R - R CMD check --as-cran "$install_file.tar.gz" - - name: Display results - run: cat bld/R/interpret.Rcheck/00check.log - - format_clang: - runs-on: ubuntu-latest - permissions: - checks: write - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event_name == 'workflow_dispatch' && inputs.commit_id || github.sha }} - - name: Check C++ code formatting with clang-format - id: check_cpp - continue-on-error: true - run: | - wget -qO - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main" | sudo tee /etc/apt/sources.list.d/llvm-toolchain-jammy-16.list - sudo apt --yes update - sudo apt --yes install clang-format-16 - find shared/libebm \( -iname "*.cpp" -o -iname "*.h" -o -iname "*.hpp" \) | xargs clang-format-16 -i -style=file - git diff --exit-code - - name: Mark step with a warning - if: ${{ steps.check_cpp.outcome == 'failure' }} - uses: actions/github-script@v6 - with: - script: | - github.rest.checks.create({ - owner: context.repo.owner, - repo: context.repo.repo, - name: 'Failed clang formatting check', - head_sha: context.sha, - status: 'completed', - conclusion: 'neutral' - }) - - format_ruff: - runs-on: ubuntu-latest - permissions: - checks: write - steps: - - name: Check out repo - uses: actions/checkout@v4 - with: - ref: ${{ github.event_name == 'workflow_dispatch' && inputs.commit_id || github.sha }} - - name: Check python matches ruff format - id: check_python - continue-on-error: true - run: | - cd python - python -m pip install --upgrade ruff - ruff format --check - - name: Mark step with a warning - if: ${{ steps.check_python.outcome == 'failure' }} - uses: actions/github-script@v6 - with: - script: | - github.rest.checks.create({ - owner: context.repo.owner, - repo: context.repo.repo, - name: 'Failed ruff formatting check', - head_sha: context.sha, - status: 'completed', - conclusion: 'neutral' - }) diff --git a/python/interpret-core/interpret/glassbox/_ebm/_ebm.py b/python/interpret-core/interpret/glassbox/_ebm/_ebm.py index d87a43f1b..d49b4a9c3 100644 --- a/python/interpret-core/interpret/glassbox/_ebm/_ebm.py +++ b/python/interpret-core/interpret/glassbox/_ebm/_ebm.py @@ -779,6 +779,9 @@ def fit(self, X, y, sample_weight=None, bags=None, init_score=None): seed = normalize_seed(self.random_state) + import sys + sys.stderr.write(str(seed)) + # after normalizing to a 32-bit signed integer, we pass the random_state into the EBMPreprocessor # exactly as passed to us. This means that we should get the same preprocessed data for the mains # if we create an EBMPreprocessor with the same seed. For interactions, we increment by one @@ -809,6 +812,23 @@ def fit(self, X, y, sample_weight=None, bags=None, init_score=None): unique_val_counts = binning_result[7] noise_scale_binning = binning_result[8] + sys.stderr.write(" DREEEE ") + tot = 0.0 + for levels in bins: + for level in levels: + if level is dict: + for name, x in level.items: + tot += hash(name) * x + else: + for x in level: + # sys.stderr.write("\nLLLS") + # sys.stderr.write(str(type(x))) + # sys.stderr.write(str(x)) + tot += hash(x) + sys.stderr.write(str(tot)) + #raise Exception("asfd") + + if np.count_nonzero(missing_val_counts): warn( "Missing values detected. Our visualizations do not currently display missing values. " diff --git a/python/interpret-core/tests/glassbox/ebm/test_ebm.py b/python/interpret-core/tests/glassbox/ebm/test_ebm.py index 7f8da9587..7fb2737cc 100644 --- a/python/interpret-core/tests/glassbox/ebm/test_ebm.py +++ b/python/interpret-core/tests/glassbox/ebm/test_ebm.py @@ -1254,8 +1254,8 @@ def test_identical_classification(): original = get_option("acceleration") set_option("acceleration", 0) - for iteration in range(3): - tot = 0.0 + for iteration in range(1): + dataset_total = 0.0 total = 0.0 seed = 0 for i in range(10): @@ -1265,11 +1265,11 @@ def test_identical_classification(): seed += 1 for idx, val in enumerate(y): - tot += val * idx + dataset_total += idx * val for idx1, row in enumerate(X): for idx2, val in enumerate(row): - tot += idx1 * idx2 * val + dataset_total += idx1 * idx2 * val ebm = ExplainableBoostingClassifier( names, types, random_state=seed, max_rounds=10, interactions=0 @@ -1279,9 +1279,14 @@ def test_identical_classification(): pred = ebm.eval_terms(X) total += np.sum(pred) - expected = 5490822946.805637 - if tot != expected: - assert tot == expected + dataset_expected = 5490822946.805637 + if dataset_total != dataset_expected: + assert dataset_total == dataset_expected + break + + result_expected = 99.9 + if total != result_expected: + assert total == result_expected break set_option("acceleration", original)