Skip to content

Instantly share code, notes, and snippets.

@langston-barrett
Created September 1, 2021 15:40
Show Gist options
  • Save langston-barrett/fa4b370acf1f11bd0e847bd4e75f0497 to your computer and use it in GitHub Desktop.
Save langston-barrett/fa4b370acf1f11bd0e847bd4e75f0497 to your computer and use it in GitHub Desktop.
Souffle Callgrind report
--------------------------------------------------------------------------------
Profile data file 'test.callgrind.out' (creator: callgrind-3.16.1)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 17504446838
Trigger: Program termination
Profiled target: ./test (PID 117247, part 1)
Events recorded: Ir
Events shown: Ir
Event sort order: Ir
Thresholds: 99
Include dirs:
User annotated: ./test.cpp
Auto-annotation: on
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
117,275,086,646 (100.0%) PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
117,269,752,082 (100.0%) /build/glibc-2.33/csu/../sysdeps/x86_64/start.S:_start [/home/siddharthist/code/mate/test]
117,269,752,071 (100.0%) ???:(below main) [/nix/store/9bh3986bpragfjmr32gay8p95k91q4gy-glibc-2.33-47/lib/libc-2.33.so]
117,269,619,491 (100.0%) /home/siddharthist/code/mate/test.cpp:main
117,269,619,491 (100.0%) test.cpp:main [/home/siddharthist/code/mate/test]
117,269,401,968 (100.0%) test.cpp:souffle::Sf_test::runAll(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) [/home/siddharthist/code/mate/test]
117,269,401,845 (100.0%) test.cpp:souffle::Sf_test::runFunction(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) [/home/siddharthist/code/mate/test]
117,269,399,373 (100.0%) test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&) [/home/siddharthist/code/mate/test]
112,750,241,951 (96.14%) test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#4}::operator()() const [/home/siddharthist/code/mate/test]
108,552,322,687 (92.56%) ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&) [/home/siddharthist/code/mate/test]
108,552,322,687 (92.56%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&)
107,894,534,143 (92.00%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::insert(int, int, souffle::EquivalenceRelation<std::array<int, 2ul> >::operation_hints)
62,683,664,860 (53.45%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::contains(int, int) [/home/siddharthist/code/mate/test]
62,683,664,860 (53.45%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::contains(int, int)
62,510,138,496 (53.30%) ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::contains(int, int) const [/home/siddharthist/code/mate/test]
60,004,937,901 (51.17%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toDense(int) [/home/siddharthist/code/mate/test]
49,794,343,397 (42.46%) ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&) [/home/siddharthist/code/mate/test]
49,794,343,397 (42.46%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)
46,956,019,293 (40.04%) ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&) [/home/siddharthist/code/mate/test]
45,112,855,500 (38.47%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::unionNodes(int, int) [/home/siddharthist/code/mate/test]
45,112,855,500 (38.47%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::unionNodes(int, int)
44,921,347,864 (38.30%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::sameSet(int, int) [/home/siddharthist/code/mate/test]
29,265,993,770 (24.95%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) [/home/siddharthist/code/mate/test]
17,458,475,036 (14.89%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::nodeExists(int) const [/home/siddharthist/code/mate/test]
16,704,644,320 (14.24%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const [/home/siddharthist/code/mate/test]
16,464,867,350 (14.04%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::contains(std::pair<int, unsigned long> const&) const [/home/siddharthist/code/mate/test]
16,464,867,350 (14.04%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::contains(std::pair<int, unsigned long> const&) const
15,065,817,550 (12.85%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::contains(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const [/home/siddharthist/code/mate/test]
14,880,499,560 (12.69%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::unionNodes(unsigned long, unsigned long) [/home/siddharthist/code/mate/test]
14,823,053,133 (12.64%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::sameSet(unsigned long, unsigned long) [/home/siddharthist/code/mate/test]
14,141,744,848 (12.06%) ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::get(unsigned long) const [/home/siddharthist/code/mate/test]
14,141,744,848 (12.06%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::get(unsigned long) const
13,648,038,922 (11.64%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::find(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const [/home/siddharthist/code/mate/test]
7,485,285,403 ( 6.38%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&)
7,414,630,945 ( 6.32%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::lower_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const [/home/siddharthist/code/mate/test]
7,414,630,945 ( 6.32%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::lower_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const
6,883,428,000 ( 5.87%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_read()
6,611,724,864 ( 5.64%) ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::getBlock(unsigned long) const [/home/siddharthist/code/mate/test]
6,537,747,919 ( 5.57%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::upper_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const [/home/siddharthist/code/mate/test]
6,537,747,919 ( 5.57%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::upper_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const
6,489,211,044 ( 5.53%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::operator()<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const [/home/siddharthist/code/mate/test]
5,876,691,273 ( 5.01%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) [/home/siddharthist/code/mate/test]
4,805,412,000 ( 4.10%) ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_read() [/home/siddharthist/code/mate/test]
4,476,110,124 ( 3.82%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) [/home/siddharthist/code/mate/test]
4,476,110,124 ( 3.82%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&)
4,367,307,680 ( 3.72%) ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_read(souffle::OptimisticReadWriteLock::Lease const&) [/home/siddharthist/code/mate/test]
4,367,307,680 ( 3.72%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_read(souffle::OptimisticReadWriteLock::Lease const&)
4,275,916,832 ( 3.65%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::function<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}, void, void>(souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}) [/home/siddharthist/code/mate/test]
4,211,184,286 ( 3.59%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::weak_equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const [/home/siddharthist/code/mate/test]
4,211,184,286 ( 3.59%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::weak_equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const
4,065,984,834 ( 3.47%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:souffle::DisjointSet::findNode(unsigned long)
4,046,293,034 ( 3.45%) ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator++() [/home/siddharthist/code/mate/test]
4,046,293,034 ( 3.45%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator++()
4,040,498,528 ( 3.45%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<unsigned long>*, 64ul>::operator[](unsigned long) const [/home/siddharthist/code/mate/test]
3,883,918,810 ( 3.31%) test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#3}::operator()() const [/home/siddharthist/code/mate/test]
3,823,218,360 ( 3.26%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const [/home/siddharthist/code/mate/test]
3,626,053,088 ( 3.09%) ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator++() [/home/siddharthist/code/mate/test]
3,626,053,088 ( 3.09%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator++()
3,501,828,440 ( 2.99%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::~function() [/home/siddharthist/code/mate/test]
3,252,250,400 ( 2.77%) ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) [/home/siddharthist/code/mate/test]
3,140,992,590 ( 2.68%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::~_Function_base() [/home/siddharthist/code/mate/test]
3,001,209,120 ( 2.56%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&)
2,583,434,000 ( 2.20%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&)
2,516,510,860 ( 2.15%) ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) [/home/siddharthist/code/mate/test]
2,432,849,232 ( 2.07%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_handler<unsigned long (std::pair<int, unsigned long>&), souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_manager(std::_Any_data&, std::_Function_handler<unsigned long (std::pair<int, unsigned long>&), souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}> const&, std::_Manager_operation) [/home/siddharthist/code/mate/test]
2,322,265,176 ( 1.98%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_init_functor(std::_Any_data&, {lambda(std::pair<int, unsigned long>&)#1}&&) [/home/siddharthist/code/mate/test]
2,240,115,444 ( 1.91%) ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updatePosterior() [/home/siddharthist/code/mate/test]
2,200,985,100 ( 1.88%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__cmpexch_failure_order(std::memory_order) [/home/siddharthist/code/mate/test]
2,078,016,000 ( 1.77%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:souffle::OptimisticReadWriteLock::start_read()
2,061,272,976 ( 1.76%) ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const [/home/siddharthist/code/mate/test]
1,990,513,170 ( 1.70%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>::btree_operation_hints()
1,836,596,280 ( 1.57%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::__array_traits<std::atomic<unsigned long>*, 64ul>::_S_ref(std::atomic<unsigned long>* const (&) [64], unsigned long) [/home/siddharthist/code/mate/test]
1,768,636,960 ( 1.51%) ../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::LRUCache() [/home/siddharthist/code/mate/test]
1,768,636,960 ( 1.51%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::LRUCache()
1,585,038,136 ( 1.35%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}> const&, std::_Manager_operation) [/home/siddharthist/code/mate/test]
1,548,286,320 ( 1.32%) ../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::any<souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const [/home/siddharthist/code/mate/test]
1,548,286,320 ( 1.32%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::any<souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const
1,511,315,432 ( 1.29%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_init_functor(std::_Any_data&, {lambda(std::pair<int, unsigned long>&)#1}&&, std::integral_constant<bool, true>) [/home/siddharthist/code/mate/test]
1,437,017,452 ( 1.23%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::pair<int, true>(int const&, int&&) [/home/siddharthist/code/mate/test]
1,420,842,808 ( 1.21%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::get(unsigned long) const
1,343,205,120 ( 1.15%) /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const
1,298,760,000 ( 1.11%) ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::Lease::Lease(int) [/home/siddharthist/code/mate/test]
1,210,931,898 ( 1.03%) /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const [/home/siddharthist/code/mate/test]
1,105,918,800 ( 0.94%) ../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::forEachInOrder<souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const [/home/siddharthist/code/mate/test]
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h
--------------------------------------------------------------------------------
Ir
-- line 48 ----------------------------------------
. using StatesBucket = StatesList*;
. using StorePair = std::pair<value_type, StatesBucket>;
. using StatesMap = souffle::LambdaBTreeSet<StorePair, std::function<StatesBucket(StorePair&)>,
. souffle::EqrelMapComparator<StorePair>>;
.
. public:
. using element_type = TupleType;
.
99 ( 0.00%) EquivalenceRelation() : statesMapStale(false){};
1,677 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::SparseDisjointSet() (3x)
297 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::LambdaBTreeSet<std::pair<int, souffle::PiggyList<int>*>, std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search>::LambdaBTreeSet(souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> > const&) (3x)
75 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<bool>::atomic(bool) (3x)
72 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::shared_mutex() (3x)
12 ( 0.00%) ~EquivalenceRelation() {
9 ( 0.00%) emptyPartition();
2,480 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::emptyPartition() const (3x)
30 ( 0.00%) }
31,812 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::~SparseDisjointSet() (3x)
147 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::LambdaBTreeSet<std::pair<int, souffle::PiggyList<int>*>, std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search>::~LambdaBTreeSet() (3x)
.
. /**
. * A collection of operation hints speeding up some of the involved operations
. * by exploiting temporal locality.
. * Unused in this class, as there is no speedup to be gained.
. * This is just defined as the class expects it.
. */
. struct operation_hints {
-- line 67 ----------------------------------------
-- line 70 ----------------------------------------
. };
.
. /**
. * Insert the two values symbolically as a binary relation
. * @param x node to be added/paired
. * @param y node to be added/paired
. * @return true if the pair is new to the data structure
. */
406,350 ( 0.00%) bool insert(value_type x, value_type y) {
. operation_hints z;
270,900 ( 0.00%) return insert(x, y, z);
306,869,279 ( 0.26%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::insert(int, int, souffle::EquivalenceRelation<std::array<int, 2ul> >::operation_hints) (45,150x)
225,750 ( 0.00%) };
.
. /**
. * Insert the tuple symbolically.
. * @param tuple The tuple to be inserted
. * @return true if the tuple is new to the data structure
. */
. bool insert(const TupleType& tuple) {
. operation_hints hints;
-- line 89 ----------------------------------------
-- line 92 ----------------------------------------
.
. /**
. * Insert the two values symbolically as a binary relation
. * @param x node to be added/paired
. * @param y node to be added/paired
. * @param z the hints to where the pair should be inserted (not applicable atm)
. * @return true if the pair is new to the data structure
. */
55,086,612 ( 0.05%) bool insert(value_type x, value_type y, operation_hints) {
. // indicate that iterators will have to generate on request
55,086,612 ( 0.05%) this->statesMapStale.store(true, std::memory_order_relaxed);
321,338,570 ( 0.27%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<bool>::store(bool, std::memory_order) (9,181,102x)
64,267,714 ( 0.05%) bool retval = contains(x, y);
62,510,138,496 (53.30%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::contains(int, int) const (9,181,102x)
55,086,612 ( 0.05%) sds.unionNodes(x, y);
45,112,855,500 (38.47%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::unionNodes(int, int) (9,181,102x)
9,181,102 ( 0.01%) return retval;
18,362,204 ( 0.02%) }
.
. /**
. * inserts all nodes from the other relation into this one
. * @param other the binary relation from which to add elements from
. */
. void insertAll(const EquivalenceRelation<TupleType>& other) {
. other.genAllDisjointSetLists();
.
-- line 114 ----------------------------------------
-- line 128 ----------------------------------------
. }
.
. /**
. * Extend this relation with another relation, expanding this equivalence relation
. * The supplied relation is the old knowledge, whilst this relation only contains
. * explicitly new knowledge. After this operation the "implicitly new tuples" are now
. * explicitly inserted this relation.
. */
2,709 ( 0.00%) void extend(const EquivalenceRelation<TupleType>& other) {
. // nothing to extend if there's no new/original knowledge
3,910 ( 0.00%) if (other.size() == 0 || this->size() == 0) return;
172,066,274 ( 0.15%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::size() const (601x)
.
900 ( 0.00%) this->genAllDisjointSetLists();
73,800 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const (300x)
900 ( 0.00%) other.genAllDisjointSetLists();
73,800 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const (300x)
.
2,100 ( 0.00%) std::set<value_type> repsCovered;
105,942 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_set.h:std::set<int, std::less<int>, std::allocator<int> >::~set() (300x)
26,100 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_set.h:std::set<int, std::less<int>, std::allocator<int> >::set() (300x)
.
. // find all the disjoint sets that need to be added to this relation
. // that exist in other (and exist in this)
. {
1,800 ( 0.00%) auto it = this->sds.sparseToDenseMap.begin();
9,000 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::begin() const (300x)
1,800 ( 0.00%) auto end = this->sds.sparseToDenseMap.end();
6,300 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::end() const (300x)
. value_type el;
8,700 ( 0.00%) for (; it != end; ++it) {
59,100 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator++() (600x)
25,500 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator!=(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator const&) const (900x)
8,400 ( 0.00%) std::tie(el, std::ignore) = *it;
49,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/tuple:std::tuple<int&, std::_Swallow_assign const&> std::tie<int, std::_Swallow_assign const>(int&, std::_Swallow_assign const&) (600x)
43,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/tuple:std::enable_if<(__assignable<int const&, unsigned long const&>)(), std::tuple<int&, std::_Swallow_assign const&>&>::type std::tuple<int&, std::_Swallow_assign const&>::operator=<int, unsigned long>(std::pair<int, unsigned long> const&) (600x)
8,400 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator*() const (600x)
4,200 ( 0.00%) if (other.containsElement(el)) {
461,214 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::containsElement(int) const (600x)
1,800 ( 0.00%) value_type rep = other.sds.findNode(el);
703,635 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::findNode(int) (300x)
2,700 ( 0.00%) if (repsCovered.count(rep) == 0) {
71,100 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_set.h:std::set<int, std::less<int>, std::allocator<int> >::count(int const&) const (300x)
1,500 ( 0.00%) repsCovered.emplace(rep);
221,700 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_set.h:std::pair<std::_Rb_tree_const_iterator<int>, bool> std::set<int, std::less<int>, std::allocator<int> >::emplace<int&>(int&) (300x)
. }
. }
. }
. }
.
. // add the intersecting dj sets into this one
. {
. value_type el;
. value_type rep;
1,800 ( 0.00%) auto it = other.sds.sparseToDenseMap.begin();
9,000 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::begin() const (300x)
1,800 ( 0.00%) auto end = other.sds.sparseToDenseMap.end();
6,300 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::end() const (300x)
498,750 ( 0.00%) for (; it != end; ++it) {
2,769,982 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator++() (45,150x)
1,183,800 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator!=(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator const&) const (45,450x)
632,100 ( 0.00%) std::tie(el, std::ignore) = *it;
3,747,450 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/tuple:std::tuple<int&, std::_Swallow_assign const&> std::tie<int, std::_Swallow_assign const>(int&, std::_Swallow_assign const&) (45,150x)
3,295,950 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/tuple:std::enable_if<(__assignable<int const&, unsigned long const&>)(), std::tuple<int&, std::_Swallow_assign const&>&>::type std::tuple<int&, std::_Swallow_assign const&>::operator=<int, unsigned long>(std::pair<int, unsigned long> const&) (45,150x)
632,100 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator*() const (45,150x)
270,900 ( 0.00%) rep = other.sds.findNode(el);
113,868,215 ( 0.10%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::findNode(int) (45,150x)
406,350 ( 0.00%) if (repsCovered.count(rep) != 0) {
17,292,450 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_set.h:std::set<int, std::less<int>, std::allocator<int> >::count(int const&) const (45,150x)
270,900 ( 0.00%) this->insert(el, rep);
307,772,279 ( 0.26%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::insert(int, int) (45,150x)
. }
. }
. }
1,807 ( 0.00%) }
.
. /**
. * Returns whether there exists a pair with these two nodes
. * @param x front of pair
. * @param y back of pair
. */
55,359,312 ( 0.05%) bool contains(value_type x, value_type y) const {
55,359,312 ( 0.05%) return sds.contains(x, y);
62,683,664,860 (53.45%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::contains(int, int) (9,226,552x)
18,453,104 ( 0.02%) }
.
. /**
. * Returns whether there exists given tuple.
. * @param tuple The tuple to search for.
. */
. bool contains(const TupleType& tuple, operation_hints&) const {
. return contains(tuple[0], tuple[1]);
. };
.
. bool contains(const TupleType& tuple) const {
. return contains(tuple[0], tuple[1]);
. };
.
8,456 ( 0.00%) void emptyPartition() const {
. // delete the beautiful values inside (they're raw ptrs, so they need to be.)
37,690 ( 0.00%) for (auto& pair : equivalencePartition) {
133,496 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator++() (902x)
63,316 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator!=(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) const (2,110x)
36,240 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::begin() const (1,208x)
25,368 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::end() const (1,208x)
12,628 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator*() const (902x)
12,628 ( 0.00%) delete pair.second;
888,072 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::~PiggyList() (902x)
81,180 ( 0.00%) => ???:operator delete(void*, unsigned long) (902x)
. }
. // invalidate it my dude
7,248 ( 0.00%) this->statesMapStale.store(true, std::memory_order_relaxed);
42,280 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<bool>::store(bool, std::memory_order) (1,208x)
.
4,832 ( 0.00%) equivalencePartition.clear();
136,128 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::clear() (1,208x)
7,248 ( 0.00%) }
.
. /**
. * Empty the relation
. */
1,208 ( 0.00%) void clear() {
1,208 ( 0.00%) statesLock.lock();
24,483 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::lock() (302x)
.
906 ( 0.00%) sds.clear();
3,364,404 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::clear() (302x)
906 ( 0.00%) emptyPartition();
582,958 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::emptyPartition() const (302x)
.
1,208 ( 0.00%) statesLock.unlock();
25,368 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::unlock() (302x)
906 ( 0.00%) }
.
. /**
. * Size of relation
. * @return the sum of the number of pairs per disjoint set
. */
8,428 ( 0.00%) std::size_t size() const {
3,612 ( 0.00%) genAllDisjointSetLists();
175,027,441 ( 0.15%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const (1,204x)
.
4,816 ( 0.00%) statesLock.lock_shared();
103,544 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::lock_shared() (1,204x)
.
1,204 ( 0.00%) std::size_t retVal = 0;
42,110 ( 0.00%) for (auto& e : this->equivalencePartition) {
177,896 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator++() (1,202x)
70,984 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator!=(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) const (2,406x)
36,120 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::begin() const (1,204x)
25,284 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::end() const (1,204x)
16,828 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator*() const (1,202x)
6,010 ( 0.00%) const std::size_t s = e.second->size();
32,454 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::size() const (1,202x)
3,606 ( 0.00%) retVal += s * s;
. }
.
4,816 ( 0.00%) statesLock.unlock_shared();
110,768 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::unlock_shared() (1,204x)
1,204 ( 0.00%) return retVal;
6,020 ( 0.00%) }
.
. // an almighty iterator for several types of iteration.
. // Unfortunately, subclassing isn't an option with souffle
. // - we don't deal with pointers (so no virtual)
. // - and a single iter type is expected (see Relation::iterator e.g.) (i think)
. class iterator {
. public:
. typedef std::forward_iterator_tag iterator_category;
. using value_type = TupleType;
. using difference_type = ptrdiff_t;
. using pointer = value_type*;
. using reference = value_type&;
.
. // one iterator for signalling the end (simplifies)
4,214 ( 0.00%) explicit iterator(const EquivalenceRelation* br, bool /* signalIsEndIterator */)
12,040 ( 0.00%) : br(br), isEndVal(true){};
12,040 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::iterator() (1,204x)
.
4,816 ( 0.00%) explicit iterator(const EquivalenceRelation* br)
. : br(br), ityp(IterType::ALL), djSetMapListIt(br->equivalencePartition.begin()),
15,050 ( 0.00%) djSetMapListEnd(br->equivalencePartition.end()) {
18,060 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::begin() const (602x)
12,642 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::end() const (602x)
. // no need to fast forward if this iterator is empty
5,418 ( 0.00%) if (djSetMapListIt == djSetMapListEnd) {
7,826 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator==(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) const (602x)
. isEndVal = true;
. return;
. }
. // grab the pointer to the list, and make it our current list
4,214 ( 0.00%) djSetList = (*djSetMapListIt).second;
8,428 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator*() const (602x)
3,612 ( 0.00%) assert(djSetList->size() != 0);
16,254 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::size() const (602x)
.
1,806 ( 0.00%) updateAnterior();
73,444 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updateAnterior() (602x)
1,806 ( 0.00%) updatePosterior();
73,444 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updatePosterior() (602x)
3,010 ( 0.00%) }
.
. // WITHIN: iterator for everything within the same DJset (used for EquivalenceRelation.partition())
. explicit iterator(const EquivalenceRelation* br, const StatesBucket within)
. : br(br), ityp(IterType::WITHIN), djSetList(within) {
. // empty dj set
. if (djSetList->size() == 0) {
. isEndVal = true;
. }
-- line 279 ----------------------------------------
-- line 308 ----------------------------------------
. }
.
. /** explicit set first half of cPair */
. inline void setAnterior(const typename TupleType::value_type a) {
. this->cPair[0] = a;
. }
.
. /** quick update to whatever the current index is pointing to */
454,510 ( 0.00%) inline void updateAnterior() {
1,272,628 ( 0.00%) this->cPair[0] = this->djSetList->get(this->cAnteriorIndex);
6,999,454 ( 0.01%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::get(unsigned long) const (90,902x)
1,999,844 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) (90,902x)
363,608 ( 0.00%) }
.
. /** explicit set second half of cPair */
. inline void setPosterior(const typename TupleType::value_type b) {
. this->cPair[1] = b;
. }
.
. /** quick update to whatever the current index is pointing to */
91,808,010 ( 0.08%) inline void updatePosterior() {
257,062,428 ( 0.22%) this->cPair[1] = this->djSetList->get(this->cPosteriorIndex);
1,413,843,354 ( 1.21%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::get(unsigned long) const (18,361,602x)
403,955,244 ( 0.34%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) (18,361,602x)
73,446,408 ( 0.06%) }
.
. // copy ctor
60,200 ( 0.00%) iterator(const iterator& other) = default;
36,120 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::iterator(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) (2,408x)
. // move ctor
. iterator(iterator&& other) = default;
. // assign iter
. iterator& operator=(const iterator& other) = default;
.
91,359,520 ( 0.08%) bool operator==(const iterator& other) const {
73,094,238 ( 0.06%) if (isEndVal && other.isEndVal) return br == other.br;
146,170,416 ( 0.12%) return isEndVal == other.isEndVal && cPair == other.cPair;
36,543,808 ( 0.03%) }
.
. bool operator!=(const iterator& other) const {
. return !((*this) == other);
. }
.
54,817,518 ( 0.05%) const TupleType& operator*() const {
36,545,012 ( 0.03%) return cPair;
36,545,012 ( 0.03%) }
.
. const TupleType* operator->() const {
. return &cPair;
. }
.
. /* pre-increment */
109,627,812 ( 0.09%) iterator& operator++() {
73,085,208 ( 0.06%) if (isEndVal) {
. throw std::out_of_range("error: incrementing an out of range iterator");
. }
.
219,255,624 ( 0.19%) switch (ityp) {
. case IterType::ALL:
. // move posterior along one
. // see if we can't move the posterior along
274,069,530 ( 0.23%) if (++cPosteriorIndex == djSetList->size()) {
493,325,154 ( 0.42%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::size() const (18,271,302x)
. // move anterior along one
. // see if we can't move the anterior along one
1,363,530 ( 0.00%) if (++cAnteriorIndex == djSetList->size()) {
2,454,354 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::size() const (90,902x)
. // move the djset it along one
. // see if we can't move it along one (we're at the end)
6,622 ( 0.00%) if (++djSetMapListIt == djSetMapListEnd) {
89,096 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator++() (602x)
12,040 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator==(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) const (602x)
1,204 ( 0.00%) isEndVal = true;
1,204 ( 0.00%) return *this;
. }
.
. // we can't iterate along this djset if it is empty
. djSetList = (*djSetMapListIt).second;
. if (djSetList->size() == 0) {
. throw std::out_of_range("error: encountered a zero size djset");
. }
.
-- line 380 ----------------------------------------
-- line 381 ----------------------------------------
. // update our cAnterior and cPosterior
. cAnteriorIndex = 0;
. cPosteriorIndex = 0;
. updateAnterior();
. updatePosterior();
. }
.
. // we moved our anterior along one
270,900 ( 0.00%) updateAnterior();
11,016,600 ( 0.01%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updateAnterior() (90,300x)
.
180,600 ( 0.00%) cPosteriorIndex = 0;
270,900 ( 0.00%) updatePosterior();
11,016,600 ( 0.01%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updatePosterior() (90,300x)
. }
. // we just moved our posterior along one
54,812,100 ( 0.05%) updatePosterior();
2,229,025,400 ( 1.90%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::updatePosterior() (18,270,700x)
.
18,270,700 ( 0.02%) break;
. case IterType::ANTERIOR:
. // step posterior along one, and if we can't, then we're done.
. if (++cPosteriorIndex == djSetList->size()) {
. isEndVal = true;
. return *this;
. }
. updatePosterior();
.
-- line 405 ----------------------------------------
-- line 426 ----------------------------------------
. cPosteriorIndex = 0;
. updatePosterior();
. }
. // we just moved our posterior along one
. updatePosterior();
. break;
. }
.
36,541,400 ( 0.03%) return *this;
91,356,510 ( 0.08%) }
.
. private:
. const EquivalenceRelation* br = nullptr;
. // special tombstone value to notify that this iter represents the end
. bool isEndVal = false;
.
. // all the different types of iterator this can be
. enum IterType { ALL, ANTERIOR, ANTPOST, WITHIN };
-- line 443 ----------------------------------------
-- line 456 ----------------------------------------
. std::size_t cPosteriorIndex = 0;
. };
.
. public:
. /**
. * iterator pointing to the beginning of the tuples, with no restrictions
. * @return the iterator that corresponds to the beginning of the binary relation
. */
3,010 ( 0.00%) iterator begin() const {
1,806 ( 0.00%) genAllDisjointSetLists();
172,731,163 ( 0.15%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const (602x)
3,010 ( 0.00%) return iterator(this);
249,830 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::iterator(souffle::EquivalenceRelation<std::array<int, 2ul> > const*) (602x)
1,806 ( 0.00%) }
.
. /**
. * iterator pointing to the end of the tuples
. * @return the iterator which represents the end of the binary rel
. */
3,010 ( 0.00%) iterator end() const {
3,612 ( 0.00%) return iterator(this, true);
28,294 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::iterator(souffle::EquivalenceRelation<std::array<int, 2ul> > const*, bool) (602x)
1,806 ( 0.00%) }
.
. /**
. * Obtains a range of elements matching the prefix of the given entry up to
. * levels elements.
. *
. * @tparam levels the length of the requested matching prefix
. * @param entry the entry to be looking for
. * @return the corresponding range of matching elements
-- line 483 ----------------------------------------
-- line 694 ----------------------------------------
. }
.
. iterator find(const TupleType& t) const {
. operation_hints context;
. return find(t, context);
. }
.
. protected:
3,000 ( 0.00%) bool containsElement(value_type e) const {
3,000 ( 0.00%) return this->sds.nodeExists(e);
454,014 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::nodeExists(int) const (600x)
1,200 ( 0.00%) }
.
. private:
. // marked as mutable due to difficulties with the const enforcement via the Relation API
. // const operations *may* safely change internal state (i.e. collapse djset forest)
. mutable souffle::SparseDisjointSet<value_type> sds;
.
. // read/write lock on equivalencePartition
. mutable std::shared_mutex statesLock;
-- line 712 ----------------------------------------
-- line 714 ----------------------------------------
. mutable StatesMap equivalencePartition;
. // whether the cache is stale
. mutable std::atomic<bool> statesMapStale;
.
. /**
. * Generate a cache of the sets such that they can be iterated over efficiently.
. * Each set is partitioned into a PiggyList.
. */
19,248 ( 0.00%) void genAllDisjointSetLists() const {
9,624 ( 0.00%) statesLock.lock();
220,191 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::lock() (2,406x)
.
. // no need to generate again, already done.
19,248 ( 0.00%) if (!this->statesMapStale.load(std::memory_order_acquire)) {
69,774 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<bool>::load(std::memory_order) const (2,406x)
6,012 ( 0.00%) statesLock.unlock();
126,252 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::unlock() (1,503x)
1,503 ( 0.00%) return;
. }
.
. // btree version
2,709 ( 0.00%) emptyPartition();
911,372 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::emptyPartition() const (903x)
.
3,612 ( 0.00%) std::size_t dSetSize = this->sds.ds.a_blocks.size();
24,381 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::size() const (903x)
461,122 ( 0.00%) for (std::size_t i = 0; i < dSetSize; ++i) {
549,012 ( 0.00%) typename TupleType::value_type sparseVal = this->sds.toSparse(i);
11,529,252 ( 0.01%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toSparse(unsigned long) const (91,502x)
640,514 ( 0.00%) parent_t rep = this->sds.findNode(sparseVal);
230,314,838 ( 0.20%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::findNode(int) (91,502x)
.
823,518 ( 0.00%) StorePair p = {static_cast<value_type>(rep), nullptr};
2,928,064 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, souffle::PiggyList<int>*>::pair<int, decltype(nullptr), true>(int&&, decltype(nullptr)&&) (91,502x)
1,289,146 ( 0.00%) StatesList* mapList = equivalencePartition.insert(p, [&](StorePair& sp) {
63,728,575 ( 0.05%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::insert(std::pair<int, souffle::PiggyList<int>*>&, std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)> const&) (91,502x)
10,065,220 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>::function<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}, void, void>(souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}) (91,502x)
8,692,690 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>::~function() (91,502x)
7,216 ( 0.00%) auto* r = new StatesList(1);
193,028 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::PiggyList(unsigned long) (902x)
50,202 ( 0.00%) => ???:operator new(unsigned long) (902x)
2,706 ( 0.00%) sp.second = r;
902 ( 0.00%) return r;
. });
457,510 ( 0.00%) mapList->append(sparseVal);
14,889,109 ( 0.01%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::append(int) (91,502x)
. }
.
5,418 ( 0.00%) statesMapStale.store(false, std::memory_order_release);
31,605 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<bool>::store(bool, std::memory_order) (903x)
3,612 ( 0.00%) statesLock.unlock();
75,852 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/shared_mutex:std::shared_mutex::unlock() (903x)
15,339 ( 0.00%) }
. };
. } // namespace souffle
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/test.cpp
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/test.cpp
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h
--------------------------------------------------------------------------------
Ir
-- line 41 ----------------------------------------
. // block_t stores parent in the upper half, rank in the lower half
. using block_t = uint64_t;
. // block_t & rank_mask extracts the rank
. constexpr block_t rank_mask = (1ul << split_size) - 1;
.
. /**
. * Structure that emulates a Disjoint Set, i.e. a data structure that supports efficient union-find operations
. */
30 ( 0.00%) class DisjointSet {
861 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::~PiggyList() (3x)
. template <typename TupleType>
. friend class EquivalenceRelation;
.
. PiggyList<std::atomic<block_t>> a_blocks;
.
. public:
30 ( 0.00%) DisjointSet() = default;
636 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::PiggyList() (3x)
.
. // copy ctor
. DisjointSet(DisjointSet& other) = delete;
. // move ctor
. DisjointSet(DisjointSet&& other) = delete;
.
. // copy assign ctor
. DisjointSet& operator=(DisjointSet& ds) = delete;
-- line 64 ----------------------------------------
-- line 73 ----------------------------------------
. return sz;
. };
.
. /**
. * Yield reference to the node by its node index
. * @param node node to be searched
. * @return the parent block of the specified node
. */
917,837,600 ( 0.78%) inline std::atomic<block_t>& get(parent_t node) const {
1,101,405,120 ( 0.94%) auto& ret = a_blocks.get(node);
14,134,699,040 (12.05%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::get(unsigned long) const (183,567,520x)
183,567,520 ( 0.16%) return ret;
367,135,040 ( 0.31%) };
.
. /**
. * Equivalent to the find() function in union/find
. * Find the highest ancestor of the provided node - flattening as we go
. * @param x the node to find the parent of, whilst flattening its set-tree
. * @return The parent of x
. */
294,890,816 ( 0.25%) parent_t findNode(parent_t x) {
. // while x's parent is not itself
992,024,492 ( 0.85%) while (x != b2p(get(x))) {
6,687,757,986 ( 5.70%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (73,491,846x)
1,910,787,996 ( 1.63%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (73,491,846x)
514,442,922 ( 0.44%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2p(unsigned long) (73,491,846x)
293,043,952 ( 0.25%) block_t xState = get(x);
3,333,374,954 ( 2.84%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (36,630,494x)
952,392,844 ( 0.81%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (36,630,494x)
. // yield x's parent's parent
476,196,422 ( 0.41%) parent_t newParent = b2p(get(b2p(xState)));
3,333,374,954 ( 2.84%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (36,630,494x)
952,392,844 ( 0.81%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (36,630,494x)
512,826,916 ( 0.44%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2p(unsigned long) (73,260,988x)
. // construct block out of the original rank and the new parent
329,674,446 ( 0.28%) block_t newState = pr2b(newParent, b2r(xState));
439,565,928 ( 0.37%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::pr2b(unsigned long, unsigned char) (36,630,494x)
219,782,964 ( 0.19%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2r(unsigned long) (36,630,494x)
.
329,674,446 ( 0.28%) this->get(x).compare_exchange_strong(xState, newState);
3,333,374,954 ( 2.84%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (36,630,494x)
.
73,260,988 ( 0.06%) x = newParent;
. }
36,861,352 ( 0.03%) return x;
184,306,760 ( 0.16%) }
.
. private:
. /**
. * Update the root of the tree of which x is, to have y as the base instead
. * @param x : old root
. * @param oldrank : old root rank
. * @param y : new root
. * @param newrank : new root rank
. * @return Whether the update succeeded (fails if another root update/union has been perfomed in the
. * interim)
. */
648,858 ( 0.00%) bool updateRoot(const parent_t x, const rank_t oldrank, const parent_t y, const rank_t newrank) {
370,776 ( 0.00%) block_t oldState = get(x);
4,217,577 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (46,347x)
1,205,022 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (46,347x)
185,388 ( 0.00%) parent_t nextN = b2p(oldState);
324,429 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2p(unsigned long) (46,347x)
185,388 ( 0.00%) rank_t rankN = b2r(oldState);
278,082 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2r(unsigned long) (46,347x)
.
278,082 ( 0.00%) if (nextN != x || rankN != oldrank) return false;
. // set the parent and rank of the new record
278,082 ( 0.00%) block_t newVal = pr2b(y, newrank);
556,164 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::pr2b(unsigned long, unsigned char) (46,347x)
.
463,470 ( 0.00%) return this->get(x).compare_exchange_strong(oldState, newVal);
4,217,577 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (46,347x)
231,735 ( 0.00%) }
.
. public:
. /**
. * Clears the DisjointSet of all nodes
. * Invalidates all iterators
. */
1,208 ( 0.00%) void clear() {
906 ( 0.00%) a_blocks.clear();
173,309 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::clear() (302x)
906 ( 0.00%) }
.
. /**
. * Check whether the two indices are in the same set
. * @param x node to be checked
. * @param y node to be checked
. * @return where the two indices are in the same set
. */
55,086,588 ( 0.05%) bool sameSet(parent_t x, parent_t y) {
. while (true) {
55,086,588 ( 0.05%) x = findNode(x);
7,296,529,695 ( 6.22%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) (9,181,098x)
55,086,588 ( 0.05%) y = findNode(y);
7,296,914,660 ( 6.22%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) (9,181,098x)
45,904,294 ( 0.04%) if (x == y) return true;
. // if x's parent is itself, they are not the same set
8,372 ( 0.00%) if (b2p(get(x)) == x) return false;
54,418 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (598x)
15,548 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (598x)
4,186 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2p(unsigned long) (598x)
. }
18,362,196 ( 0.02%) }
.
. /**
. * Union the two specified index nodes
. * @param x node to be unioned
. * @param y node to be unioned
. */
82,629,918 ( 0.07%) void unionNodes(parent_t x, parent_t y) {
. while (true) {
55,086,612 ( 0.05%) x = findNode(x);
7,267,511,702 ( 6.20%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) (9,181,102x)
55,086,612 ( 0.05%) y = findNode(y);
7,296,529,005 ( 6.22%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) (9,181,102x)
.
. // no need to union if both already in same set
45,860,060 ( 0.04%) if (x == y) return;
.
454,500 ( 0.00%) rank_t xrank = b2r(get(x));
4,135,950 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (45,450x)
1,181,700 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (45,450x)
272,700 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2r(unsigned long) (45,450x)
454,500 ( 0.00%) rank_t yrank = b2r(get(y));
4,135,950 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::get(unsigned long) const (45,450x)
1,181,700 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (45,450x)
272,700 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2r(unsigned long) (45,450x)
.
. // if x comes before y (better rank or earlier & equal node)
367,188 ( 0.00%) if (xrank > yrank || ((xrank == yrank) && x > y)) {
2,995 ( 0.00%) std::swap(x, y);
29,351 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::enable_if<std::__and_<std::__not_<std::__is_tuple_like<unsigned long> >, std::is_move_constructible<unsigned long>, std::is_move_assignable<unsigned long> >::value, void>::type std::swap<unsigned long>(unsigned long&, unsigned long&) (599x)
2,995 ( 0.00%) std::swap(xrank, yrank);
29,351 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::enable_if<std::__and_<std::__not_<std::__is_tuple_like<unsigned char> >, std::is_move_constructible<unsigned char>, std::is_move_assignable<unsigned char> >::value, void>::type std::swap<unsigned char>(unsigned char&, unsigned char&) (599x)
. }
. // join the trees together
. // perhaps we can optimise the use of compare_exchange_strong here, as we're in a pessimistic loop
590,850 ( 0.00%) if (!updateRoot(x, xrank, y, yrank)) {
18,225,450 ( 0.02%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::updateRoot(unsigned long, unsigned char, unsigned long, unsigned char) (45,450x)
. continue;
. }
. // make sure that the ranks are orderable
181,800 ( 0.00%) if (xrank == yrank) {
10,764 ( 0.00%) updateRoot(y, yrank, y, yrank + 1);
359,697 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::updateRoot(unsigned long, unsigned char, unsigned long, unsigned char) (897x)
. }
. break;
. }
45,905,510 ( 0.04%) }
.
. /**
. * Create a node with its parent as itself, rank 0
. * @return the newly created block
. */
228,760 ( 0.00%) inline block_t makeNode() {
. // make node and find out where we've added it
183,008 ( 0.00%) std::size_t nodeDetails = a_blocks.createNode();
82,105,655 ( 0.07%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::createNode() (45,752x)
.
594,776 ( 0.00%) a_blocks.get(nodeDetails).store(pr2b(nodeDetails, 0));
3,522,904 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::get(unsigned long) const (45,752x)
549,024 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::pr2b(unsigned long, unsigned char) (45,752x)
.
320,264 ( 0.00%) return a_blocks.get(nodeDetails).load();
3,522,904 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::get(unsigned long) const (45,752x)
137,256 ( 0.00%) };
.
. /**
. * Extract parent from block
. * @param inblock the block to be masked
. * @return The parent_t contained in the upper half of block_t
. */
440,536,593 ( 0.38%) static inline parent_t b2p(const block_t inblock) {
293,691,062 ( 0.25%) return (parent_t)(inblock >> split_size);
293,691,062 ( 0.25%) };
.
. /**
. * Extract rank from block
. * @param inblock the block to be masked
. * @return the rank_t contained in the lower half of block_t
. */
110,303,223 ( 0.09%) static inline rank_t b2r(const block_t inblock) {
36,767,741 ( 0.03%) return (rank_t)(inblock & rank_mask);
73,535,482 ( 0.06%) };
.
. /**
. * Yield a block given parent and rank
. * @param parent the top half bits
. * @param rank the lower half bits
. * @return the resultant block after merge
. */
183,612,965 ( 0.16%) static inline block_t pr2b(const parent_t parent, const rank_t rank) {
183,612,965 ( 0.16%) return (((block_t)parent) << split_size) | rank;
73,445,186 ( 0.06%) };
. };
.
. template <typename StorePair>
. struct EqrelMapComparator {
2,660,652,635 ( 2.27%) int operator()(const StorePair& a, const StorePair& b) {
3,192,783,162 ( 2.72%) if (a.first < b.first) {
352,927,604 ( 0.30%) return -1;
2,134,000,350 ( 1.82%) } else if (b.first < a.first) {
490,257,466 ( 0.42%) return 1;
. } else {
110,537,992 ( 0.09%) return 0;
. }
1,064,261,054 ( 0.91%) }
.
. bool less(const StorePair& a, const StorePair& b) {
. return operator()(a, b) < 0;
. }
.
735,393,324 ( 0.63%) bool equal(const StorePair& a, const StorePair& b) {
980,524,432 ( 0.84%) return operator()(a, b) == 0;
2,516,510,860 ( 2.15%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (122,474,954x)
245,131,108 ( 0.21%) }
. };
.
. template <typename SparseDomain>
54 ( 0.00%) class SparseDisjointSet {
25,455 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::~RandomInsertPiggyList() (3x)
5,412 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::LambdaBTreeSet<std::pair<int, unsigned long>, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search>::~LambdaBTreeSet() (3x)
891 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::~DisjointSet() (3x)
. DisjointSet ds;
.
. template <typename TupleType>
. friend class EquivalenceRelation;
.
. using PairStore = std::pair<SparseDomain, parent_t>;
. using SparseMap =
. LambdaBTreeSet<PairStore, std::function<parent_t(PairStore&)>, EqrelMapComparator<PairStore>>;
-- line 261 ----------------------------------------
-- line 268 ----------------------------------------
. DenseMap denseToSparseMap;
.
. public:
. /**
. * Retrieve dense encoding, adding it in if non-existent
. * @param in the sparse value
. * @return the corresponding dense value
. */
331,752,168 ( 0.28%) parent_t toDense(const SparseDomain in) {
. // insert into the mapping - if the key doesn't exist (in), the function will be called
. // and a dense value will be created for it
258,029,464 ( 0.22%) PairStore p = {in, -1};
958,395,152 ( 0.82%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::pair<int, true>(int const&, int&&) (36,861,352x)
590,284,904 ( 0.50%) return sparseToDenseMap.insert(p, [&](PairStore& p) {
49,794,343,397 (42.46%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&) (36,861,352x)
4,275,916,832 ( 3.65%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::function<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}, void, void>(souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}) (36,861,352x)
3,501,828,440 ( 2.99%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::~function() (36,861,352x)
228,760 ( 0.00%) parent_t c2 = DisjointSet::b2p(this->ds.makeNode());
92,765,871 ( 0.08%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::makeNode() (45,752x)
320,264 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::b2p(unsigned long) (45,752x)
320,264 ( 0.00%) this->denseToSparseMap.insertAt(c2, p.first);
10,227,184 ( 0.01%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::insertAt(unsigned long, int) (45,752x)
137,256 ( 0.00%) p.second = c2;
45,752 ( 0.00%) return c2;
73,722,704 ( 0.06%) });
221,168,112 ( 0.19%) }
.
. public:
96 ( 0.00%) SparseDisjointSet() = default;
666 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::DisjointSet() (3x)
456 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::RandomInsertPiggyList() (3x)
297 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::LambdaBTreeSet<std::pair<int, unsigned long>, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search>::LambdaBTreeSet(souffle::EqrelMapComparator<std::pair<int, unsigned long> > const&) (3x)
162 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>::btree_operation_hints() (3x)
.
. // copy ctor
. SparseDisjointSet(SparseDisjointSet& other) = delete;
.
. // move ctor
. SparseDisjointSet(SparseDisjointSet&& other) = delete;
.
. // copy assign ctor
-- line 297 ----------------------------------------
-- line 301 ----------------------------------------
. SparseDisjointSet& operator=(SparseDisjointSet&& other) = delete;
.
. /**
. * For the given dense value, return the associated sparse value
. * Undefined behaviour if dense value not in set
. * @param in the supplied dense value
. * @return the sparse value from the denseToSparseMap
. */
1,142,270 ( 0.00%) inline const SparseDomain toSparse(const parent_t in) const {
1,599,178 ( 0.00%) return denseToSparseMap.get(in);
25,586,848 ( 0.02%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::get(unsigned long) const (228,454x)
456,908 ( 0.00%) };
.
. /* a wrapper to enable checking in the sparse set - however also adds them if not already existing */
73,448,784 ( 0.06%) inline bool sameSet(SparseDomain x, SparseDomain y) {
146,897,568 ( 0.13%) return ds.sameSet(toDense(x), toDense(y));
29,832,042,889 (25.44%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toDense(int) (18,362,196x)
14,823,053,133 (12.64%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::sameSet(unsigned long, unsigned long) (9,181,098x)
45,905,490 ( 0.04%) };
. /* finds the node in the underlying disjoint set, adding the node if non-existent */
821,712 ( 0.00%) inline SparseDomain findNode(SparseDomain x) {
1,917,328 ( 0.00%) return toSparse(ds.findNode(toDense(x)));
215,972,132 ( 0.18%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toDense(int) (136,952x)
108,508,708 ( 0.09%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::findNode(unsigned long) (136,952x)
17,255,952 ( 0.01%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toSparse(unsigned long) const (136,952x)
410,856 ( 0.00%) };
. /* union the nodes, add if not existing */
73,448,816 ( 0.06%) inline void unionNodes(SparseDomain x, SparseDomain y) {
146,897,632 ( 0.13%) ds.unionNodes(toDense(x), toDense(y));
29,956,922,880 (25.54%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::toDense(int) (18,362,204x)
14,880,499,560 (12.69%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::unionNodes(unsigned long, unsigned long) (9,181,102x)
55,086,612 ( 0.05%) };
.
. inline std::size_t size() {
. return ds.size();
. };
.
. /**
. * Remove all elements from this disjoint set
. */
1,208 ( 0.00%) void clear() {
906 ( 0.00%) ds.clear();
176,329 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::DisjointSet::clear() (302x)
1,208 ( 0.00%) sparseToDenseMap.clear();
568,048 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::clear() (302x)
1,208 ( 0.00%) denseToSparseMap.clear();
2,614,591 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::clear() (302x)
906 ( 0.00%) }
.
. /* wrapper for node creation */
. inline void makeNode(SparseDomain val) {
. // dense has the behaviour of creating if not exists.
. toDense(val);
. };
.
. /* whether we the supplied node exists */
165,676,950 ( 0.14%) inline bool nodeExists(const SparseDomain val) const {
239,311,150 ( 0.20%) return sparseToDenseMap.contains({val, -1});
16,464,867,350 (14.04%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::contains(std::pair<int, unsigned long> const&) const (18,408,550x)
478,622,300 ( 0.41%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::pair<int, true>(int const&, int&&) (18,408,550x)
110,451,300 ( 0.09%) };
.
55,359,312 ( 0.05%) inline bool contains(SparseDomain v1, SparseDomain v2) {
165,716,404 ( 0.14%) if (nodeExists(v1) && nodeExists(v2)) {
17,458,475,036 (14.89%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::nodeExists(int) const (18,407,950x)
64,267,686 ( 0.05%) return sameSet(v1, v2);
44,921,347,864 (38.30%) => ../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::SparseDisjointSet<int>::sameSet(int, int) (9,181,098x)
. }
45,454 ( 0.00%) return false;
18,453,104 ( 0.02%) }
. };
. } // namespace souffle
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h
--------------------------------------------------------------------------------
Ir
-- line 172 ----------------------------------------
. * A small utility class for implementing simple locks.
. */
. class Lock {
. // the underlying mutex
. std::mutex mux;
.
. public:
. struct Lease {
8 ( 0.00%) Lease(std::mutex& mux) : mux(&mux) {
3 ( 0.00%) mux.lock();
67 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_mutex.h:std::mutex::lock() (1x)
3 ( 0.00%) }
. Lease(Lease&& other) : mux(other.mux) {
. other.mux = nullptr;
. }
. Lease(const Lease& other) = delete;
4 ( 0.00%) ~Lease() {
4 ( 0.00%) if (mux != nullptr) {
4 ( 0.00%) mux->unlock();
57 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_mutex.h:std::mutex::unlock() (1x)
. }
3 ( 0.00%) }
.
. protected:
. std::mutex* mux;
. };
.
. // acquired the lock for the live-cycle of the returned guard
5 ( 0.00%) Lease acquire() {
5 ( 0.00%) return Lease(mux);
81 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::Lock::Lease::Lease(std::mutex&) (1x)
3 ( 0.00%) }
.
. void lock() {
. mux.lock();
. }
.
. bool try_lock() {
. return mux.try_lock();
. }
-- line 208 ----------------------------------------
-- line 248 ----------------------------------------
. };
. } // namespace detail
.
. /* compare: http://en.cppreference.com/w/cpp/atomic/atomic_flag */
. class SpinLock {
. std::atomic<int> lck{0};
.
. public:
9,988 ( 0.00%) SpinLock() = default;
20,884 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int>::atomic(int) (908x)
.
43,708 ( 0.00%) void lock() {
6,244 ( 0.00%) detail::Waiter wait;
37,464 ( 0.00%) while (!try_lock()) {
799,232 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::try_lock() (6,244x)
. wait();
. }
37,464 ( 0.00%) }
.
43,708 ( 0.00%) bool try_lock() {
6,244 ( 0.00%) int should = 0;
24,976 ( 0.00%) return lck.compare_exchange_weak(should, 1, std::memory_order_acquire);
31,220 ( 0.00%) }
.
24,976 ( 0.00%) void unlock() {
24,976 ( 0.00%) lck.store(0, std::memory_order_release);
18,732 ( 0.00%) }
. };
.
. /**
. * A read/write lock for increased access performance on a
. * read-heavy use case.
. */
. class ReadWriteLock {
. /**
-- line 280 ----------------------------------------
-- line 373 ----------------------------------------
. /**
. * The lease utilized to link start and end of read phases.
. */
. class Lease {
. friend class OptimisticReadWriteLock;
. int version;
.
. public:
1,668,305,600 ( 1.42%) Lease(int version = 0) : version(version) {}
. Lease(const Lease& lease) = default;
. Lease& operator=(const Lease& other) = default;
. Lease& operator=(Lease&& other) = default;
. };
.
. /**
. * A default constructor initializing the lock.
. */
50,204 ( 0.00%) OptimisticReadWriteLock() = default;
104,972 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int>::atomic(int) (4,564x)
.
. /**
. * Starts a read phase, making sure that there is currently no
. * active concurrent modification going on. The resulting lease
. * enables the invoking process to later-on verify that no
. * concurrent modifications took place.
. */
909,132,000 ( 0.78%) Lease start_read() {
129,876,000 ( 0.11%) detail::Waiter wait;
.
. // get a snapshot of the lease version
519,504,000 ( 0.44%) auto v = version.load(std::memory_order_acquire);
.
. // spin while there is a write in progress
519,504,000 ( 0.44%) while ((v & 0x1) == 1) {
. // wait for a moment
. wait();
. // get an updated version
. v = version.load(std::memory_order_acquire);
. }
.
. // done
779,256,000 ( 0.66%) return Lease(v);
1,298,760,000 ( 1.11%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::Lease::Lease(int) (129,876,000x)
649,380,000 ( 0.55%) }
.
. /**
. * Tests whether there have been concurrent modifications since
. * the given lease has been issued.
. *
. * @return true if no updates have been conducted, false otherwise
. */
1,167,136,880 ( 1.00%) bool validate(const Lease& lease) {
. // check whether version number has changed in the mean-while
. std::atomic_thread_fence(std::memory_order_acquire);
1,167,136,880 ( 1.00%) return lease.version == version.load(std::memory_order_relaxed);
500,201,520 ( 0.43%) }
.
. /**
. * Ends a read phase by validating the given lease.
. *
. * @return true if no updates have been conducted since the
. * issuing of the lease, false otherwise
. */
464,607,200 ( 0.40%) bool end_read(const Lease& lease) {
. // check lease in the end
464,607,200 ( 0.40%) return validate(lease);
3,252,250,400 ( 2.77%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) (92,921,440x)
185,842,880 ( 0.16%) }
.
. /**
. * Starts a write phase on this lock be ensuring exclusive access
. * and invalidating any existing read lease.
. */
61,292 ( 0.00%) void start_write() {
8,756 ( 0.00%) detail::Waiter wait;
.
. // set last bit => make it odd
43,780 ( 0.00%) auto v = version.fetch_or(0x1, std::memory_order_acquire);
.
. // check for concurrent writes
35,024 ( 0.00%) while ((v & 0x1) == 1) {
. // wait for a moment
. wait();
. // get an updated version
. v = version.fetch_or(0x1, std::memory_order_acquire);
. }
.
. // done
52,536 ( 0.00%) }
.
. /**
. * Tries to start a write phase unless there is a currently ongoing
. * write operation. In this case no write permission will be obtained.
. *
. * @return true if write permission has been granted, false otherwise.
. */
19,572 ( 0.00%) bool try_start_write() {
32,620 ( 0.00%) auto v = version.fetch_or(0x1, std::memory_order_acquire);
26,096 ( 0.00%) return !(v & 0x1);
13,048 ( 0.00%) }
.
. /**
. * Updates a read-lease to a write permission by a) validating that the
. * given lease is still valid and b) making sure that there is no currently
. * ongoing write operation.
. *
. * @return true if the lease was still valid and write permissions could
. * be granted, false otherwise.
. */
241,800 ( 0.00%) bool try_upgrade_to_write(const Lease& lease) {
241,800 ( 0.00%) auto v = version.fetch_or(0x1, std::memory_order_acquire);
.
. // check whether write privileges have been gained
193,440 ( 0.00%) if (v & 0x1) return false; // there is another writer already
.
. // check whether there was no write since the gain of the read lock
290,160 ( 0.00%) if (lease.version == v) return true;
.
. // if there was, undo write update
. abort_write();
.
. // operation failed
. return false;
96,720 ( 0.00%) }
.
. /**
. * Aborts a write operation by reverting to the version number before
. * starting the ongoing write, thereby re-validating existing leases.
. */
8,112 ( 0.00%) void abort_write() {
. // reset version number
10,816 ( 0.00%) version.fetch_sub(1, std::memory_order_release);
8,112 ( 0.00%) }
.
. /**
. * Ends a write operation by giving up the associated exclusive access
. * to the protected data and abandoning the provided write permission.
. */
182,808 ( 0.00%) void end_write() {
. // update version number another time
243,744 ( 0.00%) version.fetch_add(1, std::memory_order_release);
182,808 ( 0.00%) }
.
. /**
. * Tests whether currently write permissions have been granted to any
. * client by this lock.
. *
. * @return true if so, false otherwise
. */
104,720 ( 0.00%) bool is_write_locked() const {
157,080 ( 0.00%) return version & 0x1;
654,500 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<int>::operator int() const (26,180x)
52,360 ( 0.00%) }
. };
.
. /** Concurrent tracks locking mechanism. */
. struct MutexConcurrentLanes {
. using lane_id = std::size_t;
. using unique_lock_type = std::unique_lock<std::mutex>;
.
783 ( 0.00%) explicit MutexConcurrentLanes(const std::size_t Sz) : Size(Sz), Attribution(attribution(Sz)) {
2,133 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::unique_ptr<std::default_delete<souffle::MutexConcurrentLanes::Lane []>, void>() (27x)
594 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_mutex.h:std::mutex::mutex() (27x)
405 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::MutexConcurrentLanes::attribution(unsigned long) (27x)
378 ( 0.00%) Lanes = std::make_unique<Lane[]>(Sz);
17,472 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::_MakeUniq<souffle::MutexConcurrentLanes::Lane []>::__array std::make_unique<souffle::MutexConcurrentLanes::Lane []>(unsigned long) (27x)
9,342 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::operator=(std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >&&) (27x)
1,593 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::~unique_ptr() (27x)
189 ( 0.00%) }
. MutexConcurrentLanes(const MutexConcurrentLanes&) = delete;
. MutexConcurrentLanes(MutexConcurrentLanes&&) = delete;
.
405 ( 0.00%) virtual ~MutexConcurrentLanes() {}
6,615 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::~unique_ptr() (27x)
.
. // Return the number of lanes.
39 ( 0.00%) std::size_t lanes() const {
26 ( 0.00%) return Size;
26 ( 0.00%) }
.
. // Select a lane
. lane_id getLane(std::size_t I) const {
. if (Attribution == lane_attribution::mod_power_of_2) {
. return I & (Size - 1);
. } else {
. return I % Size;
. }
. }
.
. /** Change the number of lanes.
. * DO not use while threads are using this object.
. */
216 ( 0.00%) void setNumLanes(const std::size_t NumLanes) {
162 ( 0.00%) Size = (NumLanes == 0 ? 1 : NumLanes);
162 ( 0.00%) Attribution = attribution(Size);
405 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::MutexConcurrentLanes::attribution(unsigned long) (27x)
405 ( 0.00%) Lanes = std::make_unique<Lane[]>(Size);
17,039 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::_MakeUniq<souffle::MutexConcurrentLanes::Lane []>::__array std::make_unique<souffle::MutexConcurrentLanes::Lane []>(unsigned long) (27x)
13,945 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::operator=(std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >&&) (27x)
1,593 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::MutexConcurrentLanes::Lane [], std::default_delete<souffle::MutexConcurrentLanes::Lane []> >::~unique_ptr() (27x)
162 ( 0.00%) }
.
. unique_lock_type guard(const lane_id Lane) const {
. return unique_lock_type(Lanes[Lane].Access);
. }
.
. // Lock the given track.
. // Must eventually be followed by unlock(Lane).
. void lock(const lane_id Lane) const {
-- line 566 ----------------------------------------
-- line 620 ----------------------------------------
. Lanes[I].Access.unlock();
. }
. }
. }
.
. private:
. enum lane_attribution { mod_power_of_2, mod_other };
.
540 ( 0.00%) struct Lane {
1,188 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_mutex.h:std::mutex::mutex() (54x)
. alignas(hardware_destructive_interference_size) std::mutex Access;
. };
.
216 ( 0.00%) static constexpr lane_attribution attribution(const std::size_t Sz) {
108 ( 0.00%) assert(Sz > 0);
270 ( 0.00%) if ((Sz & (Sz - 1)) == 0) {
. // Sz is a power of 2
108 ( 0.00%) return lane_attribution::mod_power_of_2;
. } else {
. return lane_attribution::mod_other;
. }
108 ( 0.00%) }
.
. protected:
. std::size_t Size;
. lane_attribution Attribution;
.
. private:
. mutable std::unique_ptr<Lane[]> Lanes;
.
. alignas(hardware_destructive_interference_size) mutable std::mutex BeforeLockAll;
. };
.
378 ( 0.00%) class ConcurrentLanes : public MutexConcurrentLanes {
7,020 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::MutexConcurrentLanes::~MutexConcurrentLanes() (27x)
. using Base = MutexConcurrentLanes;
.
. public:
. using lane_id = Base::lane_id;
. using Base::beforeLockAllBut;
. using Base::beforeUnlockAllBut;
. using Base::guard;
. using Base::lock;
. using Base::lockAllBut;
. using Base::unlock;
. using Base::unlockAllBut;
.
459 ( 0.00%) explicit ConcurrentLanes(const std::size_t Sz) : MutexConcurrentLanes(Sz) {}
32,889 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::MutexConcurrentLanes::MutexConcurrentLanes(unsigned long) (27x)
. ConcurrentLanes(const ConcurrentLanes&) = delete;
. ConcurrentLanes(ConcurrentLanes&&) = delete;
.
. lane_id threadLane() const {
. return getLane(static_cast<std::size_t>(omp_get_thread_num()));
. }
.
162 ( 0.00%) void setNumLanes(const std::size_t NumLanes) {
189 ( 0.00%) Base::setNumLanes(NumLanes == 0 ? omp_get_max_threads() : NumLanes);
34,089 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::MutexConcurrentLanes::setNumLanes(unsigned long) (27x)
108 ( 0.00%) }
.
. unique_lock_type guard() const {
. return Base::guard(threadLane());
. }
.
. void lock() const {
. return Base::lock(threadLane());
. }
-- line 683 ----------------------------------------
-- line 851 ----------------------------------------
. }
. };
.
. #endif
.
. /**
. * Obtains a reference to the lock synchronizing output operations.
. */
2 ( 0.00%) inline Lock& getOutputLock() {
. static Lock outputLock;
1 ( 0.00%) return outputLock;
2 ( 0.00%) }
.
. } // namespace souffle
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h
--------------------------------------------------------------------------------
Ir
-- line 135 ----------------------------------------
. * Obtains an iterator pointing to some element within the given
. * range that is equal to the given key, if available. If multiple
. * elements are equal to the given key, an undefined instance will
. * be obtained (no guaranteed lower or upper boundary). If no such
. * element is present, a reference to the first element not less than
. * the given key will be returned.
. */
. template <typename Key, typename Iter, typename Comp>
370,879,912 ( 0.32%) Iter operator()(const Key& k, Iter a, Iter b, Comp& comp) const {
. Iter c;
185,439,956 ( 0.16%) auto count = b - a;
373,404,588 ( 0.32%) while (count > 0) {
383,292,405 ( 0.33%) auto step = count >> 1;
766,584,810 ( 0.65%) c = a + step;
894,348,945 ( 0.76%) auto r = comp(*c, k);
2,379,567,597 ( 2.03%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (127,764,135x)
255,528,270 ( 0.22%) if (r == 0) {
36,725,592 ( 0.03%) return c;
. }
218,802,678 ( 0.19%) if (r < 0) {
142,558,221 ( 0.12%) a = ++c;
237,597,035 ( 0.20%) count -= step + 1;
. } else {
123,763,864 ( 0.11%) count = step;
. }
. }
27,997,193 ( 0.02%) return a;
92,719,978 ( 0.08%) }
.
. /**
. * Obtains a reference to the first element in the given range that
. * is not less than the given key.
. */
. template <typename Key, typename Iter, typename Comp>
466,657,520 ( 0.40%) Iter lower_bound(const Key& k, Iter a, Iter b, Comp& comp) const {
. Iter c;
233,328,760 ( 0.20%) auto count = b - a;
496,221,916 ( 0.42%) while (count > 0) {
442,374,987 ( 0.38%) auto step = count >> 1;
884,749,974 ( 0.75%) c = a + step;
1,327,124,961 ( 1.13%) if (comp(*c, k) < 0) {
2,717,354,893 ( 2.32%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (147,458,329x)
188,452,353 ( 0.16%) a = ++c;
314,087,255 ( 0.27%) count -= step + 1;
. } else {
169,281,756 ( 0.14%) count = step;
. }
. }
58,332,190 ( 0.05%) return a;
116,664,380 ( 0.10%) }
.
. /**
. * Obtains a reference to the first element in the given range that
. * such that the given key is less than the referenced element.
. */
. template <typename Key, typename Iter, typename Comp>
276,714,000 ( 0.24%) Iter upper_bound(const Key& k, Iter a, Iter b, Comp& comp) const {
. Iter c;
138,357,000 ( 0.12%) auto count = b - a;
403,942,999 ( 0.34%) while (count > 0) {
403,027,527 ( 0.34%) auto step = count >> 1;
806,055,054 ( 0.69%) c = a + step;
1,343,425,090 ( 1.15%) if (comp(k, *c) >= 0) {
2,388,362,913 ( 2.04%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::operator()(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (134,251,909x)
204,789,084 ( 0.17%) a = ++c;
341,315,140 ( 0.29%) count -= step + 1;
. } else {
132,158,962 ( 0.11%) count = step;
. }
. }
34,589,250 ( 0.03%) return a;
69,178,500 ( 0.06%) }
. };
.
. // ---------- search strategies selection --------------
.
. /**
. * A template-meta class to select search strategies for b-trees
. * depending on the key type.
. */
-- line 211 ----------------------------------------
-- line 266 ----------------------------------------
. /* ---------- comparison utilities ---------------- */
.
. mutable Comparator comp;
.
. bool less(const Key& a, const Key& b) const {
. return comp.less(a, b);
. }
.
244,663,032 ( 0.21%) bool equal(const Key& a, const Key& b) const {
244,663,032 ( 0.21%) return comp.equal(a, b);
1,490,392,568 ( 1.27%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (40,777,172x)
81,554,344 ( 0.07%) }
.
. mutable WeakComparator weak_comp;
.
. bool weak_less(const Key& a, const Key& b) const {
. return weak_comp.less(a, b);
. }
.
490,730,292 ( 0.42%) bool weak_equal(const Key& a, const Key& b) const {
572,518,674 ( 0.49%) return weak_comp.equal(a, b);
2,985,717,556 ( 2.55%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h:souffle::EqrelMapComparator<std::pair<int, unsigned long> >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) (81,697,782x)
163,576,764 ( 0.14%) }
.
. /* -------------- updater utilities ------------- */
.
. mutable Updater upd;
. void update(Key& old_k, const Key& new_k) {
. upd.update(old_k, new_k);
. }
.
-- line 294 ----------------------------------------
-- line 330 ----------------------------------------
. #endif
.
. // a flag indicating whether this is a inner node or not
. const bool inner;
.
. /**
. * A simple constructor for nodes
. */
100,276 ( 0.00%) base(bool inner) : parent(nullptr), numElements(0), position(0), inner(inner) {}
30,668 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::OptimisticReadWriteLock() (902x)
.
221,394 ( 0.00%) bool isLeaf() const {
221,394 ( 0.00%) return !inner;
147,596 ( 0.00%) }
.
35,232 ( 0.00%) bool isInner() const {
23,488 ( 0.00%) return inner;
23,488 ( 0.00%) }
.
19,842 ( 0.00%) node* getParent() const {
13,228 ( 0.00%) return parent;
13,228 ( 0.00%) }
.
19,842 ( 0.00%) field_index_type getPositionInParent() const {
13,228 ( 0.00%) return position;
13,228 ( 0.00%) }
.
183,738 ( 0.00%) size_type getNumElements() const {
122,492 ( 0.00%) return numElements;
122,492 ( 0.00%) }
. };
.
. struct inner_node;
.
. /**
. * The actual, generic node implementation covering the operations
. * for both, inner and leaf nodes.
. */
-- line 366 ----------------------------------------
-- line 375 ----------------------------------------
. * The actual number of keys/node corrected by functional requirements.
. */
. static constexpr std::size_t maxKeys = (desiredNumKeys > 3) ? desiredNumKeys : 3;
.
. // the keys stored in this node
. Key keys[maxKeys];
.
. // a simple constructor
218,784 ( 0.00%) node(bool inner) : base(inner) {}
204,736 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::base(bool) (3,656x)
.
. /**
. * A deep-copy operation creating a clone of this node.
. */
. node* clone() const {
. // create a clone of this node
. node* res = (this->isInner()) ? static_cast<node*>(new inner_node())
. : static_cast<node*>(new leaf_node());
-- line 391 ----------------------------------------
-- line 413 ----------------------------------------
. // that's it
. return res;
. }
.
. /**
. * A utility function providing a reference to this node as
. * an inner node.
. */
11,736 ( 0.00%) inner_node& asInnerNode() {
11,736 ( 0.00%) assert(this->inner && "Invalid cast!");
2,934 ( 0.00%) return *static_cast<inner_node*>(this);
5,868 ( 0.00%) }
.
. /**
. * A utility function providing a reference to this node as
. * a const inner node.
. */
335,719,596 ( 0.29%) const inner_node& asInnerNode() const {
335,719,596 ( 0.29%) assert(this->inner && "Invalid cast!");
83,929,899 ( 0.07%) return *static_cast<const inner_node*>(this);
167,859,798 ( 0.14%) }
.
. /**
. * Computes the number of nested levels of the tree rooted
. * by this node.
. */
. size_type getDepth() const {
. if (this->isLeaf()) {
. return 1;
-- line 441 ----------------------------------------
-- line 487 ----------------------------------------
. }
. return res;
. }
.
. /**
. * Obtains a pointer to the array of child-pointers
. * of this node -- if it is an inner node.
. */
11,736 ( 0.00%) node** getChildren() {
11,736 ( 0.00%) return asInnerNode().children;
32,274 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::asInnerNode() (2,934x)
5,868 ( 0.00%) }
.
. /**
. * Obtains a pointer to the array of const child-pointers
. * of this node -- if it is an inner node.
. */
11,784 ( 0.00%) node* const* getChildren() const {
11,784 ( 0.00%) return asInnerNode().children;
32,406 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::asInnerNode() const (2,946x)
5,892 ( 0.00%) }
.
. /**
. * Obtains a reference to the child of the given index.
. */
419,634,765 ( 0.36%) node* getChild(size_type s) const {
503,561,718 ( 0.43%) return asInnerNode().children[s];
923,196,483 ( 0.79%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::asInnerNode() const (83,926,953x)
167,853,906 ( 0.14%) }
.
. /**
. * Checks whether this node is empty -- can happen due to biased insertion.
. */
8,610 ( 0.00%) bool isEmpty() const {
11,480 ( 0.00%) return this->numElements == 0;
5,740 ( 0.00%) }
.
. /**
. * Checks whether this node is full.
. */
15,960 ( 0.00%) bool isFull() const {
21,280 ( 0.00%) return this->numElements == maxKeys;
10,640 ( 0.00%) }
.
. /**
. * Obtains the point at which full nodes should be split.
. * Conventional b-trees always split in half. However, in cases
. * where in-order insertions are frequent, a split assigning
. * larger portions to the right fragment provide higher performance
. * and a better node-filling rate.
. */
23,904 ( 0.00%) int getSplitPoint(int /*unused*/) {
23,904 ( 0.00%) return static_cast<int>(std::min(3 * maxKeys / 4, maxKeys - 2));
38,844 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_algobase.h:unsigned long const& std::min<unsigned long>(unsigned long const&, unsigned long const&) (2,988x)
14,940 ( 0.00%) }
.
. /**
. * Splits this node.
. *
. * @param root .. a pointer to the root-pointer of the enclosing b-tree
. * (might have to be updated if the root-node needs to be split)
. * @param idx .. the position of the insert causing the split
. */
. #ifdef IS_PARALLEL
38,844 ( 0.00%) void split(node** root, lock_type& root_lock, int idx, std::vector<node*>& locked_nodes) {
17,928 ( 0.00%) assert(this->lock.is_write_locked());
107,670 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (2,910x)
30,306 ( 0.00%) assert(!this->parent || this->parent->lock.is_write_locked());
97,014 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (2,622x)
13,782 ( 0.00%) assert((this->parent != nullptr) || root_lock.is_write_locked());
10,656 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (288x)
15,642 ( 0.00%) assert(this->isLeaf() || souffle::contains(locked_nodes, this));
23,280 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isLeaf() const (2,910x)
38,172 ( 0.00%) assert(!this->parent || souffle::contains(locked_nodes, const_cast<node*>(this->parent)));
915,234 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ContainerUtil.h:bool souffle::contains<std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > >(std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > const&, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::value_type const&) (2,622x)
. #else
. void split(node** root, lock_type& root_lock, int idx) {
. #endif
11,952 ( 0.00%) assert(this->numElements == maxKeys);
.
. // get middle element
17,928 ( 0.00%) int split_point = getSplitPoint(idx);
98,940 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getSplitPoint(int) (2,910x)
.
. // create a new sibling node
15,486 ( 0.00%) node* sibling = (this->inner) ? static_cast<node*>(new inner_node())
8,970 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::inner_node::inner_node() (78x)
4,973 ( 0.00%) => ???:operator new(unsigned long) (78x)
17,460 ( 0.00%) : static_cast<node*>(new leaf_node());
420,429 ( 0.00%) => ???:operator new(unsigned long) (2,910x)
334,650 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::leaf_node::leaf_node() (2,910x)
.
. #ifdef IS_PARALLEL
. // lock sibling
11,952 ( 0.00%) sibling->lock.start_write();
98,940 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_write() (2,910x)
14,940 ( 0.00%) locked_nodes.push_back(sibling);
3,053,151 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::push_back(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (2,910x)
. #endif
.
. // move data over to the new node
62,748 ( 0.00%) for (unsigned i = split_point + 1, j = 0; i < maxKeys; ++i, ++j) {
125,496 ( 0.00%) sibling->keys[j] = keys[i];
130,950 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (8,730x)
. }
.
. // move child pointers
11,952 ( 0.00%) if (this->inner) {
. // move pointers to sibling
156 ( 0.00%) auto* other = static_cast<inner_node*>(sibling);
2,028 ( 0.00%) for (unsigned i = split_point + 1, j = 0; i <= maxKeys; ++i, ++j) {
3,744 ( 0.00%) other->children[j] = getChildren()[i];
6,552 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChildren() (312x)
1,872 ( 0.00%) other->children[j]->parent = other;
1,872 ( 0.00%) other->children[j]->position = static_cast<field_index_type>(j);
. }
. }
.
. // update number of elements
11,952 ( 0.00%) this->numElements = split_point;
17,928 ( 0.00%) sibling->numElements = maxKeys - split_point - 1;
.
. // update parent
. #ifdef IS_PARALLEL
23,904 ( 0.00%) grow_parent(root, root_lock, sibling, locked_nodes);
3,178,053 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::grow_parent(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&) (2,910x)
. #else
. grow_parent(root, root_lock, sibling);
. #endif
26,892 ( 0.00%) }
.
. /**
. * Moves keys from this node to one of its siblings or splits
. * this node to make some space for the insertion of an element at
. * position idx.
. *
. * Returns the number of elements moved to the left side, 0 in case
. * of a split. The number of moved elements will be <= the given idx.
. *
. * @param root .. the root node of the b-tree being part of
. * @param idx .. the position of the insert triggering this operation
. */
. // TODO: remove root_lock ... no longer needed
. #ifdef IS_PARALLEL
62,546 ( 0.00%) int rebalance_or_split(node** root, lock_type& root_lock, int idx, std::vector<node*>& locked_nodes) {
34,116 ( 0.00%) assert(this->lock.is_write_locked());
207,496 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (5,608x)
59,984 ( 0.00%) assert(!this->parent || this->parent->lock.is_write_locked());
196,840 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (5,320x)
24,574 ( 0.00%) assert((this->parent != nullptr) || root_lock.is_write_locked());
10,656 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (288x)
29,132 ( 0.00%) assert(this->isLeaf() || souffle::contains(locked_nodes, this));
44,864 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isLeaf() const (5,608x)
75,944 ( 0.00%) assert(!this->parent || souffle::contains(locked_nodes, const_cast<node*>(this->parent)));
1,857,000 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ContainerUtil.h:bool souffle::contains<std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > >(std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > const&, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::value_type const&) (5,320x)
. #else
. int rebalance_or_split(node** root, lock_type& root_lock, int idx) {
. #endif
.
. // this node is full ... and needs some space
22,744 ( 0.00%) assert(this->numElements == maxKeys);
.
. // get snap-shot of parent
17,058 ( 0.00%) auto parent = this->parent;
17,058 ( 0.00%) auto pos = this->position;
.
. // Option A) re-balance data
22,012 ( 0.00%) if (parent && pos > 0) {
42,560 ( 0.00%) node* left = parent->getChild(pos - 1);
127,680 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (5,320x)
.
. #ifdef IS_PARALLEL
. // lock access to left sibling
37,240 ( 0.00%) if (!left->lock.try_start_write()) {
133,000 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::try_start_write() (5,320x)
. // left node is currently updated => skip balancing and split
. split(root, root_lock, idx, locked_nodes);
. return 0;
. }
. #endif
.
. // compute number of elements to be movable to left
. // space available in left vs. insertion index
15,960 ( 0.00%) size_type num = static_cast<size_type>(
58,520 ( 0.00%) std::min<int>(static_cast<int>(maxKeys - left->numElements), idx));
69,160 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_algobase.h:int const& std::min<int>(int const&, int const&) (5,320x)
.
. // if there are elements to move ..
10,640 ( 0.00%) if (num > 0) {
29,678 ( 0.00%) Key* splitter = &(parent->keys[this->position - 1]);
.
. // .. move keys to left node
29,678 ( 0.00%) left->keys[left->numElements] = *splitter;
40,470 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (2,698x)
62,054 ( 0.00%) for (size_type i = 0; i < num - 1; ++i) {
153,786 ( 0.00%) left->keys[left->numElements + 1 + i] = keys[i];
121,410 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (8,094x)
. }
29,678 ( 0.00%) *splitter = keys[num - 1];
40,470 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (2,698x)
.
. // shift keys in this node to the left
264,404 ( 0.00%) for (size_type i = 0; i < this->numElements - num; ++i) {
458,660 ( 0.00%) keys[i] = keys[i + num];
404,700 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (26,980x)
. }
.
. // .. and children if necessary
13,490 ( 0.00%) if (this->isInner()) {
18,886 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isInner() const (2,698x)
. auto* ileft = static_cast<inner_node*>(left);
. auto* iright = static_cast<inner_node*>(this);
.
. // move children
. for (field_index_type i = 0; i < num; ++i) {
. ileft->children[left->numElements + i + 1] = iright->children[i];
. }
.
-- line 672 ----------------------------------------
-- line 684 ----------------------------------------
.
. // update position of children
. for (size_type i = 0; i < this->numElements - num + 1; ++i) {
. iright->children[i]->position = static_cast<field_index_type>(i);
. }
. }
.
. // update node sizes
16,188 ( 0.00%) left->numElements += num;
16,188 ( 0.00%) this->numElements -= num;
.
. #ifdef IS_PARALLEL
10,792 ( 0.00%) left->lock.end_write();
35,074 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (2,698x)
. #endif
.
. // done
5,396 ( 0.00%) return static_cast<int>(num);
. }
.
. #ifdef IS_PARALLEL
10,488 ( 0.00%) left->lock.abort_write();
36,708 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::abort_write() (2,622x)
. #endif
. }
.
. // Option B) split node
. #ifdef IS_PARALLEL
23,904 ( 0.00%) split(root, root_lock, idx, locked_nodes);
8,980,581 ( 0.01%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::split(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, int, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&) (2,910x)
. #else
. split(root, root_lock, idx);
. #endif
2,988 ( 0.00%) return 0; // = no re-balancing
28,430 ( 0.00%) }
.
. private:
. /**
. * Inserts a new sibling into the parent of this node utilizing
. * the last key of this node as a separation key. (for internal
. * use only)
. *
. * @param root .. a pointer to the root-pointer of the containing tree
. * @param sibling .. the new right-sibling to be add to the parent node
. */
. #ifdef IS_PARALLEL
35,856 ( 0.00%) void grow_parent(node** root, lock_type& root_lock, node* sibling, std::vector<node*>& locked_nodes) {
17,928 ( 0.00%) assert(this->lock.is_write_locked());
107,670 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (2,910x)
30,306 ( 0.00%) assert(!this->parent || this->parent->lock.is_write_locked());
97,014 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (2,622x)
13,782 ( 0.00%) assert((this->parent != nullptr) || root_lock.is_write_locked());
10,656 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (288x)
15,642 ( 0.00%) assert(this->isLeaf() || souffle::contains(locked_nodes, this));
23,280 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isLeaf() const (2,910x)
38,172 ( 0.00%) assert(!this->parent || souffle::contains(locked_nodes, const_cast<node*>(this->parent)));
919,854 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ContainerUtil.h:bool souffle::contains<std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > >(std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > const&, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::value_type const&) (2,622x)
. #else
. void grow_parent(node** root, lock_type& root_lock, node* sibling) {
. #endif
.
17,928 ( 0.00%) if (this->parent == nullptr) {
1,464 ( 0.00%) assert(*root == this);
.
. // create a new root node
2,562 ( 0.00%) auto* new_root = new inner_node();
33,120 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::inner_node::inner_node() (288x)
16,453 ( 0.00%) => ???:operator new(unsigned long) (288x)
732 ( 0.00%) new_root->numElements = 1;
4,392 ( 0.00%) new_root->keys[0] = keys[this->numElements];
4,320 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (288x)
.
1,098 ( 0.00%) new_root->children[0] = this;
1,098 ( 0.00%) new_root->children[1] = sibling;
.
. // link this and the sibling node to new root
1,098 ( 0.00%) this->parent = new_root;
1,098 ( 0.00%) sibling->parent = new_root;
732 ( 0.00%) sibling->position = 1;
.
. // switch root node
1,098 ( 0.00%) *root = new_root;
.
. } else {
. // insert new element in parent element
7,866 ( 0.00%) auto parent = this->parent;
7,866 ( 0.00%) auto pos = this->position;
.
. #ifdef IS_PARALLEL
31,464 ( 0.00%) parent->insert_inner(
1,702,058 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::insert_inner(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, unsigned int, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&) (2,622x)
18,354 ( 0.00%) root, root_lock, pos, this, keys[this->numElements], sibling, locked_nodes);
. #else
. parent->insert_inner(root, root_lock, pos, this, keys[this->numElements], sibling);
. #endif
. }
21,282 ( 0.00%) }
.
. /**
. * Inserts a new element into an inner node (for internal use only).
. *
. * @param root .. a pointer to the root-pointer of the containing tree
. * @param pos .. the position to insert the new key
. * @param key .. the key to insert
. * @param newNode .. the new right-child of the inserted key
. */
. #ifdef IS_PARALLEL
45,900 ( 0.00%) void insert_inner(node** root, lock_type& root_lock, unsigned pos, node* predecessor, const Key& key,
. node* newNode, std::vector<node*>& locked_nodes) {
16,200 ( 0.00%) assert(this->lock.is_write_locked());
97,014 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (2,622x)
24,300 ( 0.00%) assert(souffle::contains(locked_nodes, this));
919,854 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ContainerUtil.h:bool souffle::contains<std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > >(std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > const&, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::value_type const&) (2,622x)
. #else
. void insert_inner(node** root, lock_type& root_lock, unsigned pos, node* predecessor, const Key& key,
. node* newNode) {
. #endif
.
. // check capacity
16,200 ( 0.00%) if (this->numElements >= maxKeys) {
. #ifdef IS_PARALLEL
312 ( 0.00%) assert(!this->parent || this->parent->lock.is_write_locked());
702 ( 0.00%) assert((this->parent) || root_lock.is_write_locked());
2,886 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (78x)
312 ( 0.00%) assert(!this->parent || souffle::contains(locked_nodes, const_cast<node*>(this->parent)));
. #endif
.
. // split this node
. #ifdef IS_PARALLEL
702 ( 0.00%) pos -= rebalance_or_split(root, root_lock, pos, locked_nodes);
184,934 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::rebalance_or_split(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, int, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&)'2 (78x)
. #else
. pos -= rebalance_or_split(root, root_lock, pos);
. #endif
.
. // complete insertion within new sibling if necessary
546 ( 0.00%) if (pos > this->numElements) {
. // correct position
546 ( 0.00%) pos = pos - static_cast<unsigned int>(this->numElements) - 1;
.
. // get new sibling
858 ( 0.00%) auto other = this->parent->getChild(this->position + 1);
1,872 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (78x)
.
. #ifdef IS_PARALLEL
. // make sure other side is write locked
468 ( 0.00%) assert(other->lock.is_write_locked());
2,886 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::is_write_locked() const (78x)
546 ( 0.00%) assert(souffle::contains(locked_nodes, other));
34,164 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ContainerUtil.h:bool souffle::contains<std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > >(std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > const&, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::value_type const&) (78x)
.
. // search for new position (since other may have been altered in the meanwhile)
78 ( 0.00%) size_type i = 0;
2,340 ( 0.00%) for (; i <= other->numElements; ++i) {
2,808 ( 0.00%) if (other->getChild(i) == predecessor) {
7,488 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (312x)
78 ( 0.00%) break;
. }
. }
.
546 ( 0.00%) pos = (i > other->numElements) ? 0 : i;
1,092 ( 0.00%) other->insert_inner(root, root_lock, pos, predecessor, key, newNode, locked_nodes);
48,906 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::insert_inner(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, unsigned int, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&)'2 (78x)
. #else
. other->insert_inner(root, root_lock, pos, predecessor, key, newNode);
. #endif
. return;
. }
. }
.
. // move bigger keys one forward
18,354 ( 0.00%) for (int i = static_cast<int>(this->numElements) - 1; i >= (int)pos; --i) {
. keys[i + 1] = keys[i];
. getChildren()[i + 2] = getChildren()[i + 1];
. ++getChildren()[i + 2]->position;
. }
.
. // ensure proper position
18,354 ( 0.00%) assert(getChild(pos) == predecessor);
61,056 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (2,544x)
.
. // insert new element
26,220 ( 0.00%) keys[pos] = key;
38,160 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (2,544x)
28,842 ( 0.00%) getChildren()[pos + 1] = newNode;
53,424 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChildren() (2,544x)
7,866 ( 0.00%) newNode->parent = this;
13,110 ( 0.00%) newNode->position = static_cast<field_index_type>(pos) + 1;
13,110 ( 0.00%) ++this->numElements;
16,200 ( 0.00%) }
.
. public:
. /**
. * Prints a textual representation of this tree to the given output stream.
. * This feature is mainly intended for debugging and tuning purposes.
. *
. * @see btree::printTree
. */
-- line 857 ----------------------------------------
-- line 1062 ----------------------------------------
. * the generic implementation of a node by the storage locations
. * of child pointers.
. */
. struct inner_node : public node {
. // references to child nodes owned by this node
. node* children[node::maxKeys + 1];
.
. // a simple default constructor initializing member fields
4,884 ( 0.00%) inner_node() : node(true) {}
46,176 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::node(bool) (444x)
.
. // clear up child nodes recursively
2,220 ( 0.00%) ~inner_node() {
33,738 ( 0.00%) for (unsigned i = 0; i <= this->numElements; ++i) {
20,124 ( 0.00%) if (children[i] != nullptr) {
26,832 ( 0.00%) if (children[i]->isLeaf()) {
15,528 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isLeaf() const (1,941x)
35,178 ( 0.00%) delete static_cast<leaf_node*>(children[i]);
191,457 ( 0.00%) => ???:operator delete(void*, unsigned long) (1,785x)
. } else {
1,872 ( 0.00%) delete static_cast<inner_node*>(children[i]);
240,939 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::inner_node::~inner_node()'2 (156x)
14,114 ( 0.00%) => ???:operator delete(void*, unsigned long) (156x)
. }
. }
. }
1,776 ( 0.00%) }
. };
.
. /**
. * The data type representing leaf nodes of the b-tree. It does not
. * add any capabilities to the generic node type.
. */
. struct leaf_node : public node {
. // a simple default constructor initializing member fields
45,254 ( 0.00%) leaf_node() : node(false) {}
93,808 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::node::node(bool) (902x)
. };
.
. // ------------------- iterators ------------------------
.
. public:
. /**
. * The iterator type to be utilized for scanning through btree instances.
. */
-- line 1100 ----------------------------------------
-- line 1108 ----------------------------------------
. public:
. using iterator_category = std::forward_iterator_tag;
. using value_type = Key;
. using difference_type = ptrdiff_t;
. using pointer = value_type*;
. using reference = value_type&;
.
. // default constructor -- creating an end-iterator
184,591,220 ( 0.16%) iterator() : cur(nullptr) {}
.
. // creates an iterator referencing a specific element within a given node
275,496,150 ( 0.23%) iterator(node const* cur, field_index_type pos) : cur(cur), pos(pos) {}
.
. // a copy constructor
36,120 ( 0.00%) iterator(const iterator& other) : cur(other.cur), pos(other.pos) {}
.
. // an assignment operator
. iterator& operator=(const iterator& other) {
. cur = other.cur;
. pos = other.pos;
. return *this;
. }
.
. // the equality operator as required by the iterator concept
73,842,480 ( 0.06%) bool operator==(const iterator& other) const {
129,569,916 ( 0.11%) return cur == other.cur && pos == other.pos;
36,921,240 ( 0.03%) }
.
. // the not-equality operator as required by the iterator concept
92,297,080 ( 0.08%) bool operator!=(const iterator& other) const {
110,756,496 ( 0.09%) return !(*this == other);
75,592 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::operator==(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator const&) const (4,516x)
36,918,832 ( 0.03%) }
.
. // the deref operator as required by the iterator concept
145,368 ( 0.00%) const Key& operator*() const {
436,104 ( 0.00%) return cur->keys[pos];
96,912 ( 0.00%) }
.
. // the increment operator as required by the iterator concept
242,280 ( 0.00%) iterator& operator++() {
. // the quick mode -- if in a leaf and there are elements left
1,113,718 ( 0.00%) if (cur->isLeaf() && ++pos < cur->getNumElements()) {
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::getNumElements() const (2,706x)
21,648 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::isLeaf() const (2,706x)
78,820 ( 0.00%) return *this;
. }
.
. // otherwise it is a bit more tricky
.
. // A) currently in an inner node => go to the left-most child
54,276 ( 0.00%) if (cur->isInner()) {
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::isInner() const (2,706x)
43,050 ( 0.00%) cur = cur->getChildren()[pos + 1];
60,270 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChildren() const (2,870x)
20,698 ( 0.00%) while (!cur->isLeaf()) {
23,568 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::base::isLeaf() const (2,946x)
532 ( 0.00%) cur = cur->getChildren()[0];
1,596 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChildren() const (76x)
. }
5,740 ( 0.00%) pos = 0;
.
. // nodes may be empty due to biased insertion
20,090 ( 0.00%) if (!cur->isEmpty()) {
25,830 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::isEmpty() const (2,870x)
5,740 ( 0.00%) return *this;
. }
. }
.
. // B) we are at the right-most element of a leaf => go to next inner node
37,056 ( 0.00%) assert(cur->isLeaf());
21,648 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::isLeaf() const (2,706x)
55,584 ( 0.00%) assert(pos == cur->getNumElements());
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::getNumElements() const (2,706x)
.
188,114 ( 0.00%) while (cur != nullptr && pos == cur->getNumElements()) {
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::getNumElements() const (2,706x)
39,684 ( 0.00%) pos = cur->getPositionInParent();
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::getPositionInParent() const (2,706x)
39,684 ( 0.00%) cur = cur->getParent();
18,942 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::getParent() const (2,706x)
. }
6,176 ( 0.00%) return *this;
145,368 ( 0.00%) }
.
. // prints a textual representation of this iterator to the given stream (mainly for debugging)
. void print(std::ostream& out = std::cout) const {
. out << cur << "[" << (int)pos << "]";
. }
. };
.
. /**
-- line 1186 ----------------------------------------
-- line 1199 ----------------------------------------
.
. // the node where the last lower-bound operation terminated
. node_cache last_lower_bound_end;
.
. // the node where the last upper-bound operation terminated
. node_cache last_upper_bound_end;
.
. // default constructor
1,217,950,954 ( 1.04%) btree_operation_hints() = default;
2,928,064 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::node*, 1u>::LRUCache() (366,008x)
.
. // resets all hints (to be triggered e.g. when deleting nodes)
. void clear() {
. last_insert.clear(nullptr);
. last_find_end.clear(nullptr);
. last_lower_bound_end.clear(nullptr);
. last_upper_bound_end.clear(nullptr);
. }
-- line 1215 ----------------------------------------
-- line 1257 ----------------------------------------
.
. public:
. // the maximum number of keys stored per node
. static constexpr std::size_t max_keys_per_node = node::maxKeys;
.
. // -- ctors / dtors --
.
. // the default constructor creating an empty tree
24 ( 0.00%) btree(Comparator comp = Comparator(), WeakComparator weak_comp = WeakComparator())
102 ( 0.00%) : comp(std::move(comp)), weak_comp(std::move(weak_comp)), root(nullptr), leftmost(nullptr) {}
102 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::OptimisticReadWriteLock() (3x)
36 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<souffle::EqrelMapComparator<std::pair<int, unsigned long> >&>::type&& std::move<souffle::EqrelMapComparator<std::pair<int, unsigned long> >&>(souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) (6x)
.
. // a constructor creating a tree from the given iterator range
. template <typename Iter>
. btree(const Iter& a, const Iter& b) : root(nullptr), leftmost(nullptr) {
. insert(a, b);
. }
.
. // a move constructor
-- line 1274 ----------------------------------------
-- line 1288 ----------------------------------------
. /**
. * An internal constructor enabling the specific creation of a tree
. * based on internal parameters.
. */
. btree(size_type /* size */, node* root, leaf_node* leftmost) : root(root), leftmost(leftmost) {}
.
. public:
. // the destructor freeing all contained nodes
24 ( 0.00%) ~btree() {
18 ( 0.00%) clear();
57 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::clear() (3x)
18 ( 0.00%) }
.
. // -- mutators and observers --
.
. // emptiness check
55,225,650 ( 0.05%) bool empty() const {
73,634,200 ( 0.06%) return root == nullptr;
36,817,100 ( 0.03%) }
.
. // determines the number of elements in this tree
. size_type size() const {
. return (root) ? root->countEntries() : 0;
. }
.
. /**
. * Inserts the given key into this tree.
-- line 1313 ----------------------------------------
-- line 1703 ----------------------------------------
. // a naive insert so far .. seems to work fine
. for (auto it = a; it != b; ++it) {
. // use insert with hint
. insert(*it, hints);
. }
. }
.
. // Obtains an iterator referencing the first element of the tree.
18,070 ( 0.00%) iterator begin() const {
25,298 ( 0.00%) return iterator(leftmost, 0);
45,210 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::iterator(souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::node const*, unsigned char) (3,014x)
10,842 ( 0.00%) }
.
. // Obtains an iterator referencing the position after the last element of the tree.
92,289,590 ( 0.08%) iterator end() const {
55,373,754 ( 0.05%) return iterator();
30,140 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::iterator::iterator() (3,014x)
55,373,754 ( 0.05%) }
.
. /**
. * Partitions the full range of this set into up to a given number of chunks.
. * The chunks will cover approximately the same number of elements. Also, the
. * number of chunks will only approximate the desired number of chunks.
. *
. * @param num .. the number of chunks requested
. * @return a list of chunks partitioning this tree
-- line 1726 ----------------------------------------
-- line 1735 ----------------------------------------
. return res;
. }
. return root->collectChunks(res, num, begin(), end());
. }
.
. /**
. * Determines whether the given element is a member of this tree.
. */
147,268,400 ( 0.13%) bool contains(const Key& k) const {
55,225,650 ( 0.05%) operation_hints hints;
994,061,700 ( 0.85%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>::btree_operation_hints() (18,408,550x)
110,451,300 ( 0.09%) return contains(k, hints);
15,065,817,550 (12.85%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::contains(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const (18,408,550x)
92,042,750 ( 0.08%) }
.
. /**
. * Determines whether the given element is a member of this tree.
. */
165,676,950 ( 0.14%) bool contains(const Key& k, operation_hints& hints) const {
294,536,800 ( 0.25%) return find(k, hints) != end();
13,648,038,922 (11.64%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::find(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const (18,408,550x)
478,942,578 ( 0.41%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::operator!=(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator const&) const (18,408,550x)
386,579,550 ( 0.33%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::end() const (18,408,550x)
92,042,750 ( 0.08%) }
.
. /**
. * Locates the given key within this tree and returns an iterator
. * referencing its position. If not found, an end-iterator will be returned.
. */
. iterator find(const Key& k) const {
. operation_hints hints;
. return find(k, hints);
. }
.
. /**
. * Locates the given key within this tree and returns an iterator
. * referencing its position. If not found, an end-iterator will be returned.
. */
184,085,500 ( 0.16%) iterator find(const Key& k, operation_hints& hints) const {
92,042,750 ( 0.08%) if (empty()) {
165,676,950 ( 0.14%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::empty() const (18,408,550x)
1,812 ( 0.00%) return end();
6,342 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::end() const (302x)
. }
.
55,224,744 ( 0.05%) node* cur = root;
.
239,307,224 ( 0.20%) auto checkHints = [&](node* last_find_end) {
73,632,992 ( 0.06%) if (!last_find_end) return false;
. if (!covers(last_find_end, k)) return false;
. cur = last_find_end;
. return true;
. };
.
. // test last location searched (temporal locality)
147,265,984 ( 0.13%) if (hints.last_find_end.any(checkHints)) {
662,696,928 ( 0.57%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::any<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::find(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::find(std::pair<int, unsigned long> const&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&) const::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const (18,408,248x)
. // register it as a hit
. hint_stats.contains.addHit();
. } else {
. // register it as a miss
73,632,992 ( 0.06%) hint_stats.contains.addMiss();
110,449,488 ( 0.09%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::CacheAccessCounter::addMiss() (18,408,248x)
. }
.
. // an iterative implementation (since 2/7 faster than recursive)
.
27,951,741 ( 0.02%) while (true) {
139,079,967 ( 0.12%) auto a = &(cur->keys[0]);
324,519,923 ( 0.28%) auto b = &(cur->keys[cur->numElements]);
.
463,599,890 ( 0.40%) auto pos = search(k, a, b, comp);
6,489,211,044 ( 5.53%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::operator()<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const (46,359,989x)
.
622,740,106 ( 0.53%) if (pos < b && equal(*pos, k)) {
2,061,272,976 ( 1.76%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const (40,777,172x)
110,176,776 ( 0.09%) hints.last_find_end.access(cur);
201,990,756 ( 0.17%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::access(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (18,362,796x)
183,627,960 ( 0.16%) return iterator(cur, static_cast<field_index_type>(pos - a));
275,441,940 ( 0.23%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::iterator::iterator(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node const*, unsigned char) (18,362,796x)
. }
.
139,985,965 ( 0.12%) if (!cur->inner) {
272,712 ( 0.00%) hints.last_find_end.access(cur);
499,972 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::access(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (45,452x)
272,712 ( 0.00%) return end();
954,492 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::end() const (45,452x)
. }
.
. // continue search in child node
223,613,928 ( 0.19%) cur = cur->getChild(pos - a);
670,841,784 ( 0.57%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (27,951,741x)
. }
110,451,300 ( 0.09%) }
.
. /**
. * Obtains a lower boundary for the given key -- hence an iterator referencing
. * the smallest value that is not less the given key. If there is no such element,
. * an end-iterator will be returned.
. */
. iterator lower_bound(const Key& k) const {
. operation_hints hints;
-- line 1820 ----------------------------------------
-- line 1927 ----------------------------------------
.
. cur = cur->getChild(idx);
. }
. }
.
. /**
. * Clears this tree.
. */
7,580 ( 0.00%) void clear() {
9,096 ( 0.00%) if (root != nullptr) {
7,224 ( 0.00%) if (root->isLeaf()) {
7,216 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::base::isLeaf() const (902x)
8,244 ( 0.00%) delete static_cast<leaf_node*>(root);
92,430 ( 0.00%) => ???:operator delete(void*, unsigned long) (902x)
. } else {
2,880 ( 0.00%) delete static_cast<inner_node*>(root);
533,084 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::inner_node::~inner_node() (288x)
25,997 ( 0.00%) => ???:operator delete(void*, unsigned long) (288x)
. }
. }
3,032 ( 0.00%) root = nullptr;
3,032 ( 0.00%) leftmost = nullptr;
6,064 ( 0.00%) }
.
. /**
. * Swaps the content of this tree with the given tree. This
. * is a much more efficient operation than creating a copy and
. * realizing the swap utilizing assignment operations.
. */
. void swap(btree& other) {
. // swap the content
-- line 1953 ----------------------------------------
-- line 2209 ----------------------------------------
. return res;
. }
. }; // namespace souffle
.
. // Instantiation of static member search.
. template <typename Key, typename Comparator, typename Allocator, unsigned blockSize, typename SearchStrategy,
. bool isSet, typename WeakComparator, typename Updater>
. const SearchStrategy
12 ( 0.00%) btree<Key, Comparator, Allocator, blockSize, SearchStrategy, isSet, WeakComparator, Updater>::search;
.
. } // end namespace detail
.
. /**
. * A b-tree based set implementation.
. *
. * @tparam Key .. the element type to be stored in this set
. * @tparam Comparator .. a class defining an order on the stored elements
-- line 2225 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h
--------------------------------------------------------------------------------
Ir
-- line 203 ----------------------------------------
. * @brief Struct holding two objects of arbitrary type.
. *
. * @tparam _T1 Type of first object.
. * @tparam _T2 Type of second object.
. *
. * <https://gcc.gnu.org/onlinedocs/libstdc++/manual/utilities.html>
. */
. template<typename _T1, typename _T2>
610 ( 0.00%) struct pair
1,325 ( 0.00%) => ???:0x0000000000409d50 (18x)
. : private __pair_base<_T1, _T2>
. {
. typedef _T1 first_type; ///< The type of the `first` member
. typedef _T2 second_type; ///< The type of the `second` member
.
. _T1 first; ///< The first member
. _T2 second; ///< The second member
.
-- line 219 ----------------------------------------
-- line 306 ----------------------------------------
. && !_PCCFP<_U1, _U2>::template
. _ImplicitlyConvertiblePair<_U1, _U2>(),
. bool>::type=false>
. explicit constexpr pair(const pair<_U1, _U2>& __p)
. : first(__p.first), second(__p.second) { }
. #endif
.
. #if __cplusplus >= 201103L
168 ( 0.00%) constexpr pair(const pair&) = default; ///< Copy constructor
896 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (14x)
. constexpr pair(pair&&) = default; ///< Move constructor
.
. // DR 811.
. template<typename _U1, typename
. enable_if<_PCCP::template
. _MoveCopyPair<true, _U1, _T2>(),
. bool>::type=true>
. constexpr pair(_U1&& __x, const _T2& __y)
-- line 322 ----------------------------------------
-- line 328 ----------------------------------------
. bool>::type=false>
. explicit constexpr pair(_U1&& __x, const _T2& __y)
. : first(std::forward<_U1>(__x)), second(__y) { }
.
. template<typename _U2, typename
. enable_if<_PCCP::template
. _CopyMovePair<true, _T1, _U2>(),
. bool>::type=true>
331,619,556 ( 0.28%) constexpr pair(const _T1& __x, _U2&& __y)
773,778,940 ( 0.66%) : first(__x), second(std::forward<_U2>(__y)) { }
331,619,412 ( 0.28%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:int&& std::forward<int>(std::remove_reference<int>::type&) (55,269,902x)
.
. template<typename _U2, typename
. enable_if<_PCCP::template
. _CopyMovePair<false, _T1, _U2>(),
. bool>::type=false>
. explicit pair(const _T1& __x, _U2&& __y)
. : first(__x), second(std::forward<_U2>(__y)) { }
.
. template<typename _U1, typename _U2, typename
. enable_if<_PCCP::template
. _MoveConstructiblePair<_U1, _U2>()
. && _PCCP::template
. _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
. bool>::type=true>
552,790 ( 0.00%) constexpr pair(_U1&& __x, _U2&& __y)
1,290,606 ( 0.00%) : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
1,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::_Rb_tree_node_base*& std::forward<std::_Rb_tree_node_base*&>(std::remove_reference<std::_Rb_tree_node_base*&>::type&) (300x)
1,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::_Rb_tree_node<int>*& std::forward<std::_Rb_tree_node<int>*&>(std::remove_reference<std::_Rb_tree_node<int>*&>::type&) (300x)
.
. template<typename _U1, typename _U2, typename
. enable_if<_PCCP::template
. _MoveConstructiblePair<_U1, _U2>()
. && !_PCCP::template
. _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
. bool>::type=false>
. explicit constexpr pair(_U1&& __x, _U2&& __y)
-- line 361 ----------------------------------------
-- line 363 ----------------------------------------
.
.
. template<typename _U1, typename _U2, typename
. enable_if<_PCCFP<_U1, _U2>::template
. _MoveConstructiblePair<_U1, _U2>()
. && _PCCFP<_U1, _U2>::template
. _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
. bool>::type=true>
1,800 ( 0.00%) constexpr pair(pair<_U1, _U2>&& __p)
900 ( 0.00%) : first(std::forward<_U1>(__p.first)),
1,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::_Rb_tree_iterator<int>&& std::forward<std::_Rb_tree_iterator<int> >(std::remove_reference<std::_Rb_tree_iterator<int> >::type&) (300x)
4,500 ( 0.00%) second(std::forward<_U2>(__p.second)) { }
3,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_tree.h:std::_Rb_tree_const_iterator<int>::_Rb_tree_const_iterator(std::_Rb_tree_iterator<int> const&) (300x)
1,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:bool&& std::forward<bool>(std::remove_reference<bool>::type&) (300x)
.
. template<typename _U1, typename _U2, typename
. enable_if<_PCCFP<_U1, _U2>::template
. _MoveConstructiblePair<_U1, _U2>()
. && !_PCCFP<_U1, _U2>::template
. _ImplicitlyMoveConvertiblePair<_U1, _U2>(),
. bool>::type=false>
. explicit constexpr pair(pair<_U1, _U2>&& __p)
-- line 381 ----------------------------------------
-- line 382 ----------------------------------------
. : first(std::forward<_U1>(__p.first)),
. second(std::forward<_U2>(__p.second)) { }
.
. template<typename... _Args1, typename... _Args2>
. _GLIBCXX20_CONSTEXPR
. pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);
.
. _GLIBCXX20_CONSTEXPR pair&
757,496 ( 0.00%) operator=(typename conditional<
. __and_<is_copy_assignable<_T1>,
. is_copy_assignable<_T2>>::value,
. const pair&, const __nonesuch&>::type __p)
. {
757,496 ( 0.00%) first = __p.first;
757,496 ( 0.00%) second = __p.second;
189,374 ( 0.00%) return *this;
378,748 ( 0.00%) }
.
. _GLIBCXX20_CONSTEXPR pair&
. operator=(typename conditional<
. __and_<is_move_assignable<_T1>,
. is_move_assignable<_T2>>::value,
. pair&&, __nonesuch&&>::type __p)
. noexcept(__and_<is_nothrow_move_assignable<_T1>,
. is_nothrow_move_assignable<_T2>>::value)
-- line 406 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/UnionFind.h
--------------------------------------------------------------------------------
-- Auto-annotated source: /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h
--------------------------------------------------------------------------------
Ir
-- line 87 ----------------------------------------
. __memory_order_mask = 0x0ffff,
. __memory_order_modifier_mask = 0xffff0000,
. __memory_order_hle_acquire = 0x10000,
. __memory_order_hle_release = 0x20000
. };
.
. constexpr memory_order
. operator|(memory_order __m, __memory_order_modifier __mod)
146,732,340 ( 0.13%) {
110,049,255 ( 0.09%) return memory_order(int(__m) | int(__mod));
73,366,170 ( 0.06%) }
.
. constexpr memory_order
. operator&(memory_order __m, __memory_order_modifier __mod)
2,611,862,788 ( 2.23%) {
1,958,897,091 ( 1.67%) return memory_order(int(__m) & int(__mod));
1,305,931,394 ( 1.11%) }
.
. // Drop release ordering as per [atomics.types.operations.req]/21
. constexpr memory_order
. __cmpexch_failure_order2(memory_order __m) noexcept
110,049,255 ( 0.09%) {
73,366,170 ( 0.06%) return __m == memory_order_acq_rel ? memory_order_acquire
146,732,340 ( 0.13%) : __m == memory_order_release ? memory_order_relaxed : __m;
73,366,170 ( 0.06%) }
.
. constexpr memory_order
. __cmpexch_failure_order(memory_order __m) noexcept
183,415,425 ( 0.16%) {
. return memory_order(__cmpexch_failure_order2(__m & __memory_order_mask)
513,563,190 ( 0.44%) | __memory_order_modifier(__m & __memory_order_modifier_mask));
660,295,530 ( 0.56%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (73,366,170x)
403,513,935 ( 0.34%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__cmpexch_failure_order2(std::memory_order) (36,683,085x)
330,147,765 ( 0.28%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator|(std::memory_order, std::__memory_order_modifier) (36,683,085x)
110,049,255 ( 0.09%) }
.
. _GLIBCXX_ALWAYS_INLINE void
. atomic_thread_fence(memory_order __m) noexcept
333,467,680 ( 0.28%) { __atomic_thread_fence(int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE void
. atomic_signal_fence(memory_order __m) noexcept
. { __atomic_signal_fence(int(__m)); }
.
. /// kill_dependency
. template<typename _Tp>
. inline _Tp
-- line 130 ----------------------------------------
-- line 278 ----------------------------------------
. public:
. __atomic_base() noexcept = default;
. ~__atomic_base() noexcept = default;
. __atomic_base(const __atomic_base&) = delete;
. __atomic_base& operator=(const __atomic_base&) = delete;
. __atomic_base& operator=(const __atomic_base&) volatile = delete;
.
. // Requires __int_type convertible to _M_i.
81,933 ( 0.00%) constexpr __atomic_base(__int_type __i) noexcept : _M_i (__i) { }
.
1,029,511,280 ( 0.88%) operator __int_type() const noexcept
294,146,080 ( 0.25%) { return load(); }
.
. operator __int_type() const volatile noexcept
. { return load(); }
.
. __int_type
9,340 ( 0.00%) operator=(__int_type __i) noexcept
. {
. store(__i);
934 ( 0.00%) return __i;
1,868 ( 0.00%) }
.
. __int_type
. operator=(__int_type __i) volatile noexcept
. {
. store(__i);
. return __i;
. }
.
. __int_type
2,400 ( 0.00%) operator++(int) noexcept
900 ( 0.00%) { return fetch_add(1); }
.
. __int_type
. operator++(int) volatile noexcept
. { return fetch_add(1); }
.
. __int_type
. operator--(int) noexcept
. { return fetch_sub(1); }
.
. __int_type
. operator--(int) volatile noexcept
. { return fetch_sub(1); }
.
. __int_type
137,256 ( 0.00%) operator++() noexcept
274,512 ( 0.00%) { return __atomic_add_fetch(&_M_i, 1, int(memory_order_seq_cst)); }
.
. __int_type
. operator++() volatile noexcept
. { return __atomic_add_fetch(&_M_i, 1, int(memory_order_seq_cst)); }
.
. __int_type
. operator--() noexcept
. { return __atomic_sub_fetch(&_M_i, 1, int(memory_order_seq_cst)); }
.
. __int_type
. operator--() volatile noexcept
. { return __atomic_sub_fetch(&_M_i, 1, int(memory_order_seq_cst)); }
.
. __int_type
35,440 ( 0.00%) operator+=(__int_type __i) noexcept
62,020 ( 0.00%) { return __atomic_add_fetch(&_M_i, __i, int(memory_order_seq_cst)); }
.
. __int_type
. operator+=(__int_type __i) volatile noexcept
. { return __atomic_add_fetch(&_M_i, __i, int(memory_order_seq_cst)); }
.
. __int_type
. operator-=(__int_type __i) noexcept
. { return __atomic_sub_fetch(&_M_i, __i, int(memory_order_seq_cst)); }
-- line 350 ----------------------------------------
-- line 391 ----------------------------------------
. // Use a fake, minimally aligned pointer.
. return __atomic_is_lock_free(sizeof(_M_i),
. reinterpret_cast<void *>(-_S_alignment));
. }
.
. _GLIBCXX_ALWAYS_INLINE void
. store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept
. {
46,182,225 ( 0.04%) memory_order __b = __m & __memory_order_mask;
8,289 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (921x)
. __glibcxx_assert(__b != memory_order_acquire);
. __glibcxx_assert(__b != memory_order_acq_rel);
. __glibcxx_assert(__b != memory_order_consume);
.
27,709,335 ( 0.02%) __atomic_store_n(&_M_i, __i, int(__m));
9,236,445 ( 0.01%) }
.
. _GLIBCXX_ALWAYS_INLINE void
. store(__int_type __i,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. {
. memory_order __b = __m & __memory_order_mask;
. __glibcxx_assert(__b != memory_order_acquire);
. __glibcxx_assert(__b != memory_order_acq_rel);
-- line 413 ----------------------------------------
-- line 414 ----------------------------------------
. __glibcxx_assert(__b != memory_order_consume);
.
. __atomic_store_n(&_M_i, __i, int(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. load(memory_order __m = memory_order_seq_cst) const noexcept
. {
2,482,731,195 ( 2.12%) memory_order __b = __m & __memory_order_mask;
235,620 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (26,180x)
. __glibcxx_assert(__b != memory_order_release);
. __glibcxx_assert(__b != memory_order_acq_rel);
.
1,193,005,103 ( 1.02%) return __atomic_load_n(&_M_i, int(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. load(memory_order __m = memory_order_seq_cst) const volatile noexcept
. {
. memory_order __b = __m & __memory_order_mask;
. __glibcxx_assert(__b != memory_order_release);
. __glibcxx_assert(__b != memory_order_acq_rel);
-- line 434 ----------------------------------------
-- line 450 ----------------------------------------
. {
. return __atomic_exchange_n(&_M_i, __i, int(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_weak(__int_type& __i1, __int_type __i2,
. memory_order __m1, memory_order __m2) noexcept
. {
31,220 ( 0.00%) memory_order __b2 = __m2 & __memory_order_mask;
56,196 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (6,244x)
31,220 ( 0.00%) memory_order __b1 = __m1 & __memory_order_mask;
56,196 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (6,244x)
. __glibcxx_assert(__b2 != memory_order_release);
. __glibcxx_assert(__b2 != memory_order_acq_rel);
. __glibcxx_assert(__b2 <= __b1);
.
56,196 ( 0.00%) return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1,
6,244 ( 0.00%) int(__m1), int(__m2));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_weak(__int_type& __i1, __int_type __i2,
. memory_order __m1,
. memory_order __m2) volatile noexcept
. {
. memory_order __b2 = __m2 & __memory_order_mask;
-- line 473 ----------------------------------------
-- line 479 ----------------------------------------
. return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1,
. int(__m1), int(__m2));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_weak(__int_type& __i1, __int_type __i2,
. memory_order __m = memory_order_seq_cst) noexcept
. {
74,928 ( 0.00%) return compare_exchange_weak(__i1, __i2, __m,
374,640 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__cmpexch_failure_order(std::memory_order) (6,244x)
6,244 ( 0.00%) __cmpexch_failure_order(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_weak(__int_type& __i1, __int_type __i2,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. {
. return compare_exchange_weak(__i1, __i2, __m,
. __cmpexch_failure_order(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_strong(__int_type& __i1, __int_type __i2,
. memory_order __m1, memory_order __m2) noexcept
. {
183,384,205 ( 0.16%) memory_order __b2 = __m2 & __memory_order_mask;
329,674,446 ( 0.28%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (36,630,494x)
183,384,205 ( 0.16%) memory_order __b1 = __m1 & __memory_order_mask;
329,674,446 ( 0.28%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (36,630,494x)
. __glibcxx_assert(__b2 != memory_order_release);
. __glibcxx_assert(__b2 != memory_order_acq_rel);
. __glibcxx_assert(__b2 <= __b1);
.
330,091,569 ( 0.28%) return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0,
36,676,841 ( 0.03%) int(__m1), int(__m2));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_strong(__int_type& __i1, __int_type __i2,
. memory_order __m1,
. memory_order __m2) volatile noexcept
. {
. memory_order __b2 = __m2 & __memory_order_mask;
-- line 518 ----------------------------------------
-- line 525 ----------------------------------------
. return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0,
. int(__m1), int(__m2));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_strong(__int_type& __i1, __int_type __i2,
. memory_order __m = memory_order_seq_cst) noexcept
. {
440,122,092 ( 0.38%) return compare_exchange_strong(__i1, __i2, __m,
2,197,829,640 ( 1.87%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__cmpexch_failure_order(std::memory_order) (36,630,494x)
36,676,841 ( 0.03%) __cmpexch_failure_order(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE bool
. compare_exchange_strong(__int_type& __i1, __int_type __i2,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. {
. return compare_exchange_strong(__i1, __i2, __m,
. __cmpexch_failure_order(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_add(__int_type __i,
. memory_order __m = memory_order_seq_cst) noexcept
733,024 ( 0.00%) { return __atomic_fetch_add(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_add(__int_type __i,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. { return __atomic_fetch_add(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_sub(__int_type __i,
. memory_order __m = memory_order_seq_cst) noexcept
10,816 ( 0.00%) { return __atomic_fetch_sub(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_sub(__int_type __i,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. { return __atomic_fetch_sub(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_and(__int_type __i,
-- line 566 ----------------------------------------
-- line 570 ----------------------------------------
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_and(__int_type __i,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. { return __atomic_fetch_and(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_or(__int_type __i,
. memory_order __m = memory_order_seq_cst) noexcept
700,040 ( 0.00%) { return __atomic_fetch_or(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_or(__int_type __i,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. { return __atomic_fetch_or(&_M_i, __i, int(__m)); }
.
. _GLIBCXX_ALWAYS_INLINE __int_type
. fetch_xor(__int_type __i,
-- line 586 ----------------------------------------
-- line 613 ----------------------------------------
. public:
. __atomic_base() noexcept = default;
. ~__atomic_base() noexcept = default;
. __atomic_base(const __atomic_base&) = delete;
. __atomic_base& operator=(const __atomic_base&) = delete;
. __atomic_base& operator=(const __atomic_base&) volatile = delete;
.
. // Requires __pointer_type convertible to _M_p.
10 ( 0.00%) constexpr __atomic_base(__pointer_type __p) noexcept : _M_p (__p) { }
.
1,919,442 ( 0.00%) operator __pointer_type() const noexcept
548,412 ( 0.00%) { return load(); }
.
. operator __pointer_type() const volatile noexcept
. { return load(); }
.
. __pointer_type
3,020 ( 0.00%) operator=(__pointer_type __p) noexcept
. {
. store(__p);
302 ( 0.00%) return __p;
604 ( 0.00%) }
.
. __pointer_type
. operator=(__pointer_type __p) volatile noexcept
. {
. store(__p);
. return __p;
. }
.
-- line 642 ----------------------------------------
-- line 711 ----------------------------------------
. return __atomic_is_lock_free(sizeof(_M_p),
. reinterpret_cast<void *>(-__alignof(_M_p)));
. }
.
. _GLIBCXX_ALWAYS_INLINE void
. store(__pointer_type __p,
. memory_order __m = memory_order_seq_cst) noexcept
. {
100,620 ( 0.00%) memory_order __b = __m & __memory_order_mask;
2,718 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (302x)
.
. __glibcxx_assert(__b != memory_order_acquire);
. __glibcxx_assert(__b != memory_order_acq_rel);
. __glibcxx_assert(__b != memory_order_consume);
.
60,372 ( 0.00%) __atomic_store_n(&_M_p, __p, int(__m));
20,124 ( 0.00%) }
.
. _GLIBCXX_ALWAYS_INLINE void
. store(__pointer_type __p,
. memory_order __m = memory_order_seq_cst) volatile noexcept
. {
. memory_order __b = __m & __memory_order_mask;
. __glibcxx_assert(__b != memory_order_acquire);
. __glibcxx_assert(__b != memory_order_acq_rel);
-- line 734 ----------------------------------------
-- line 735 ----------------------------------------
. __glibcxx_assert(__b != memory_order_consume);
.
. __atomic_store_n(&_M_p, __p, int(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE __pointer_type
. load(memory_order __m = memory_order_seq_cst) const noexcept
. {
2,152,745 ( 0.00%) memory_order __b = __m & __memory_order_mask;
2,467,854 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::operator&(std::memory_order, std::__memory_order_modifier) (274,206x)
. __glibcxx_assert(__b != memory_order_release);
. __glibcxx_assert(__b != memory_order_acq_rel);
.
861,098 ( 0.00%) return __atomic_load_n(&_M_p, int(__m));
. }
.
. _GLIBCXX_ALWAYS_INLINE __pointer_type
. load(memory_order __m = memory_order_seq_cst) const volatile noexcept
. {
. memory_order __b = __m & __memory_order_mask;
. __glibcxx_assert(__b != memory_order_release);
. __glibcxx_assert(__b != memory_order_acq_rel);
-- line 755 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h
--------------------------------------------------------------------------------
Ir
-- line 66 ----------------------------------------
. return souffle::ProgramFactory::newInstance(p);
. }
. }
.
. /**
. * Relation wrapper used internally in the generated Datalog program
. */
. template <class RelType>
18 ( 0.00%) class RelationWrapper : public souffle::Relation {
10 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::Relation::~Relation() (1x)
6 ( 0.00%) => ???:0x0000000000409d50 (1x)
. public:
. static constexpr arity_type Arity = RelType::Arity;
. using TupleType = Tuple<RamDomain, Arity>;
. using AttrStrSeq = std::array<const char*, Arity>;
.
. private:
. RelType& relation;
. SouffleProgram& program;
-- line 82 ----------------------------------------
-- line 112 ----------------------------------------
. protected:
. bool equal(const iterator_base& o) const override {
. const auto& casted = asAssert<iterator_wrapper>(o);
. return it == casted.it;
. }
. };
.
. public:
10 ( 0.00%) RelationWrapper(uint32_t id, RelType& r, SouffleProgram& p, std::string name, const AttrStrSeq& t,
. const AttrStrSeq& n, arity_type numAuxAttribs)
3 ( 0.00%) : relation(r), program(p), name(std::move(name)), attrTypes(t), attrNames(n), id(id),
6 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (1x)
41 ( 0.00%) numAuxAttribs(numAuxAttribs) {}
15 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) (1x)
10 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::Relation::Relation() (1x)
.
. iterator begin() const override {
. return iterator(mk<iterator_wrapper>(id, this, relation.begin()));
. }
. iterator end() const override {
. return iterator(mk<iterator_wrapper>(id, this, relation.end()));
. }
.
-- line 131 ----------------------------------------
-- line 342 ----------------------------------------
. void printStatistics(std::ostream& /* o */) const {}
.
. private:
. std::vector<Tuple<RamDomain, Arity>> data;
. Lock insert_lock;
. };
.
. /** Equivalence relations */
60 ( 0.00%) struct t_eqrel {
34,490 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::~EquivalenceRelation() (3x)
. static constexpr Relation::arity_type Arity = 2;
. using t_tuple = Tuple<RamDomain, 2>;
. using t_ind = EquivalenceRelation<t_tuple>;
. t_ind ind;
. class iterator_0 : public std::iterator<std::forward_iterator_tag, t_tuple> {
. using nested_iterator = typename t_ind::iterator;
. nested_iterator nested;
. t_tuple value;
.
. public:
. iterator_0() = default;
22,876 ( 0.00%) iterator_0(const nested_iterator& iter) : nested(iter), value(*iter) {}
96,320 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::iterator(souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator const&) (1,204x)
8,428 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator*() const (1,204x)
. iterator_0(const iterator_0& other) = default;
. iterator_0& operator=(const iterator_0& other) = default;
91,359,520 ( 0.08%) bool operator==(const iterator_0& other) const {
91,359,520 ( 0.08%) return nested == other.nested;
347,167,982 ( 0.30%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator==(souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator const&) const (18,271,904x)
36,543,808 ( 0.03%) }
91,359,520 ( 0.08%) bool operator!=(const iterator_0& other) const {
109,631,424 ( 0.09%) return !(*this == other);
566,430,830 ( 0.48%) => ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator==(souffle::t_eqrel::iterator_0 const&) const (18,271,904x)
36,543,808 ( 0.03%) }
54,813,906 ( 0.05%) const t_tuple& operator*() const {
36,542,604 ( 0.03%) return value;
36,542,604 ( 0.03%) }
. const t_tuple* operator->() const {
. return &value;
. }
73,085,208 ( 0.06%) iterator_0& operator++() {
54,813,906 ( 0.05%) ++nested;
3,626,053,088 ( 3.09%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator++() (18,271,302x)
109,627,812 ( 0.09%) value = *nested;
127,899,114 ( 0.11%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator::operator*() const (18,271,302x)
18,271,302 ( 0.02%) return *this;
36,542,604 ( 0.03%) }
. };
. class iterator_1 : public std::iterator<std::forward_iterator_tag, t_tuple> {
. using nested_iterator = typename t_ind::iterator;
. nested_iterator nested;
. t_tuple value;
.
. public:
. iterator_1() = default;
-- line 389 ----------------------------------------
-- line 407 ----------------------------------------
. value = reorder(*nested);
. return *this;
. }
. };
. using iterator = iterator_0;
. struct context {
. t_ind::operation_hints hints;
. };
4,518 ( 0.00%) context createContext() {
. return context();
3,012 ( 0.00%) }
. bool insert(const t_tuple& t) {
. return ind.insert(t[0], t[1]);
. }
73,087,616 ( 0.06%) bool insert(const t_tuple& t, context& h) {
137,039,280 ( 0.12%) return ind.insert(t[0], t[1], h.hints);
107,894,534,143 (92.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::insert(int, int, souffle::EquivalenceRelation<std::array<int, 2ul> >::operation_hints) (9,135,952x)
401,981,888 ( 0.34%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (18,271,904x)
45,679,760 ( 0.04%) }
. bool insert(const RamDomain* ramDomain) {
. RamDomain data[2];
. std::copy(ramDomain, ramDomain + 2, data);
. const t_tuple& tuple = reinterpret_cast<const t_tuple&>(data);
. context h;
. return insert(tuple, h);
. }
. bool insert(RamDomain a1, RamDomain a2) {
. RamDomain data[2] = {a1, a2};
. return insert(data);
. }
1,505 ( 0.00%) void extend(const t_eqrel& other) {
1,505 ( 0.00%) ind.extend(other.ind);
626,708,817 ( 0.53%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::extend(souffle::EquivalenceRelation<std::array<int, 2ul> > const&) (301x)
903 ( 0.00%) }
. bool contains(const t_tuple& t) const {
. return ind.contains(t[0], t[1]);
. }
363,600 ( 0.00%) bool contains(const t_tuple& t, context& h) const {
681,750 ( 0.00%) return ind.contains(t[0], t[1]);
302,698,092 ( 0.26%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::contains(int, int) const (45,450x)
1,999,800 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (90,900x)
227,250 ( 0.00%) }
4 ( 0.00%) std::size_t size() const {
3 ( 0.00%) return ind.size();
1,189,940 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::size() const (1x)
2 ( 0.00%) }
. iterator find(const t_tuple& t) const {
. return ind.find(t);
. }
. iterator find(const t_tuple& t, context& h) const {
. return ind.find(t);
. }
. range<iterator> lowerUpperRange_10(const t_tuple& lower, const t_tuple& upper, context& h) const {
. auto r = ind.template getBoundaries<1>((lower), h.hints);
-- line 454 ----------------------------------------
-- line 469 ----------------------------------------
. range<iterator> lowerUpperRange_11(const t_tuple& lower, const t_tuple& upper, context& h) const {
. auto r = ind.template getBoundaries<2>((lower), h.hints);
. return make_range(iterator(r.begin()), iterator(r.end()));
. }
. range<iterator> lowerUpperRange_11(const t_tuple& lower, const t_tuple& upper) const {
. context h;
. return lowerUpperRange_11(lower, upper, h);
. }
2,408 ( 0.00%) bool empty() const {
3,010 ( 0.00%) return ind.size() == 0;
2,426,931 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::size() const (602x)
1,204 ( 0.00%) }
. std::vector<range<iterator>> partition() const {
. std::vector<range<iterator>> res;
. for (const auto& cur : ind.partition(10000)) {
. res.push_back(make_range(iterator(cur.begin()), iterator(cur.end())));
. }
. return res;
. }
1,208 ( 0.00%) void purge() {
906 ( 0.00%) ind.clear();
4,003,555 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::clear() (302x)
906 ( 0.00%) }
4,816 ( 0.00%) iterator begin() const {
6,020 ( 0.00%) return iterator(ind.begin());
172,990,625 ( 0.15%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::begin() const (602x)
63,812 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::iterator_0(souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator const&) (602x)
3,612 ( 0.00%) }
4,816 ( 0.00%) iterator end() const {
6,020 ( 0.00%) return iterator(ind.end());
63,812 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::iterator_0(souffle::EquivalenceRelation<std::array<int, 2ul> >::iterator const&) (602x)
36,722 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::end() const (602x)
3,612 ( 0.00%) }
. static t_tuple reorder(const t_tuple& t) {
. t_tuple res;
. res[0] = t[1];
. res[1] = t[0];
. return res;
. }
. void printStatistics(std::ostream& /* o */) const {}
. };
-- line 503 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h
--------------------------------------------------------------------------------
Ir
-- line 40 ----------------------------------------
. * @tparam SearchStrategy .. enables switching between linear, binary or any other search strategy
. * @tparam isSet .. true = set, false = multiset
. * @tparam Functor .. a std::function that is called on successful (new) insert
. */
. template <typename Key, typename Comparator,
. typename Allocator, // is ignored so far - TODO: add support
. unsigned blockSize, typename SearchStrategy, bool isSet, typename Functor,
. typename WeakComparator = Comparator, typename Updater = detail::updater<Key>>
60 ( 0.00%) class LambdaBTree : public btree<Key, Comparator, Allocator, blockSize, SearchStrategy, isSet, WeakComparator,
87 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::~btree() (3x)
. Updater> {
. public:
. using parenttype =
. btree<Key, Comparator, Allocator, blockSize, SearchStrategy, isSet, WeakComparator, Updater>;
.
36 ( 0.00%) LambdaBTree(const Comparator& comp = Comparator(), const WeakComparator& weak_comp = WeakComparator())
36 ( 0.00%) : parenttype(comp, weak_comp) {}
201 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::btree(souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >) (3x)
.
. /**
. * Inserts the given key into this tree.
. */
332,575,686 ( 0.28%) typename Functor::result_type insert(Key& k, const Functor& f) {
110,858,562 ( 0.09%) typename parenttype::operation_hints hints;
1,990,513,008 ( 1.70%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>::btree_operation_hints() (36,861,352x)
221,717,124 ( 0.19%) return insert(k, hints, f);
46,956,019,293 (40.04%) => ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&) (36,861,352x)
184,764,270 ( 0.16%) }
.
. // rewriting this because of david's changes
443,469,168 ( 0.38%) typename Functor::result_type insert(
. Key& k, typename parenttype::operation_hints& hints, const Functor& f) {
. #ifdef IS_PARALLEL
.
. // special handling for inserting first element
221,734,584 ( 0.19%) while (this->root == nullptr) {
. // try obtaining root-lock
8,428 ( 0.00%) if (!this->root_lock.try_start_write()) {
7,550 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::try_start_write() (302x)
. // somebody else was faster => re-check
. continue;
. }
.
. // check loop condition again
7,224 ( 0.00%) if (this->root != nullptr) {
. // somebody else was faster => normal insert
. this->root_lock.abort_write();
. break;
. }
.
. // create new node
9,632 ( 0.00%) this->leftmost = new typename parenttype::leaf_node();
34,730 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::leaf_node::leaf_node() (302x)
17,237 ( 0.00%) => ???:operator new(unsigned long) (302x)
3,612 ( 0.00%) this->leftmost->numElements = 1;
. // call the functor as we've successfully inserted
7,224 ( 0.00%) typename Functor::result_type res = f(k);
79,826,693 ( 0.07%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::operator()(std::pair<int, unsigned long>&) const (302x)
.
8,428 ( 0.00%) this->leftmost->keys[0] = k;
4,530 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (302x)
4,816 ( 0.00%) this->root = this->leftmost;
.
. // operation complete => we can release the root lock
4,816 ( 0.00%) this->root_lock.end_write();
3,926 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (302x)
.
9,632 ( 0.00%) hints.last_insert.access(this->leftmost);
3,322 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::access(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (302x)
.
2,408 ( 0.00%) return res;
. }
.
. // insert using iterative implementation
.
36,954,560 ( 0.03%) typename parenttype::node* cur = nullptr;
.
. // test last insert hints
147,818,240 ( 0.13%) typename parenttype::lock_type::Lease cur_lease;
368,610,500 ( 0.31%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::Lease::Lease(int) (36,861,050x)
.
776,045,760 ( 0.66%) auto checkHint = [&](typename parenttype::node* last_insert) {
. // ignore null pointer
147,818,240 ( 0.13%) if (!last_insert) return false;
. // get a read lease on indicated node
. auto hint_lease = last_insert->lock.start_read();
. // check whether it covers the key
. if (!this->weak_covers(last_insert, k)) return false;
. // and if there was no concurrent modification
. if (!last_insert->lock.validate(hint_lease)) return false;
. // use hinted location
. cur = last_insert;
. // and keep lease
. cur_lease = hint_lease;
. // we found a hit
. return true;
. };
.
258,681,920 ( 0.22%) if (hints.last_insert.any(checkHint)) {
1,548,164,100 ( 1.32%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::any<souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const (36,861,050x)
. // register this as a hit
. this->hint_stats.inserts.addHit();
. } else {
. // register this as a miss
147,818,240 ( 0.13%) this->hint_stats.inserts.addMiss();
221,166,300 ( 0.19%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::CacheAccessCounter::addMiss() (36,861,050x)
. }
.
. // if there is no valid hint ..
110,863,680 ( 0.09%) if (!cur) {
. do {
. // get root - access lock
184,772,800 ( 0.16%) auto root_lease = this->root_lock.start_read();
1,953,635,650 ( 1.67%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_read() (36,861,050x)
.
. // start with root
110,863,680 ( 0.09%) cur = this->root;
.
. // get lease of the next node to be accessed
184,772,800 ( 0.16%) cur_lease = cur->lock.start_read();
1,953,635,650 ( 1.67%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_read() (36,861,050x)
.
. // check validity of root pointer
295,636,480 ( 0.25%) if (this->root_lock.end_read(root_lease)) {
1,732,469,350 ( 1.48%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_read(souffle::OptimisticReadWriteLock::Lease const&) (36,861,050x)
36,954,560 ( 0.03%) break;
. }
.
. } while (true);
. }
.
55,966,880 ( 0.05%) while (true) {
. // handle inner nodes
371,685,760 ( 0.32%) if (cur->inner) {
174,996,570 ( 0.15%) auto a = &(cur->keys[0]);
408,325,330 ( 0.35%) auto b = &(cur->keys[cur->numElements]);
.
641,654,090 ( 0.55%) auto pos = this->search.lower_bound(k, a, b, this->weak_comp);
7,414,288,384 ( 6.32%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::lower_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const (58,329,037x)
233,328,760 ( 0.20%) auto idx = pos - a;
.
. // early exit for sets
729,958,682 ( 0.62%) if (isSet && pos != b && this->weak_equal(*pos, k)) {
2,452,036,198 ( 2.09%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::weak_equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const (47,200,029x)
. // validate results
21,287,790 ( 0.02%) if (!cur->lock.validate(cur_lease)) {
82,785,850 ( 0.07%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) (2,365,310x)
. // start over again
. return insert(k, hints, f);
. }
.
. // update provenance information
23,653,100 ( 0.02%) if (typeid(Comparator) != typeid(WeakComparator) && this->less(k, *pos)) {
66,228,680 ( 0.06%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/typeinfo:std::type_info::operator!=(std::type_info const&) const (2,365,310x)
. if (!cur->lock.try_upgrade_to_write(cur_lease)) {
. // start again
. return insert(k, hints, f);
. }
. this->update(*pos, k);
.
. // get result before releasing lock
. auto res = (*pos).second;
.
. cur->lock.end_write();
. return res;
. }
.
. // get the result before releasing lock
7,095,930 ( 0.01%) auto res = (*pos).second;
.
. // check validity
21,287,790 ( 0.02%) if (!cur->lock.validate(cur_lease)) {
82,785,850 ( 0.07%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) (2,365,310x)
. // start over again
. return insert(k, hints, f);
. }
.
. // we found the element => return the result
4,730,620 ( 0.00%) return res;
. }
.
. // get next pointer
335,801,280 ( 0.29%) auto next = cur->getChild(idx);
1,343,129,448 ( 1.15%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::getChild(unsigned long) const (55,963,727x)
.
. // get lease on next level
279,834,400 ( 0.24%) auto next_lease = next->lock.start_read();
2,966,077,531 ( 2.53%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_read() (55,963,727x)
.
. // check whether there was a write
503,701,920 ( 0.43%) if (!cur->lock.end_read(cur_lease)) {
2,630,295,169 ( 2.24%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_read(souffle::OptimisticReadWriteLock::Lease const&) (55,963,727x)
. // start over
. return insert(k, hints, f);
. }
.
. // go to next
111,933,760 ( 0.10%) cur = next;
.
. // move on lease
111,933,760 ( 0.10%) cur_lease = next_lease;
.
. continue;
. }
.
. // the rest is for leaf nodes
172,946,250 ( 0.15%) assert(!cur->inner);
.
. // -- insert node in leaf node --
.
103,767,750 ( 0.09%) auto a = &(cur->keys[0]);
242,124,750 ( 0.21%) auto b = &(cur->keys[cur->numElements]);
.
380,481,750 ( 0.32%) auto pos = this->search.upper_bound(k, a, b, this->weak_comp);
6,537,439,239 ( 5.57%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:std::pair<int, unsigned long>* souffle::detail::binary_search::upper_bound<std::pair<int, unsigned long>, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> > >(std::pair<int, unsigned long> const&, std::pair<int, unsigned long>*, std::pair<int, unsigned long>*, souffle::EqrelMapComparator<std::pair<int, unsigned long> >&) const (34,495,740x)
138,357,000 ( 0.12%) auto idx = pos - a;
.
. // early exit for sets
553,371,567 ( 0.47%) if (isSet && pos != a && this->weak_equal(*(pos - 1), k)) {
1,759,014,228 ( 1.50%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::weak_equal(std::pair<int, unsigned long> const&, std::pair<int, unsigned long> const&) const (34,494,843x)
. // validate result
310,868,010 ( 0.27%) if (!cur->lock.validate(cur_lease)) {
1,205,760,150 ( 1.03%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) (34,450,290x)
. // start over again
. return insert(k, hints, f);
. }
.
. // TODO (pnappa): remove provenance from LambdaBTree - no use for it
. // update provenance information
345,408,900 ( 0.29%) if (typeid(Comparator) != typeid(WeakComparator) && this->less(k, *(pos - 1))) {
964,608,120 ( 0.82%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/typeinfo:std::type_info::operator!=(std::type_info const&) const (34,450,290x)
. if (!cur->lock.try_upgrade_to_write(cur_lease)) {
. // start again
. return insert(k, hints, f);
. }
. this->update(*(pos - 1), k);
.
. // retrieve result before releasing lock
. auto res = (*(pos - 1)).second;
.
. cur->lock.end_write();
. return res;
. }
.
. // read result (atomic) -- just as a proof of concept, this is actually not valid!!
69,081,780 ( 0.06%) std::atomic<typename Functor::result_type>& loc =
69,081,780 ( 0.06%) *reinterpret_cast<std::atomic<typename Functor::result_type>*>(&(*(pos - 1)).second);
138,254,160 ( 0.12%) auto res = loc.load(std::memory_order_relaxed);
2,446,200 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<souffle::PiggyList<int>*>::load(std::memory_order) const (90,600x)
.
. // check validity
310,868,010 ( 0.27%) if (!cur->lock.validate(cur_lease)) {
1,205,760,150 ( 1.03%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::validate(souffle::OptimisticReadWriteLock::Lease const&) (34,450,290x)
. // start over again
. return insert(k, hints, f);
. }
.
. // we found the element => done
69,081,780 ( 0.06%) return res;
. }
.
. // upgrade to write-permission
435,240 ( 0.00%) if (!cur->lock.try_upgrade_to_write(cur_lease)) {
1,499,850 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::try_upgrade_to_write(souffle::OptimisticReadWriteLock::Lease const&) (45,450x)
. // something has changed => restart
. hints.last_insert.access(cur);
. return insert(k, hints, f);
. }
.
290,160 ( 0.00%) if (cur->numElements >= parenttype::node::maxKeys) {
. // -- lock parents --
11,216 ( 0.00%) auto priv = cur;
16,824 ( 0.00%) auto parent = priv->parent;
16,824 ( 0.00%) std::vector<typename parenttype::node*> parents;
342,088 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::vector() (5,608x)
. do {
17,464 ( 0.00%) if (parent) {
21,280 ( 0.00%) parent->lock.start_write();
180,880 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_write() (5,320x)
. while (true) {
. // check whether parent is correct
37,240 ( 0.00%) if (parent == priv->parent) {
5,320 ( 0.00%) break;
. }
. // switch parent
. parent->lock.abort_write();
. parent = priv->parent;
. parent->lock.start_write();
. }
. } else {
. // lock root lock => since cur is root
2,240 ( 0.00%) this->root_lock.start_write();
15,232 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::start_write() (448x)
. }
.
. // record locked node
28,840 ( 0.00%) parents.push_back(parent);
5,209,908 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::push_back(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (5,768x)
.
. // stop at "sphere of influence"
72,136 ( 0.00%) if (!parent || !parent->isFull()) {
47,880 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::isFull() const (5,320x)
5,608 ( 0.00%) break;
. }
.
. // go one step higher
320 ( 0.00%) priv = parent;
480 ( 0.00%) parent = parent->parent;
.
. } while (true);
.
. // split this node
16,824 ( 0.00%) auto old_root = this->root;
56,080 ( 0.00%) idx -= cur->rebalance_or_split(
14,005,113 ( 0.01%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/BTree.h:souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node::rebalance_or_split(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, souffle::OptimisticReadWriteLock&, int, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >&) (5,608x)
22,432 ( 0.00%) const_cast<typename parenttype::node**>(&this->root), this->root_lock, idx, parents);
.
. // release parent lock
235,432 ( 0.00%) for (auto it = parents.rbegin(); it != parents.rend(); ++it) {
1,206,576 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_iterator.h:bool std::operator!=<__gnu_cxx::__normal_iterator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > > >(std::reverse_iterator<__gnu_cxx::__normal_iterator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > > > const&, std::reverse_iterator<__gnu_cxx::__normal_iterator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > > > const&) (14,364x)
790,020 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::rend() (14,364x)
314,048 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::rbegin() (5,608x)
183,876 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_iterator.h:std::reverse_iterator<__gnu_cxx::__normal_iterator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > > >::operator++() (8,756x)
43,780 ( 0.00%) auto parent = *it;
332,728 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_iterator.h:std::reverse_iterator<__gnu_cxx::__normal_iterator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node**, std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> > > >::operator*() const (8,756x)
.
. // release this lock
17,512 ( 0.00%) if (parent) {
41,540 ( 0.00%) parent->lock.end_write();
108,004 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (8,308x)
. } else {
2,688 ( 0.00%) if (old_root != this->root) {
1,830 ( 0.00%) this->root_lock.end_write();
4,758 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (366x)
. } else {
328 ( 0.00%) this->root_lock.abort_write();
1,148 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::abort_write() (82x)
. }
. }
. }
.
. // insert element in right fragment
39,256 ( 0.00%) if (((typename parenttype::size_type)idx) > cur->numElements) {
. // release current lock
11,640 ( 0.00%) cur->lock.end_write();
37,830 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (2,910x)
.
. // insert in sibling
56,928 ( 0.00%) return insert(k, hints, f);
4,980,903 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)'2 (2,910x)
1,390,805 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, std::allocator<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*> >::~vector() (5,608x)
. }
. }
.
. // ok - no split necessary
227,250 ( 0.00%) assert(cur->numElements < parenttype::node::maxKeys && "Split required!");
.
. // move keys
859,938 ( 0.00%) for (int j = cur->numElements; j > idx; --j) {
1,444,768 ( 0.00%) cur->keys[j] = cur->keys[j - 1];
1,267,770 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (84,518x)
. }
.
. // insert new element
272,700 ( 0.00%) typename Functor::result_type res = f(k);
29,990,700 ( 0.03%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::function<unsigned long (std::pair<int, unsigned long>&)>::operator()(std::pair<int, unsigned long>&) const (42,540x)
409,050 ( 0.00%) cur->keys[idx] = k;
638,100 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<int, unsigned long>::operator=(std::pair<int, unsigned long> const&) (42,540x)
181,800 ( 0.00%) cur->numElements++;
.
. // release lock on current node
181,800 ( 0.00%) cur->lock.end_write();
553,020 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::OptimisticReadWriteLock::end_write() (42,540x)
.
. // remember last insertion position
227,250 ( 0.00%) hints.last_insert.access(cur);
467,940 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::access(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node* const&) (42,540x)
45,450 ( 0.00%) return res;
. }
.
. #else
. // special handling for inserting first element
. if (this->empty()) {
. // create new node
. this->leftmost = new typename parenttype::leaf_node();
. this->leftmost->numElements = 1;
-- line 371 ----------------------------------------
-- line 468 ----------------------------------------
. cur->keys[idx] = k;
. cur->numElements++;
.
. // remember last insertion position
. hints.last_insert.access(cur);
. return res;
. }
. #endif
332,601,876 ( 0.28%) }
.
. /**
. * Inserts the given range of elements into this tree.
. */
. template <typename Iter>
. void insert(const Iter& a, const Iter& b) {
. // TODO: improve this beyond a naive insert
. typename parenttype::operation_hints hints;
-- line 484 ----------------------------------------
-- line 567 ----------------------------------------
. * @tparam Comparator .. a class defining an order on the stored elements
. * @tparam Allocator .. utilized for allocating memory for required nodes
. * @tparam blockSize .. determines the number of bytes/block utilized by leaf nodes
. * @tparam SearchStrategy .. enables switching between linear, binary or any other search strategy
. */
. template <typename Key, typename Functor, typename Comparator = detail::comparator<Key>,
. typename Allocator = std::allocator<Key>, // is ignored so far
. unsigned blockSize = 256, typename SearchStrategy = typename detail::default_strategy<Key>::type>
60 ( 0.00%) class LambdaBTreeSet
117 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, souffle::PiggyList<int>*>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, std::allocator<std::pair<int, souffle::PiggyList<int>*> >, 256u, souffle::detail::binary_search, true, std::function<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&)>, souffle::EqrelMapComparator<std::pair<int, souffle::PiggyList<int>*> >, souffle::detail::updater<std::pair<int, souffle::PiggyList<int>*> > >::~LambdaBTree() (3x)
. : public detail::LambdaBTree<Key, Comparator, Allocator, blockSize, SearchStrategy, true, Functor> {
. using super = detail::LambdaBTree<Key, Comparator, Allocator, blockSize, SearchStrategy, true, Functor>;
.
. friend class detail::LambdaBTree<Key, Comparator, Allocator, blockSize, SearchStrategy, true, Functor>;
.
. public:
. /**
. * A default constructor creating an empty set.
. */
120 ( 0.00%) LambdaBTreeSet(const Comparator& comp = Comparator()) : super(comp) {}
237 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::LambdaBTree(souffle::EqrelMapComparator<std::pair<int, unsigned long> > const&, souffle::EqrelMapComparator<std::pair<int, unsigned long> > const&) (3x)
.
. /**
. * A constructor creating a set based on the given range.
. */
. template <typename Iter>
. LambdaBTreeSet(const Iter& a, const Iter& b) {
. this->insert(a, b);
. }
-- line 593 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h
--------------------------------------------------------------------------------
No information has been collected for /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/EquivalenceRelation.h
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h
--------------------------------------------------------------------------------
Ir
-- line 31 ----------------------------------------
. /**
. * A PiggyList that allows insertAt functionality.
. * This means we can't append, as we don't know the next available element.
. * insertAt is dangerous. You must be careful not to call it for the same index twice!
. */
. template <class T>
. class RandomInsertPiggyList {
. public:
285 ( 0.00%) RandomInsertPiggyList() = default;
102 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::SpinLock() (3x)
69 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<unsigned long>::atomic(unsigned long) (3x)
. // an instance where the initial size is not 65k, and instead is user settable (to a power of
. // initialbitsize)
. RandomInsertPiggyList(std::size_t initialbitsize) : BLOCKBITS(initialbitsize) {}
.
. /** copy constructor */
. RandomInsertPiggyList(const RandomInsertPiggyList& other) : BLOCKBITS(other.BLOCKBITS) {
. this->numElements.store(other.numElements.load());
.
-- line 47 ----------------------------------------
-- line 63 ----------------------------------------
.
. // move ctr
. RandomInsertPiggyList(RandomInsertPiggyList&& other) = delete;
. // copy assign ctor
. RandomInsertPiggyList& operator=(RandomInsertPiggyList& other) = delete;
. // move assign ctor
. RandomInsertPiggyList& operator=(RandomInsertPiggyList&& other) = delete;
.
12 ( 0.00%) ~RandomInsertPiggyList() {
9 ( 0.00%) freeList();
25,425 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::freeList() (3x)
9 ( 0.00%) }
.
. inline std::size_t size() const {
. return numElements.load();
. }
.
1,371,030 ( 0.00%) inline T* getBlock(std::size_t blockNum) const {
2,193,648 ( 0.00%) return blockLookupTable[blockNum];
9,323,004 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::operator int*() const (274,206x)
6,032,532 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) const (274,206x)
548,412 ( 0.00%) }
.
1,371,030 ( 0.00%) inline T& get(std::size_t index) const {
1,371,030 ( 0.00%) std::size_t nindex = index + INITIALBLOCKSIZE;
1,919,442 ( 0.00%) std::size_t blockNum = (63 - __builtin_clzll(nindex));
2,467,854 ( 0.00%) std::size_t blockInd = (nindex) & ((1 << blockNum) - 1);
3,564,678 ( 0.00%) return this->getBlock(blockNum - BLOCKBITS)[blockInd];
19,468,626 ( 0.02%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::getBlock(unsigned long) const (274,206x)
548,412 ( 0.00%) }
.
320,264 ( 0.00%) void insertAt(std::size_t index, T value) {
. // starting with an initial blocksize requires some shifting to transform into a nice powers of two
. // series
686,280 ( 0.00%) std::size_t blockNum = (63 - __builtin_clzll(index + INITIALBLOCKSIZE)) - BLOCKBITS;
.
. // allocate the block if not allocated
594,776 ( 0.00%) if (blockLookupTable[blockNum].load() == nullptr) {
1,235,304 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::load(std::memory_order) const (45,752x)
1,006,544 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) (45,752x)
1,208 ( 0.00%) slock.lock();
44,696 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::lock() (302x)
3,926 ( 0.00%) if (blockLookupTable[blockNum].load() == nullptr) {
8,154 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::load(std::memory_order) const (302x)
6,644 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) (302x)
7,248 ( 0.00%) blockLookupTable[blockNum].store(new T[INITIALBLOCKSIZE << blockNum]);
6,644 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) (302x)
63,292 ( 0.00%) => ???:operator new[](unsigned long) (302x)
9,966 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::store(int*, std::memory_order) (302x)
. }
1,208 ( 0.00%) slock.unlock();
8,758 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::unlock() (302x)
. }
.
320,264 ( 0.00%) this->get(index) = value;
5,124,224 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::get(unsigned long) const (45,752x)
. // we ALWAYS increment size, even if there was something there before (its impossible to tell!)
. // the onus is up to the user to not call this for an index twice
183,008 ( 0.00%) ++numElements;
411,768 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator++() (45,752x)
183,008 ( 0.00%) }
.
1,208 ( 0.00%) void clear() {
906 ( 0.00%) freeList();
2,604,625 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::RandomInsertPiggyList<int>::freeList() (302x)
1,510 ( 0.00%) numElements.store(0);
906 ( 0.00%) }
. const std::size_t BLOCKBITS = 16ul;
. const std::size_t INITIALBLOCKSIZE = (1ul << BLOCKBITS);
.
. // number of elements currently stored within
. std::atomic<std::size_t> numElements{0};
.
. // 2^64 - 1 elements can be stored (default initialised to nullptrs)
. static constexpr std::size_t maxContainers = 64;
-- line 121 ----------------------------------------
-- line 122 ----------------------------------------
. std::array<std::atomic<T*>, maxContainers> blockLookupTable = {};
.
. // for parallel node insertions
. mutable SpinLock slock;
.
. /**
. * Free the arrays allocated within the linked list nodes
. */
1,220 ( 0.00%) void freeList() {
1,220 ( 0.00%) slock.lock();
45,140 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::lock() (305x)
. // delete all - deleting a nullptr is a no-op
78,995 ( 0.00%) for (std::size_t i = 0; i < maxContainers; ++i) {
215,626 ( 0.00%) delete[] blockLookupTable[i].load();
429,440 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) (19,520x)
527,040 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::load(std::memory_order) const (19,520x)
51,589 ( 0.00%) => ???:operator delete[](void*) (302x)
. // reset the container within to be empty.
195,200 ( 0.00%) blockLookupTable[i].store(nullptr);
429,440 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<int*>, 64ul>::operator[](unsigned long) (19,520x)
644,160 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<int*>::store(int*, std::memory_order) (19,520x)
. }
1,220 ( 0.00%) slock.unlock();
8,845 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::unlock() (305x)
915 ( 0.00%) }
. };
.
. template <class T>
. class PiggyList {
. public:
327 ( 0.00%) PiggyList() : num_containers(0), container_size(0), m_size(0) {}
207 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<unsigned long>::atomic(unsigned long) (9x)
102 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::SpinLock() (3x)
4,510 ( 0.00%) PiggyList(std::size_t initialbitsize)
95,612 ( 0.00%) : BLOCKBITS(initialbitsize), num_containers(0), container_size(0), m_size(0) {}
62,238 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/atomic:std::atomic<unsigned long>::atomic(unsigned long) (2,706x)
30,668 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::SpinLock() (902x)
.
. /** copy constructor */
. PiggyList(const PiggyList& other) : BLOCKBITS(other.BLOCKBITS) {
. num_containers.store(other.num_containers.load());
. container_size.store(other.container_size.load());
. m_size.store(other.m_size.load());
. // copy each chunk from other into this
. // the size of the next container to allocate
-- line 155 ----------------------------------------
-- line 163 ----------------------------------------
. assert((cSize >> 1) == container_size.load());
. }
.
. /** move constructor */
. PiggyList(PiggyList&& other) = delete;
. /** copy assign ctor **/
. PiggyList& operator=(const PiggyList& other) = delete;
.
3,620 ( 0.00%) ~PiggyList() {
2,715 ( 0.00%) freeList();
879,052 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::freeList() (902x)
2,715 ( 0.00%) }
.
. /**
. * Well, returns the number of nodes exist within the list + number of nodes queued to be inserted
. * The reason for this, is that there may be many nodes queued up
. * that haven't had time to had containers created and updated
. * @return the number of nodes exist within the list + number of nodes queued to be inserted
. */
73,459,644 ( 0.06%) inline std::size_t size() const {
73,459,644 ( 0.06%) return m_size.load();
36,729,822 ( 0.03%) };
.
1,011,015,150 ( 0.86%) inline T* getBlock(std::size_t blocknum) const {
1,415,421,210 ( 1.21%) return this->blockLookupTable[blocknum];
407,968,132 ( 0.35%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int*, 64ul>::operator[](unsigned long) const (18,544,006x)
404,406,060 ( 0.34%) }
.
640,514 ( 0.00%) std::size_t append(T element) {
549,012 ( 0.00%) std::size_t new_index = m_size.fetch_add(1, std::memory_order_acquire);
.
. // will this not fit?
915,020 ( 0.00%) if (container_size < new_index + 1) {
2,379,052 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (91,502x)
16,512 ( 0.00%) sl.lock();
610,944 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::lock() (4,128x)
. // check and add as many containers as required
86,688 ( 0.00%) while (container_size < new_index + 1) {
214,656 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (8,256x)
86,688 ( 0.00%) blockLookupTable[num_containers] = new T[allocsize];
107,328 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (4,128x)
293,475 ( 0.00%) => ???:operator new[](unsigned long) (4,128x)
90,816 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int*, 64ul>::operator[](unsigned long) (4,128x)
20,640 ( 0.00%) num_containers += 1;
45,408 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator+=(unsigned long) (4,128x)
28,896 ( 0.00%) container_size += allocsize;
45,408 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator+=(unsigned long) (4,128x)
. // double the number elements that will be allocated next time
20,640 ( 0.00%) allocsize <<= 1;
. }
16,512 ( 0.00%) sl.unlock();
119,712 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::unlock() (4,128x)
. }
.
640,514 ( 0.00%) this->get(new_index) = element;
7,045,654 ( 0.01%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<int>::get(unsigned long) const (91,502x)
91,502 ( 0.00%) return new_index;
457,510 ( 0.00%) }
.
274,512 ( 0.00%) std::size_t createNode() {
274,512 ( 0.00%) std::size_t new_index = m_size.fetch_add(1, std::memory_order_acquire);
.
. // will this not fit?
457,520 ( 0.00%) if (container_size < new_index + 1) {
1,189,552 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (45,752x)
1,208 ( 0.00%) sl.lock();
44,696 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::lock() (302x)
. // check and add as many containers as required
6,342 ( 0.00%) while (container_size < new_index + 1) {
15,704 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (604x)
79,174,736 ( 0.07%) blockLookupTable[num_containers] = new T[allocsize];
7,852 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (302x)
173,113 ( 0.00%) => ???:operator new[](unsigned long) (302x)
6,644 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<unsigned long>*, 64ul>::operator[](unsigned long) (302x)
1,510 ( 0.00%) num_containers += 1;
3,322 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator+=(unsigned long) (302x)
2,114 ( 0.00%) container_size += allocsize;
3,322 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator+=(unsigned long) (302x)
. // double the number elements that will be allocated next time
1,510 ( 0.00%) allocsize <<= 1;
. }
1,208 ( 0.00%) sl.unlock();
8,758 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::unlock() (302x)
. }
.
45,752 ( 0.00%) return new_index;
228,760 ( 0.00%) }
.
. /**
. * Retrieve a reference to the stored value at index
. * @param index position to search
. * @return the value at index
. */
1,011,015,150 ( 0.86%) inline T& get(std::size_t index) const {
. // supa fast 2^16 size first block
1,011,015,150 ( 0.86%) std::size_t nindex = index + BLOCKSIZE;
1,415,421,210 ( 1.21%) std::size_t blockNum = (63 - __builtin_clzll(nindex));
1,819,827,270 ( 1.55%) std::size_t blockInd = (nindex) & ((1 << blockNum) - 1);
2,628,639,390 ( 2.24%) return this->getBlock(blockNum - BLOCKBITS)[blockInd];
6,611,724,864 ( 5.64%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::getBlock(unsigned long) const (183,659,024x)
404,406,060 ( 0.34%) }
.
. /**
. * Clear all elements from the PiggyList
. */
1,208 ( 0.00%) void clear() {
906 ( 0.00%) freeList();
136,465 ( 0.00%) => ../nixpkgs/result/bin/../include/souffle/datastructure/PiggyList.h:souffle::PiggyList<std::atomic<unsigned long> >::freeList() (302x)
1,510 ( 0.00%) m_size = 0;
9,362 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator=(unsigned long) (302x)
1,510 ( 0.00%) num_containers = 0;
9,362 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator=(unsigned long) (302x)
.
1,208 ( 0.00%) allocsize = BLOCKSIZE;
1,510 ( 0.00%) container_size = 0;
9,362 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator=(unsigned long) (302x)
906 ( 0.00%) }
.
. class iterator : std::iterator<std::forward_iterator_tag, T> {
. std::size_t cIndex = 0;
. PiggyList* bl;
.
. public:
. // default ctor, to silence
. iterator() = default;
-- line 261 ----------------------------------------
-- line 312 ----------------------------------------
. std::array<T*, max_conts> blockLookupTable = {};
.
. // for parallel node insertions
. mutable SpinLock sl;
.
. /**
. * Free the arrays allocated within the linked list nodes
. */
4,828 ( 0.00%) void freeList() {
4,828 ( 0.00%) sl.lock();
45,140 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::lock() (305x)
. // we don't know which ones are taken up!
55,163 ( 0.00%) for (std::size_t i = 0; i < num_containers; ++i) {
15,782 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator unsigned long() const (607x)
53,160 ( 0.00%) delete[] blockLookupTable[i];
46,921 ( 0.00%) => ???:operator delete[](void*) (302x)
6,644 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<std::atomic<unsigned long>*, 64ul>::operator[](unsigned long) (302x)
. }
4,828 ( 0.00%) sl.unlock();
8,845 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/ParallelUtil.h:souffle::SpinLock::unlock() (305x)
3,621 ( 0.00%) }
. };
.
. } // namespace souffle
--------------------------------------------------------------------------------
-- Auto-annotated source: /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h
--------------------------------------------------------------------------------
Ir
-- line 79 ----------------------------------------
. void* _M_object;
. const void* _M_const_object;
. void (*_M_function_pointer)();
. void (_Undefined_class::*_M_member_pointer)();
. };
.
. union [[gnu::may_alias]] _Any_data
. {
443,434,248 ( 0.38%) void* _M_access() { return &_M_pod_data[0]; }
279,924 ( 0.00%) const void* _M_access() const { return &_M_pod_data[0]; }
.
. template<typename _Tp>
. _Tp&
147,811,416 ( 0.13%) _M_access()
184,764,270 ( 0.16%) { return *static_cast<_Tp*>(_M_access()); }
221,168,112 ( 0.19%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Any_data::_M_access() (36,861,352x)
.
. template<typename _Tp>
. const _Tp&
186,616 ( 0.00%) _M_access() const
233,270 ( 0.00%) { return *static_cast<const _Tp*>(_M_access()); }
5,412 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Any_data::_M_access() const (902x)
.
. _Nocopy_types _M_unused;
. char _M_pod_data[sizeof(_Nocopy_types)];
. };
.
. enum _Manager_operation
. {
. __get_type_info,
-- line 106 ----------------------------------------
-- line 128 ----------------------------------------
. && sizeof(_Functor) <= _M_max_size
. && __alignof__(_Functor) <= _M_max_align
. && (_M_max_align % __alignof__(_Functor) == 0));
.
. typedef integral_constant<bool, __stored_locally> _Local_storage;
.
. // Retrieve a pointer to the function object
. static _Functor*
186,616 ( 0.00%) _M_get_pointer(const _Any_data& __source)
. {
. if _GLIBCXX17_CONSTEXPR (__stored_locally)
. {
186,616 ( 0.00%) const _Functor& __f = __source._M_access<_Functor>();
686,280 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1} const& std::_Any_data::_M_access<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>() const (45,752x)
139,962 ( 0.00%) return const_cast<_Functor*>(std::__addressof(__f));
274,512 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1} const* std::__addressof<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1} const>(souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1} const&) (45,752x)
. }
. else // have stored a pointer
. return __source._M_access<_Functor*>();
93,308 ( 0.00%) }
.
. // Clone a location-invariant function object that fits within
. // an _Any_data structure.
. static void
. _M_clone(_Any_data& __dest, const _Any_data& __source, true_type)
. {
. ::new (__dest._M_access()) _Functor(__source._M_access<_Functor>());
. }
-- line 153 ----------------------------------------
-- line 159 ----------------------------------------
. {
. __dest._M_access<_Functor*>() =
. new _Functor(*__source._M_access<const _Functor*>());
. }
.
. // Destroying a location-invariant object may still require
. // destruction.
. static void
147,811,416 ( 0.13%) _M_destroy(_Any_data& __victim, true_type)
. {
110,858,562 ( 0.09%) __victim._M_access<_Functor>().~_Functor();
1,372,530 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}& std::_Any_data::_M_access<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>() (91,502x)
110,858,562 ( 0.09%) }
.
. // Destroying an object located on the heap.
. static void
. _M_destroy(_Any_data& __victim, false_type)
. {
. delete __victim._M_access<_Functor*>();
. }
.
. public:
. static bool
258,669,978 ( 0.22%) _M_manager(_Any_data& __dest, const _Any_data& __source,
. _Manager_operation __op)
. {
110,858,562 ( 0.09%) switch (__op)
. {
. #if __cpp_rtti
. case __get_type_info:
. __dest._M_access<const type_info*>() = &typeid(_Functor);
. break;
. #endif
. case __get_functor_ptr:
. __dest._M_access<_Functor*>() = _M_get_pointer(__source);
. break;
.
. case __clone_functor:
. _M_clone(__dest, __source, _Local_storage());
. break;
.
. case __destroy_functor:
110,858,562 ( 0.09%) _M_destroy(__dest, _Local_storage());
2,287,550 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_destroy(std::_Any_data&, std::integral_constant<bool, true>) (91,502x)
36,952,854 ( 0.03%) break;
. }
36,952,854 ( 0.03%) return false;
110,858,562 ( 0.09%) }
.
. static void
184,764,270 ( 0.16%) _M_init_functor(_Any_data& __functor, _Functor&& __f)
406,481,394 ( 0.35%) { _M_init_functor(__functor, std::move(__f), _Local_storage()); }
3,294,072 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_init_functor(std::_Any_data&, {lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&&, std::integral_constant<bool, true>) (91,502x)
549,012 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&>::type&& std::move<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&>(std::remove_reference&&) (91,502x)
.
. template<typename _Signature>
. static bool
. _M_not_empty_function(const function<_Signature>& __f)
. { return static_cast<bool>(__f); }
.
. template<typename _Tp>
. static bool
-- line 216 ----------------------------------------
-- line 219 ----------------------------------------
.
. template<typename _Class, typename _Tp>
. static bool
. _M_not_empty_function(_Tp _Class::* __mp)
. { return __mp != nullptr; }
.
. template<typename _Tp>
. static bool
110,858,562 ( 0.09%) _M_not_empty_function(const _Tp&)
110,858,562 ( 0.09%) { return true; }
.
. private:
. static void
221,625,622 ( 0.19%) _M_init_functor(_Any_data& __functor, _Functor&& __f, true_type)
590,879,656 ( 0.50%) { ::new (__functor._M_access()) _Functor(std::move(__f)); }
640,514 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/new:operator new(unsigned long, void*) (91,502x)
549,012 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&>::type&& std::move<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&>(std::remove_reference&&) (91,502x)
549,012 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Any_data::_M_access() (91,502x)
.
. static void
. _M_init_functor(_Any_data& __functor, _Functor&& __f, false_type)
. { __functor._M_access<_Functor*>() = new _Functor(std::move(__f)); }
. };
.
295,622,832 ( 0.25%) _Function_base() : _M_manager(nullptr) { }
.
147,811,416 ( 0.13%) ~_Function_base()
. {
147,811,416 ( 0.13%) if (_M_manager)
295,622,832 ( 0.25%) _M_manager(_M_functor, _M_functor, __destroy_functor);
2,432,849,232 ( 2.07%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_handler<unsigned long (std::pair<int, unsigned long>&), souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_manager(std::_Any_data&, std::_Function_handler<unsigned long (std::pair<int, unsigned long>&), souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}> const&, std::_Manager_operation) (36,861,352x)
6,039,132 ( 0.01%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_handler<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&), souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_manager(std::_Any_data&, std::_Function_handler<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&), souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}> const&, std::_Manager_operation) (91,502x)
110,858,562 ( 0.09%) }
.
419,886 ( 0.00%) bool _M_empty() const { return !_M_manager; }
.
. typedef bool (*_Manager_type)(_Any_data&, const _Any_data&,
. _Manager_operation);
.
. _Any_data _M_functor;
. _Manager_type _M_manager;
. };
.
-- line 256 ----------------------------------------
-- line 260 ----------------------------------------
. template<typename _Res, typename _Functor, typename... _ArgTypes>
. class _Function_handler<_Res(_ArgTypes...), _Functor>
. : public _Function_base::_Base_manager<_Functor>
. {
. typedef _Function_base::_Base_manager<_Functor> _Base;
.
. public:
. static bool
258,669,978 ( 0.22%) _M_manager(_Any_data& __dest, const _Any_data& __source,
. _Manager_operation __op)
. {
221,717,124 ( 0.19%) switch (__op)
. {
. #if __cpp_rtti
. case __get_type_info:
. __dest._M_access<const type_info*>() = &typeid(_Functor);
. break;
. #endif
. case __get_functor_ptr:
. __dest._M_access<_Functor*>() = _Base::_M_get_pointer(__source);
. break;
.
. default:
221,717,124 ( 0.19%) _Base::_M_manager(__dest, __source, __op);
3,934,586 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}> const&, std::_Manager_operation) (91,502x)
. }
36,952,854 ( 0.03%) return false;
110,858,562 ( 0.09%) }
.
. static _Res
279,924 ( 0.00%) _M_invoke(const _Any_data& __functor, _ArgTypes&&... __args)
. {
466,540 ( 0.00%) return std::__invoke_r<_Res>(*_Base::_M_get_pointer(__functor),
318,096 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/invoke.h:std::enable_if<is_invocable_r_v<souffle::PiggyList<int>*, souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&, std::pair<int, souffle::PiggyList<int>*>&>, std::enable_if>::type std::__invoke_r<souffle::PiggyList<int>*, souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&, std::pair<int, souffle::PiggyList<int>*>&>(souffle::PiggyList<int>*&&, (souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}&)...) (902x)
30,668 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_get_pointer(std::_Any_data const&) (902x)
5,412 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::pair<int, souffle::PiggyList<int>*>& std::forward<std::pair<int, souffle::PiggyList<int>*>&>(std::remove_reference<std::pair<int, souffle::PiggyList<int>*>&>::type&) (902x)
. std::forward<_ArgTypes>(__args)...);
139,962 ( 0.00%) }
. };
.
. /**
. * @brief Primary class template for std::function.
. * @ingroup functors
. *
. * Polymorphic function wrapper.
. */
. template<typename _Res, typename... _ArgTypes>
369,528,540 ( 0.32%) class function<_Res(_ArgTypes...)>
3,133,214,920 ( 2.67%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::~_Function_base() (36,861,352x)
. : public _Maybe_unary_or_binary_function<_Res, _ArgTypes...>,
. private _Function_base
. {
. template<typename _Func,
. typename _Res2 = __invoke_result<_Func&, _ArgTypes...>>
. struct _Callable
. : __is_invocable_impl<_Res2, _Res>::type
. { };
-- line 311 ----------------------------------------
-- line 593 ----------------------------------------
. __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
. _M_invoker = __x._M_invoker;
. _M_manager = __x._M_manager;
. }
. }
.
. template<typename _Res, typename... _ArgTypes>
. template<typename _Functor, typename, typename>
221,625,622 ( 0.19%) function<_Res(_ArgTypes...)>::
. function(_Functor __f)
110,858,562 ( 0.09%) : _Function_base()
294,890,816 ( 0.25%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Function_base() (36,861,352x)
. {
. typedef _Function_handler<_Res(_ArgTypes...), _Functor> _My_handler;
.
184,764,270 ( 0.16%) if (_My_handler::_M_not_empty_function(__f))
221,168,112 ( 0.19%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:bool std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_not_empty_function<{lambda(std::pair<int, unsigned long>&)#1}>({lambda(std::pair<int, unsigned long>&)#1} const&) (36,861,352x)
. {
295,622,832 ( 0.25%) _My_handler::_M_init_functor(_M_functor, std::move(__f));
2,322,265,176 ( 1.98%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_Base_manager<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}>::_M_init_functor(std::_Any_data&, {lambda(std::pair<int, unsigned long>&)#1}&&) (36,861,352x)
221,168,112 ( 0.19%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}&>::type&& std::move<souffle::SparseDisjointSet<int>::toDense(int)::{lambda(std::pair<int, unsigned long>&)#1}&>(std::remove_reference&&) (36,861,352x)
110,858,562 ( 0.09%) _M_invoker = &_My_handler::_M_invoke;
110,858,562 ( 0.09%) _M_manager = &_My_handler::_M_manager;
. }
184,764,270 ( 0.16%) }
.
. template<typename _Res, typename... _ArgTypes>
. _Res
279,924 ( 0.00%) function<_Res(_ArgTypes...)>::
. operator()(_ArgTypes... __args) const
. {
233,270 ( 0.00%) if (_M_empty())
8,118 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_base::_M_empty() const (902x)
. __throw_bad_function_call();
466,540 ( 0.00%) return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
371,314 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/std_function.h:std::_Function_handler<souffle::PiggyList<int>* (std::pair<int, souffle::PiggyList<int>*>&), souffle::EquivalenceRelation<std::array<int, 2ul> >::genAllDisjointSetLists() const::{lambda(std::pair<int, souffle::PiggyList<int>*>&)#1}>::_M_invoke(std::_Any_data const&, std::pair<int, souffle::PiggyList<int>*>&) (902x)
5,412 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::pair<int, souffle::PiggyList<int>*>& std::forward<std::pair<int, souffle::PiggyList<int>*>&>(std::remove_reference<std::pair<int, souffle::PiggyList<int>*>&>::type&) (902x)
139,962 ( 0.00%) }
.
. #if __cpp_rtti
. template<typename _Res, typename... _ArgTypes>
. const type_info&
. function<_Res(_ArgTypes...)>::
. target_type() const noexcept
. {
. if (_M_manager)
-- line 631 ----------------------------------------
--------------------------------------------------------------------------------
-- User-annotated source: ./test.cpp
--------------------------------------------------------------------------------
No information has been collected for ./test.cpp
--------------------------------------------------------------------------------
-- Auto-annotated source: /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array
--------------------------------------------------------------------------------
Ir
-- line 47 ----------------------------------------
. template<typename _Tp, std::size_t _Nm>
. struct __array_traits
. {
. typedef _Tp _Type[_Nm];
. typedef __is_swappable<_Tp> _Is_swappable;
. typedef __is_nothrow_swappable<_Tp> _Is_nothrow_swappable;
.
. static constexpr _Tp&
1,104,265,420 ( 0.94%) _S_ref(const _Type& __t, std::size_t __n) noexcept
1,656,398,130 ( 1.41%) { return const_cast<_Tp&>(__t[__n]); }
.
. static constexpr _Tp*
. _S_ptr(const _Type& __t) noexcept
. { return const_cast<_Tp*>(__t); }
. };
.
. template<typename _Tp>
. struct __array_traits<_Tp, 0>
-- line 64 ----------------------------------------
-- line 177 ----------------------------------------
. constexpr size_type
. max_size() const noexcept { return _Nm; }
.
. _GLIBCXX_NODISCARD constexpr bool
. empty() const noexcept { return size() == 0; }
.
. // Element access.
. _GLIBCXX17_CONSTEXPR reference
92,733,800 ( 0.08%) operator[](size_type __n) noexcept
129,827,320 ( 0.11%) { return _AT_Type::_S_ref(_M_elems, __n); }
82,560 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::__array_traits<int*, 64ul>::_S_ref(int* const (&) [64], unsigned long) (8,256x)
.
. constexpr const_reference
1,287,597,975 ( 1.10%) operator[](size_type __n) const noexcept
1,802,637,165 ( 1.54%) { return _AT_Type::_S_ref(_M_elems, __n); }
185,440,060 ( 0.16%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::__array_traits<int*, 64ul>::_S_ref(int* const (&) [64], unsigned long) (18,544,006x)
.
. _GLIBCXX17_CONSTEXPR reference
. at(size_type __n)
. {
. if (__n >= _Nm)
. std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) "
. ">= _Nm (which is %zu)"),
. __n, _Nm);
-- line 198 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: test.cpp
--------------------------------------------------------------------------------
Ir
-- line 31 ----------------------------------------
. std::cerr << str << "\"," << (int32_t)idx << "," << (int32_t)len
. << ") functor.\n";
. }
. return result;
. }
.
. public:
. // -- initialize symbol table --
9 ( 0.00%) SymbolTable symTable; // -- initialize record table --
91 ( 0.00%) RecordTable recordTable;
84,946 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RecordTable.h:souffle::SpecializedRecordTable<0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul, 7ul, 8ul, 9ul, 10ul, 11ul, 12ul>::SpecializedRecordTable() (1x)
5,525 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SymbolTable.h:souffle::SymbolTable::SymbolTable(unsigned long) (1x)
5,520 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/utility/Types.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> > souffle::mk<souffle::t_eqrel, souffle::t_eqrel>() (3x)
209 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/basic_string.h:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&) (1x)
364 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::SouffleProgram() (1x)
95 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SignalHandler.h:souffle::SignalHandler::instance() (1x)
85 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::RelationWrapper<souffle::t_eqrel>::RelationWrapper(unsigned int, souffle::t_eqrel&, souffle::SouffleProgram&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::array<char const*, 2ul> const&, std::array<char const*, 2ul> const&, unsigned int) (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (1x)
6 ( 0.00%) => ???:0x0000000000409d50 (1x)
10 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string() (2x)
1 ( 0.00%) => ???:std::allocator<char>::~allocator() (1x)
1 ( 0.00%) => ???:std::allocator<char>::allocator() (1x)
. // -- Table: e
26 ( 0.00%) Own<t_eqrel> rel_1_e = mk<t_eqrel>();
3,586 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::addRelation(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, souffle::Relation&, bool, bool) (1x)
209 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/basic_string.h:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&) (1x)
6 ( 0.00%) => ???:0x0000000000409d50 (1x)
1 ( 0.00%) => ???:std::allocator<char>::~allocator() (1x)
1 ( 0.00%) => ???:std::allocator<char>::allocator() (1x)
9 ( 0.00%) souffle::RelationWrapper<t_eqrel> wrapper_rel_1_e;
43 ( 0.00%) // -- Table: @delta_e
37,899 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RecordTable.h:souffle::SpecializedRecordTable<0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul, 7ul, 8ul, 9ul, 10ul, 11ul, 12ul>::~SpecializedRecordTable() (1x)
35,405 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::~unique_ptr() (3x)
2,885 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SymbolTable.h:souffle::SymbolTable::~SymbolTable() (1x)
1,186 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::~SouffleProgram() (1x)
34 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::RelationWrapper<souffle::t_eqrel>::~RelationWrapper() (1x)
12 ( 0.00%) => ???:0x0000000000409d50 (2x)
3 ( 0.00%) Own<t_eqrel> rel_2_delta_e = mk<t_eqrel>();
. // -- Table: @new_e
. Own<t_eqrel> rel_3_new_e = mk<t_eqrel>();
.
. public:
. Sf_test()
. : wrapper_rel_1_e(0, *rel_1_e, *this, "e",
. std::array<const char *, 2>{{"i:number", "i:number"}},
. std::array<const char *, 2>{{"x", "y"}}, 0) {
. addRelation("e", wrapper_rel_1_e, false, true);
12 ( 0.00%) }
. ~Sf_test() {}
.
10 ( 0.00%) private:
24 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) (1x)
6 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (1x)
10 ( 0.00%) std::string inputDirectory;
24 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&) (1x)
6 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/move.h:std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (1x)
3 ( 0.00%) std::string outputDirectory;
. SignalHandler *signalHandler{SignalHandler::instance()};
. std::atomic<RamDomain> ctr{};
. std::atomic<std::size_t> iter{};
. bool performIO = false;
13 ( 0.00%)
293 ( 0.00%) => ???:omp_set_num_threads (1x)
14 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::getNumThreads() (2x)
. void runFunction(std::string inputDirectoryArg = "",
. std::string outputDirectoryArg = "",
4 ( 0.00%) bool performIOArg = false) {
1,279 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SignalHandler.h:souffle::SignalHandler::set() (1x)
. this->inputDirectory = std::move(inputDirectoryArg);
. this->outputDirectory = std::move(outputDirectoryArg);
12 ( 0.00%) this->performIO = performIOArg;
244 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<int, std::allocator<int> >::~vector() (2x)
122 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_vector.h:std::vector<int, std::allocator<int> >::vector() (2x)
6 ( 0.00%)
117,269,399,373 (100.0%) => test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&) (1x)
. // set default threads (in embedded mode)
. // if this is not set, and omp is used, the default omp setting of number of
. // cores is used.
4 ( 0.00%) #if defined(_OPENMP)
379 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SignalHandler.h:souffle::SignalHandler::reset() (1x)
7 ( 0.00%) if (0 < getNumThreads()) {
. omp_set_num_threads(getNumThreads());
. }
. #endif
34 ( 0.00%)
117,269,401,845 (100.0%) => test.cpp:souffle::Sf_test::runFunction(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool) (1x)
70 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (2x)
12 ( 0.00%) => ???:0x0000000000409d50 (2x)
7 ( 0.00%) signalHandler->set();
. // -- query evaluation --
. {
. std::vector<RamDomain> args, ret;
. subroutine_0(args, ret);
. }
.
. // -- relation hint statistics --
. signalHandler->reset();
-- line 90 ----------------------------------------
-- line 104 ----------------------------------------
. try {
. std::map<std::string, std::string> directiveMap(
. {{"IO", "stdoutprintsize"},
. {"attributeNames", "x\ty"},
. {"auxArity", "0"},
. {"name", "e"},
. {"operation", "printsize"},
. {"params", "{\"records\": {}, \"relation\": {\"arity\": 2, "
6 ( 0.00%) "\"params\": [\"x\", \"y\"]}}"},
5 ( 0.00%) {"types",
10 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::setNumThreads(unsigned long) (1x)
8 ( 0.00%) "{\"ADTs\": {}, \"records\": {}, \"relation\": {\"arity\": 2, "
2,547 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SymbolTable.h:souffle::SymbolTable::setNumLanes(unsigned long) (1x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::getNumThreads() (1x)
8 ( 0.00%) "\"types\": [\"i:number\", \"i:number\"]}}"}});
33,916 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RecordTable.h:souffle::SpecializedRecordTable<0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul, 7ul, 8ul, 9ul, 10ul, 11ul, 12ul>::setNumLanes(unsigned long) (1x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SouffleInterface.h:souffle::SouffleProgram::getNumThreads() (1x)
4 ( 0.00%) if (!outputDirectoryArg.empty()) {
. directiveMap["output-dir"] = outputDirectoryArg;
. }
. IOSystem::getInstance()
. .getWriter(directiveMap, symTable, recordTable)
. ->writeAll(*rel_1_e);
. } catch (std::exception &e) {
. std::cerr << e.what();
. exit(1);
. }
12 ( 0.00%) }
5 ( 0.00%)
68 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SignalHandler.h:souffle::SignalHandler::setMsg(char const*) (1x)
. public:
7 ( 0.00%) void loadAll(std::string inputDirectoryArg = "") override {}
9 ( 0.00%)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
5 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (1x)
6 ( 0.00%) public:
30 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RamTypes.h:int souffle::ramBitCast<int, int>(int) (2x)
9 ( 0.00%) void dumpInputs() override {}
271,326 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&) (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
6 ( 0.00%)
17 ( 0.00%) public:
592 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::extend(souffle::t_eqrel const&) (1x)
271,520 ( 0.00%) => test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#1}::operator()() const (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (1x)
7 ( 0.00%) void dumpOutputs() override {
13 ( 0.00%) try {
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
5 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (1x)
5 ( 0.00%) std::map<std::string, std::string> rwOperation;
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
5 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (1x)
36 ( 0.00%) rwOperation["IO"] = "stdout";
4,728 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::begin() const (1x)
317 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator++() (1x)
191 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::end() const (1x)
91 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator!=(souffle::t_eqrel::iterator_0 const&) const (2x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (1x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator*() const (1x)
16 ( 0.00%) rwOperation["name"] = "e";
44 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (2x)
30 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RamTypes.h:int souffle::ramBitCast<int, int>(int) (2x)
9 ( 0.00%) rwOperation["types"] = "{\"relation\": {\"arity\": 2, \"auxArity\": 0, "
266,899 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&) (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
. "\"types\": [\"i:number\", \"i:number\"]}}";
6 ( 0.00%) IOSystem::getInstance()
10 ( 0.00%) .getWriter(rwOperation, symTable, recordTable)
272,653 ( 0.00%) => test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#2}::operator()() const (1x)
31 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator=(unsigned long) (1x)
. ->writeAll(*rel_1_e);
1,505 ( 0.00%) } catch (std::exception &e) {
20,468 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/SignalHandler.h:souffle::SignalHandler::setMsg(char const*) (301x)
. std::cerr << e.what();
. exit(1);
. }
2,709 ( 0.00%) }
239,043 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::empty() const (301x)
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (301x)
2,709 ( 0.00%)
95,413 ( 0.00%) public:
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (301x)
1,505 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (301x)
1,505 ( 0.00%) SymbolTable &getSymbolTable() override { return symTable; }
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (301x)
1,505 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (301x)
1,505 ( 0.00%) RecordTable &getRecordTable() override { return recordTable; }
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (301x)
1,505 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (301x)
137,041,086 ( 0.12%) void setNumThreads(std::size_t numThreadsValue) override {
2,023,146,517 ( 1.73%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator++() (9,135,651x)
401,982,791 ( 0.34%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator!=(souffle::t_eqrel::iterator_0 const&) const (9,135,952x)
63,949,557 ( 0.05%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator*() const (9,135,651x)
242,907 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::begin() const (301x)
57,491 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::end() const (301x)
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (301x)
184,804,032 ( 0.16%) SouffleProgram::setNumThreads(numThreadsValue);
404,968,366 ( 0.35%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (18,407,653x)
305,970,492 ( 0.26%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::contains(std::array<int, 2ul> const&, souffle::t_eqrel::context&) const (45,450x)
278,160,060 ( 0.24%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RamTypes.h:int souffle::ramBitCast<int, int>(int) (18,544,004x)
2,772,450 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (45,450x)
6,600 ( 0.00%) symTable.setNumLanes(getNumThreads());
13,200 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (600x)
18,000 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RamTypes.h:int souffle::ramBitCast<int, int>(int) (1,200x)
2,700 ( 0.00%) recordTable.setNumLanes(getNumThreads());
80,582,461 ( 0.07%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&) (300x)
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (300x)
. }
. void executeSubroutine(std::string name, const std::vector<RamDomain> &args,
2,709 ( 0.00%) std::vector<RamDomain> &ret) override {
1,505 ( 0.00%) if (name == "stratum_0") {
3,883,918,810 ( 3.31%) => test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#3}::operator()() const (301x)
2,409 ( 0.00%) subroutine_0(args, ret);
2,194,510 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::empty() const (301x)
18,361 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (301x)
3,600 ( 0.00%) return;
626,712,138 ( 0.53%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::extend(souffle::t_eqrel const&) (300x)
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (300x)
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (300x)
2,100 ( 0.00%) }
18,274,600 ( 0.02%) fatal("unknown subroutine");
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (300x)
1,500 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (300x)
1,500 ( 0.00%) }
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (300x)
1,500 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::createContext() (300x)
137,041,050 ( 0.12%) #ifdef _MSC_VER
2,023,146,200 ( 1.73%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator++() (9,135,650x)
401,982,700 ( 0.34%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator!=(souffle::t_eqrel::iterator_0 const&) const (9,135,950x)
172,821,250 ( 0.15%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::begin() const (300x)
63,949,550 ( 0.05%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::iterator_0::operator*() const (9,135,650x)
57,300 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::end() const (300x)
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (300x)
146,170,400 ( 0.12%) #pragma warning(disable : 4100)
401,968,600 ( 0.34%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/array:std::array<int, 2ul>::operator[](unsigned long) const (18,271,300x)
274,069,500 ( 0.23%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/RamTypes.h:int souffle::ramBitCast<int, int>(int) (18,271,300x)
82,220,850 ( 0.07%) #endif // _MSC_VER
108,471,202,001 (92.49%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::insert(std::array<int, 2ul> const&, souffle::t_eqrel::context&) (9,135,650x)
557,274,650 ( 0.48%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (9,135,650x)
. void subroutine_0(const std::vector<RamDomain> &args,
1,800 ( 0.00%) std::vector<RamDomain> &ret) {
3,600 ( 0.00%) signalHandler->setMsg(R"_(e(0,0).
112,750,241,951 (96.14%) => test.cpp:souffle::Sf_test::subroutine_0(std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> >&)::{lambda()#4}::operator()() const (300x)
94,200 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::enable_if<std::__is_swappable<std::default_delete<souffle::t_eqrel> >::value, void>::type std::swap<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >(std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >&, std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >&) (300x)
1,800 ( 0.00%) in file /home/siddharthist/code/mate/test.dl [3:1-3:9])_");
3,981,202 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::purge() (300x)
18,300 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (300x)
1,500 ( 0.00%) [&]() {
4,500 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator++(int) (300x)
300 ( 0.00%) CREATE_OP_CONTEXT(rel_1_e_op_ctxt, rel_1_e->createContext());
5 ( 0.00%) Tuple<RamDomain, 2> tuple{
31 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/atomic_base.h:std::__atomic_base<unsigned long>::operator=(unsigned long) (1x)
6 ( 0.00%) {ramBitCast(RamSigned(0)), ramBitCast(RamSigned(0))}};
16,095 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::purge() (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
6 ( 0.00%) rel_1_e->insert(tuple, READ_OP_CONTEXT(rel_1_e_op_ctxt));
9,278 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledSouffle.h:souffle::t_eqrel::purge() (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator->() const (1x)
4 ( 0.00%) }();
119 ( 0.00%) rel_1_e->extend(*rel_2_delta_e);
8,130 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_map.h:std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::map(std::initializer_list<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) (1x)
2,496 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_map.h:std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::~map() (1x)
632 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [6], char const (&) [89], true>(char const (&) [6], char const (&) [89]) (1x)
614 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [7], char const (&) [64], true>(char const (&) [7], char const (&) [64]) (1x)
518 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [10], char const (&) [10], true>(char const (&) [10], char const (&) [10]) (1x)
518 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [15], char const (&) [4], true>(char const (&) [15], char const (&) [4]) (1x)
510 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [3], char const (&) [16], true>(char const (&) [3], char const (&) [16]) (1x)
503 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [5], char const (&) [2], true>(char const (&) [5], char const (&) [2]) (1x)
501 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pair<char const (&) [9], char const (&) [2], true>(char const (&) [9], char const (&) [2]) (1x)
362 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/stl_pair.h:std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::~pair() (7x)
16 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/allocator.h:std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::~allocator() (1x)
16 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/allocator.h:std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::allocator() (1x)
8 ( 0.00%) [&]() {
3 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::empty() const (1x)
25 ( 0.00%) CREATE_OP_CONTEXT(rel_1_e_op_ctxt, rel_1_e->createContext());
1,191,989 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/io/WriteStream.h:void souffle::WriteStream::writeAll<souffle::t_eqrel>(souffle::t_eqrel const&) (1x)
54,999 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/io/IOSystem.h:souffle::IOSystem::getWriter(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&, souffle::SymbolTable const&, souffle::SpecializedRecordTable<0ul, 1ul, 2ul, 3ul, 4ul, 5ul, 6ul, 7ul, 8ul, 9ul, 10ul, 11ul, 12ul> const&) const (1x)
41,959 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/io/IOSystem.h:souffle::IOSystem::getInstance() (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::t_eqrel, std::default_delete<souffle::t_eqrel> >::operator*() const (1x)
7,373 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::WriteStream, std::default_delete<souffle::WriteStream> >::~unique_ptr() (1x)
61 ( 0.00%) => /nix/store/dlni53myj53kx20pi4yhm7p68lw17b07-gcc-10.3.0/include/c++/10.3.0/bits/unique_ptr.h:std::unique_ptr<souffle::WriteStream, std::default_delete<souffle::WriteStream> >::operator->() const (1x)
. CREATE_OP_CONTEXT(rel_2_delta_e_op_ctxt, rel_2_delta_e->createContext());
. for (const auto &env0 : *rel_1_e) {
11 ( 0.00%) Tuple<RamDomain, 2> tuple{{ramBitCast(env0[0]), ramBitCast(env0[1])}};
. rel_2_delta_e->insert(tuple, READ_OP_CONTEXT(rel_2_delta_e_op_ctxt));
. }
. }();
. iter = 0;
. for (;;) {
. signalHandler->setMsg(R"_(e(x,(x+1)) :-
. x < 300,
. e(x,x).
-- line 193 ----------------------------------------
-- line 200 ----------------------------------------
. rel_2_delta_e->createContext());
. for (const auto &env0 : *rel_2_delta_e) {
. if ((ramBitCast<RamDomain>(env0[0]) ==
. ramBitCast<RamDomain>(env0[1])) &&
. (ramBitCast<RamSigned>(env0[0]) <
. ramBitCast<RamSigned>(RamSigned(300))) &&
. !(rel_1_e->contains(
. Tuple<RamDomain, 2>{
14 ( 0.00%) {ramBitCast(env0[0]),
. ramBitCast((ramBitCast<RamSigned>(env0[0]) +
. ramBitCast<RamSigned>(RamSigned(1))))}},
. READ_OP_CONTEXT(rel_1_e_op_ctxt)))) {
. Tuple<RamDomain, 2> tuple{
. {ramBitCast(env0[0]),
. ramBitCast((ramBitCast<RamSigned>(env0[0]) +
14 ( 0.00%) ramBitCast<RamSigned>(RamSigned(1))))}};
941 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::CmdOptions(char const*, char const*, char const*, bool, char const*, unsigned long) (1x)
46 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::~CmdOptions() (1x)
9 ( 0.00%) rel_3_new_e->insert(tuple, READ_OP_CONTEXT(rel_3_new_e_op_ctxt));
1,594 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::parse(int, char**) (1x)
6 ( 0.00%) }
100,761 ( 0.00%) => test.cpp:souffle::Sf_test::Sf_test() (1x)
77,467 ( 0.00%) => test.cpp:souffle::Sf_test::~Sf_test() (1x)
. }
8 ( 0.00%) }();
36,518 ( 0.00%) => test.cpp:souffle::Sf_test::setNumThreads(unsigned long) (1x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::getNumJobs() const (1x)
. }
. if (rel_3_new_e->empty())
30 ( 0.00%) break;
117,269,401,968 (100.0%) => test.cpp:souffle::Sf_test::runAll(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) (1x)
70 ( 0.00%) => ???:std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (2x)
12 ( 0.00%) => ???:0x0000000000409d50 (2x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::getOutputFileDir[abi:cxx11]() const (1x)
7 ( 0.00%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/CompiledOptions.h:souffle::CmdOptions::getInputFileDir[abi:cxx11]() const (1x)
1 ( 0.00%) rel_3_new_e->extend(*rel_1_e);
. [&]() {
44 ( 0.00%) CREATE_OP_CONTEXT(rel_3_new_e_op_ctxt, rel_3_new_e->createContext());
97,863 ( 0.00%) => test.cpp:__static_initialization_and_destruction_0(int, int) (1x)
. CREATE_OP_CONTEXT(rel_1_e_op_ctxt, rel_1_e->createContext());
. for (const auto &env0 : *rel_3_new_e) {
. Tuple<RamDomain, 2> tuple{{ramBitCast(env0[0]), ramBitCast(env0[1])}};
. rel_1_e->insert(tuple, READ_OP_CONTEXT(rel_1_e_op_ctxt));
. }
. }();
. std::swap(rel_2_delta_e, rel_3_new_e);
. rel_3_new_e->purge();
-- line 233 ----------------------------------------
--------------------------------------------------------------------------------
-- Auto-annotated source: ../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h
--------------------------------------------------------------------------------
Ir
-- line 149 ----------------------------------------
. // a specialization for a single-entry cache
. template <typename T>
. class LRUCache<T, 1> {
. // the single entry in this cache
. T entry;
.
. public:
. // creates a new, empty cache
1,771,565,024 ( 1.51%) LRUCache() : entry() {}
.
. // creates a new, empty cache storing the given value
. LRUCache(const T& val) : entry(val) {}
.
. // clears the content of this cache
. void clear(const T& val = T()) {
. entry = val;
. }
.
. // registers an access to the given element
73,819,608 ( 0.06%) void access(const T& val) {
73,819,608 ( 0.06%) entry = val;
55,364,706 ( 0.05%) }
.
. /**
. * See description in most general case.
. */
. template <typename Op>
276,814,040 ( 0.24%) bool forEachInOrder(const Op& op) const {
332,176,848 ( 0.28%) return op(entry);
626,687,320 ( 0.53%) => /home/siddharthist/code/mate/../nixpkgs/result/bin/../include/souffle/datastructure/LambdaBTree.h:souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}::operator()(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*) const (36,863,960x)
110,725,616 ( 0.09%) }
.
. // equivalent to forEachInOrder
. template <typename Op>
276,814,040 ( 0.24%) bool any(const Op& op) const {
276,814,040 ( 0.24%) return forEachInOrder(op);
1,105,918,800 ( 0.94%) => ../nixpkgs/result/bin/../include/souffle/utility/CacheUtil.h:bool souffle::LRUCache<souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*, 1u>::forEachInOrder<souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1}>(souffle::detail::LambdaBTree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, std::function<unsigned long (std::pair<int, unsigned long>&)>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::insert(std::pair<int, unsigned long>&, souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::btree_operation_hints<1u>&, std::function<unsigned long (std::pair<int, unsigned long>&)> const&)::{lambda(souffle::detail::btree<std::pair<int, unsigned long>, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, std::allocator<std::pair<int, unsigned long> >, 256u, souffle::detail::binary_search, true, souffle::EqrelMapComparator<std::pair<int, unsigned long> >, souffle::detail::updater<std::pair<int, unsigned long> > >::node*)#1} const&) const (36,863,960x)
110,725,616 ( 0.09%) }
.
. // --- print support ---
.
. friend std::ostream& operator<<(std::ostream& out, const LRUCache& cache) {
. return out << cache.entry;
. }
. };
.
-- line 192 ----------------------------------------
-- line 269 ----------------------------------------
.
. #else
.
. class CacheAccessCounter {
. public:
. CacheAccessCounter() = default;
. CacheAccessCounter(const CacheAccessCounter& /* other */) = default;
. inline void addHit() {}
332,176,848 ( 0.28%) inline void addMiss() {}
. inline std::size_t getHits() {
. return 0;
. }
. inline std::size_t getMisses() {
. return 0;
. }
. inline std::size_t getAccesses() {
. return 0;
-- line 285 ----------------------------------------
--------------------------------------------------------------------------------
The following files chosen for auto-annotation could not be found:
--------------------------------------------------------------------------------
/build/glibc-2.33/csu/../sysdeps/x86_64/start.S
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
113,656,873,267 (96.91%) events annotated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment