Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/semigroups/libsemigroups/tests/   (GAP Algebra Version 4.15.1©)  Datei vom 18.5.2025 mit Größe 19 kB image not shown  

Quelle  test-uf.cpp

  Sprache: C
 

//
// libsemigroups - C/C++ library for semigroups and monoids
// Copyright (C) 2020 James D. Mitchell
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//

// The purpose of this file is to test the UF class which describes a partition
// of the set of integers {0, ..., n - 1 }

#include <cstddef>  // for size_t
#include <numeric>  // for iota
#include <vector>   // vector

#include "catch.hpp"             // for REQUIRE
#include "libsemigroups/uf.hpp"  // Duf + Suf
#include "test-main.hpp"         // for LIBSEMIGROUPS_TEST_CASE

namespace libsemigroups {
  namespace detail {
    LIBSEMIGROUPS_TEST_CASE("UF""001""constructor by size""[quick]") {
      {
        Duf<> uf(7);
        REQUIRE(uf.size() == 7);
        std::vector<size_t> v(uf.size(), 0);
        std::iota(v.begin(), v.end(), 0);
        REQUIRE(v == std::vector<size_t>({0123456}));
        std::for_each(v.begin(), v.end(), [&uf](size_t& i) { i = uf.find(i); });
        REQUIRE(v == std::vector<size_t>({0123456}));
      }
      {
        Suf<7> uf;
        REQUIRE(uf.size() == 7);
        std::vector<size_t> v(uf.size(), 0);
        std::iota(v.begin(), v.end(), 0);
        REQUIRE(v == std::vector<size_t>({0123456}));
        std::for_each(v.begin(), v.end(), [&uf](size_t& i) { i = uf.find(i); });
        REQUIRE(v == std::vector<size_t>({0123456}));
      }
    }

    LIBSEMIGROUPS_TEST_CASE("UF""002""copy constructor""[quick]") {
      {
        Duf<> uf(11);
        uf.unite(010);
        uf.unite(23);
        uf.unite(63);
        uf.unite(67);

        std::vector<size_t> v(uf.size(), 0);
        std::iota(v.begin(), v.end(), 0);
        REQUIRE(v == std::vector<size_t>({012345678910}));
        std::for_each(v.begin(), v.end(), [&uf](size_t& i) { i = uf.find(i); });
        REQUIRE(v == std::vector<size_t>({1013345338910}));
        REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
                == std::vector<size_t>({13458910}));
        REQUIRE(std::vector<size_t>(uf.crbegin(), uf.crend())
                == std::vector<size_t>({10985431}));

        REQUIRE(uf.size() == 11);
        REQUIRE(uf.number_of_blocks() == 7);

        Duf<> uf2(uf);
        REQUIRE(uf2.size() == 11);
        REQUIRE(uf2.number_of_blocks() == 7);
      }
      {
        Suf<11> uf;
        uf.unite(010);
        uf.unite(23);
        uf.unite(63);
        uf.unite(67);

        REQUIRE(uf.size() == 11);
        REQUIRE(uf.number_of_blocks() == 7);

        std::vector<size_t> v(uf.size(), 0);
        std::iota(v.begin(), v.end(), 0);
        REQUIRE(v == std::vector<size_t>({012345678910}));
        std::for_each(v.begin(), v.end(), [&uf](size_t& i) { i = uf.find(i); });
        REQUIRE(v == std::vector<size_t>({1013345338910}));
        REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
                == std::vector<size_t>({13458910}));
        REQUIRE(std::vector<size_t>(uf.crbegin(), uf.crend())
                == std::vector<size_t>({10985431}));

        REQUIRE(uf.size() == 11);
        REQUIRE(uf.number_of_blocks() == 7);

        auto uf2(uf);
        REQUIRE(uf2.size() == 11);
        REQUIRE(uf2.number_of_blocks() == 7);
      }
    }

    LIBSEMIGROUPS_TEST_CASE("UF""003""find""[quick]") {
      {
        Duf<> uf(11);
        uf.unite(010);
        uf.unite(23);
        uf.unite(43);
        uf.unite(45);
        uf.unite(62);
        uf.unite(67);
        REQUIRE(uf.number_of_blocks() == 5);
        REQUIRE(uf.find(0) == 10);
        REQUIRE(uf.find(1) == 1);
        REQUIRE(uf.find(2) == 3);
        REQUIRE(uf.find(3) == 3);
        REQUIRE(uf.find(4) == 3);
        REQUIRE(uf.find(5) == 3);
        REQUIRE(uf.find(6) == 3);
        REQUIRE(uf.find(7) == 3);
        REQUIRE(uf.find(8) == 8);
        REQUIRE(uf.find(9) == 9);
        REQUIRE(uf.find(10) == 10);
      }
      {
        Suf<11> uf;
        uf.unite(010);
        uf.unite(23);
        uf.unite(43);
        uf.unite(45);
        uf.unite(62);
        uf.unite(67);
        REQUIRE(uf.number_of_blocks() == 5);
        REQUIRE(uf.find(0) == 10);
        REQUIRE(uf.find(1) == 1);
        REQUIRE(uf.find(2) == 3);
        REQUIRE(uf.find(3) == 3);
        REQUIRE(uf.find(4) == 3);
        REQUIRE(uf.find(5) == 3);
        REQUIRE(uf.find(6) == 3);
        REQUIRE(uf.find(7) == 3);
        REQUIRE(uf.find(8) == 8);
        REQUIRE(uf.find(9) == 9);
        REQUIRE(uf.find(10) == 10);
      }
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""004""unite""[quick]") {
      Duf<> uf(12);
      uf.unite(01);
      uf.unite(42);
      uf.unite(31);
      uf.unite(410);
      uf.unite(410);
      uf.unite(119);
      uf.unite(89);

      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);

      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(88);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);
      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(118);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);
      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(110);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 1);
      REQUIRE(uf.find(11) == 1);
      REQUIRE(uf.number_of_blocks() == 5);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({12567}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""005""unite""[quick]") {
      Suf<12> uf;
      uf.unite(01);
      uf.unite(42);
      uf.unite(31);
      uf.unite(410);
      uf.unite(410);
      uf.unite(119);
      uf.unite(89);

      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);

      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(88);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);
      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(118);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 9);
      REQUIRE(uf.find(11) == 9);
      REQUIRE(uf.number_of_blocks() == 6);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({125679}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));

      uf.unite(110);
      REQUIRE(uf.find(0) == 1);
      REQUIRE(uf.find(8) == 1);
      REQUIRE(uf.find(11) == 1);
      REQUIRE(uf.number_of_blocks() == 5);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({12567}));
      REQUIRE(std::all_of(
          uf.cbegin(), uf.cend(), [&uf](size_t i) { return uf.find(i) == i; }));
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""006""compress""[quick]") {
      {
        Duf<> uf(12);
        uf.unite(01);
        uf.unite(42);
        uf.unite(31);
        uf.unite(410);
        uf.unite(410);
        uf.unite(119);
        uf.unite(89);

        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({112125679929}));
        uf.compress();
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({112125679929}));
        uf.normalize();
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({002025678828}));
      }
      {
        Duf<> uf({01223422650});
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({01223422650}));
        uf.compress();
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({01222222220}));
      }
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""007""compress""[quick]") {
      {
        Suf<12> uf;
        uf.unite(01);
        uf.unite(42);
        uf.unite(31);
        uf.unite(410);
        uf.unite(410);
        uf.unite(119);
        uf.unite(89);

        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({112125679929}));
        uf.compress();
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({112125679929}));
      }
      {
        Suf<11> uf({01223422650});
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({01223422650}));
        uf.compress();
        REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
                == std::vector<size_t>({01222222220}));
      }
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""008""resize""[quick]") {
      Duf<> uf(0);
      for (size_t i = 0; i < 10; ++i) {
        uf.resize(i);
      }
      REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
              == std::vector<size_t>({012345678}));
      REQUIRE(std::vector<size_t>(uf.cbegin_rank(), uf.cend_rank())
              == std::vector<size_t>({000000000}));
      uf.compress();
      REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
              == std::vector<size_t>({012345678}));
      REQUIRE(std::vector<size_t>(uf.cbegin_rank(), uf.cend_rank())
              == std::vector<size_t>({000000000}));
      uf.normalize();
      REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
              == std::vector<size_t>({012345678}));
      REQUIRE(std::vector<size_t>(uf.cbegin_rank(), uf.cend_rank())
              == std::vector<size_t>({000000000}));
      uf.unite(08);
      uf.unite(00);
      uf.unite(10);
      REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
              == std::vector<size_t>({882345678}));
      REQUIRE(std::vector<size_t>(uf.cbegin_rank(), uf.cend_rank())
              == std::vector<size_t>({000000001}));
      uf.resize(25);
      REQUIRE(std::vector<size_t>(uf.cbegin_data(), uf.cend_data())
              == std::vector<size_t>({8,  8,  2,  3,  4,  5,  6,  7,  8,
                                      9,  1011121314151617,
                                      18192021222324}));
      REQUIRE(std::vector<size_t>(uf.cbegin_rank(), uf.cend_rank())
              == std::vector<size_t>({0000000010000,
                                      000000000000}));
      REQUIRE(uf.number_of_blocks() == 23);
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""009""resize""[quick]") {
      Duf<> uf({002335});
      REQUIRE(uf.size() == 6);
      uf.resize(7);
      REQUIRE(uf.size() == 7);
      uf.resize(8);
      REQUIRE(uf.size() == 8);
      REQUIRE(uf.find(6) == 6);
      REQUIRE(uf.find(7) == 7);
      uf.unite(17);
      REQUIRE(uf.find(7) == 7);
      REQUIRE(uf.number_of_blocks() == 5);
      REQUIRE(std::vector<size_t>(uf.cbegin(), uf.cend())
              == std::vector<size_t>({23567}));
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""010""big chain""[no-valgrind][quick]") {
      std::vector<size_t> tab;
      tab.push_back(0);
      for (size_t i = 0; i < 100000; i++) {
        tab.push_back(i);
      }
      Duf<> uf(tab);
      REQUIRE(uf.number_of_blocks() == 1);
      REQUIRE(uf.size() == 100001);
      REQUIRE(uf.find(12345) == 0);
      REQUIRE(uf.find(100000) == 0);
      uf.compress();
      uf.normalize();
      for (size_t i = 0; i < 100001; i++) {
        REQUIRE(uf.find(i) == 0);
      }
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""011""big chain""[no-valgrind][quick]") {
      std::array<uint32_t, 100001> tab;
      std::iota(tab.begin() + 1, tab.end(), 0);
      Suf<100001> uf(std::move(tab));
      REQUIRE(uf.number_of_blocks() == 1);
      REQUIRE(uf.size() == 100001);
      REQUIRE(uf.find(12345) == 0);
      REQUIRE(uf.find(100000) == 0);
      uf.compress();
      uf.normalize();
      for (size_t i = 0; i < 100001; i++) {
        REQUIRE(uf.find(i) == 0);
      }
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""012""empty table""[quick]") {
      Duf<> uf(0);
      REQUIRE(uf.number_of_blocks() == 0);
      uf.resize(1);
      REQUIRE(uf.size() == 1);
      REQUIRE(uf.number_of_blocks() == 1);
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""013""empty table""[quick]") {
      Suf<0> uf;
      REQUIRE(uf.number_of_blocks() == 0);
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""014""join""[quick]") {
      Duf<> uf1(10);
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      REQUIRE(uf1.number_of_blocks() == 7);

      uf1.join(uf1);
      REQUIRE(uf1.number_of_blocks() == 7);

      Duf<> uf2(10);
      uf2.unite(14);
      uf2.unite(39);
      uf2.unite(07);
      REQUIRE(uf2.number_of_blocks() == 7);

      uf1.join(uf2);
      REQUIRE(uf2.number_of_blocks() == 7);
      REQUIRE(uf1.number_of_blocks() == 4);

      REQUIRE(std::vector<size_t>(uf1.cbegin(), uf1.cend())
              == std::vector<size_t>({4568}));
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""015""join""[quick]") {
      Suf<10> uf1;
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      REQUIRE(uf1.number_of_blocks() == 7);

      uf1.join(uf1);
      REQUIRE(uf1.number_of_blocks() == 7);

      Suf<10> uf2;
      uf2.unite(14);
      uf2.unite(39);
      uf2.unite(07);
      REQUIRE(uf2.number_of_blocks() == 7);

      uf1.join(uf2);
      REQUIRE(uf2.number_of_blocks() == 7);
      REQUIRE(uf1.number_of_blocks() == 4);

      REQUIRE(std::vector<size_t>(uf1.cbegin(), uf1.cend())
              == std::vector<size_t>({4568}));
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""016""contains""[quick]") {
      Duf<> uf1(10);
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      Duf<> uf2(10);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(92);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(17);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(49);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(uf2.contains(uf1));
      REQUIRE(uf1 == uf2);

      uf2.unite(19);
      REQUIRE(uf2.contains(uf1));
      REQUIRE(!uf1.contains(uf2));

      uf1.unite(03);
      uf2.unite(01);
      REQUIRE(uf1.find(0) == uf1.find(3));
      REQUIRE(uf2.find(0) != uf2.find(3));

      REQUIRE(uf2.find(0) == uf2.find(1));
      REQUIRE(uf1.find(0) != uf1.find(1));

      REQUIRE(!uf2.contains(uf1));
      REQUIRE(!uf1.contains(uf2));
      REQUIRE(uf1 != uf2);
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""017""contains""[quick]") {
      Suf<10> uf1;
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      Suf<10> uf2;
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(92);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(17);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      uf2.unite(49);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(uf2.contains(uf1));
      REQUIRE(uf1 == uf2);

      uf2.unite(19);
      REQUIRE(uf2.contains(uf1));
      REQUIRE(!uf1.contains(uf2));

      uf1.unite(03);
      uf2.unite(01);
      REQUIRE(uf1.find(0) == uf1.find(3));
      REQUIRE(uf2.find(0) != uf2.find(3));

      REQUIRE(uf2.find(0) == uf2.find(1));
      REQUIRE(uf1.find(0) != uf1.find(1));

      REQUIRE(!uf2.contains(uf1));
      REQUIRE(!uf1.contains(uf2));
      REQUIRE(uf1 != uf2);
    }

    LIBSEMIGROUPS_TEST_CASE("Duf""018""swap""[quick]") {
      Duf<> uf1(10);
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      Duf<> uf2(10);
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      Duf<> uf3(uf1);
      Duf<> uf4(uf2);

      std::swap(uf1, uf2);
      REQUIRE(uf1 == uf4);
      REQUIRE(uf2 == uf3);

      uf1.swap(uf2);
      REQUIRE(uf1 == uf3);
      REQUIRE(uf2 == uf4);

      swap(uf1, uf2);
      REQUIRE(uf1 == uf4);
      REQUIRE(uf2 == uf3);

      REQUIRE(uf2 != uf1);
      // operator=
      uf1 = uf3;
      REQUIRE(uf2 == uf1);
    }

    LIBSEMIGROUPS_TEST_CASE("Suf""019""swap""[quick]") {
      Suf<10> uf1;
      uf1.unite(24);
      uf1.unite(49);
      uf1.unite(17);

      Suf<10> uf2;
      REQUIRE(uf1.contains(uf2));
      REQUIRE(!uf2.contains(uf1));

      Suf<10> uf3(uf1);
      Suf<10> uf4(uf2);

      std::swap(uf1, uf2);
      REQUIRE(uf1 == uf4);
      REQUIRE(uf2 == uf3);

      uf1.swap(uf2);
      REQUIRE(uf1 == uf3);
      REQUIRE(uf2 == uf4);

      swap(uf1, uf2);
      REQUIRE(uf1 == uf4);
      REQUIRE(uf2 == uf3);

      REQUIRE(uf2 != uf1);
      // operator=
      uf1 = uf3;
      REQUIRE(uf2 == uf1);
    }
  }  // namespace detail
}  // namespace libsemigroups

Messung V0.5 in Prozent
C=77 H=89 G=83

¤ Dauer der Verarbeitung: 0.26 Sekunden  (vorverarbeitet am  2026-06-17) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.